วิธีแบ่งครึ่ง
บทความนี้ไม่มีการอ้างอิงจากแหล่งที่มาใด |
บทความนี้หรือส่วนนี้ของบทความต้องการปรับรูปแบบ ซึ่งอาจหมายถึง ต้องการจัดรูปแบบข้อความ จัดหน้า แบ่งหัวข้อ จัดลิงก์ภายใน และ/หรือการจัดระเบียบอื่น ๆ คุณสามารถช่วยแก้ไขปัญหานี้ได้โดยการกดที่ปุ่ม แก้ไข ด้านบน จากนั้นปรับปรุงหรือจัดรูปแบบอื่น ๆ ในบทความให้เหมาะสม |
การแบ่งครึ่งช่วง (อังกฤษ: Bisection method) คือการแบ่งออกเป็นสองส่วนเท่ากันในคณิตศาสตร์เป็นวิธีการหารากที่ซ้ำ ๆ การแบ่งออกเป็นสองส่วนเท่ากันช่วงเวลาและจากนั้นเลือกช่วงย่อยซึ่งรากต้องอยู่ในแนวแกน X สำหรับการประมวลผลต่อไป เป็นวิธีที่ง่ายและมีประสิทธิภาพ แต่ยังค่อนข้างช้า ด้วยเหตุนี้มันจึงมักใช้เพื่อหาแนวทางในการแก้ปัญหาโดยประมาณซึ่งใช้เป็นจุดเริ่มต้นของวิธีการบรรจบกันอย่างรวดเร็วมากขึ้น วิธีการนี้เรียกว่าวิธีการลดช่วงเวลา วิธีการค้นหาแบบไบนารี
กระบวนการ
[แก้]การเตรียมฟังก์ชัน : จัดรูปให้ฟังก์ชันอยู่ในรูป f(x) = 0
ลำดับที่ 1: ทำการเดาจุดสองจุดคือค่า Xl และค่า Xuสมมุติว่าค่า Xl เป็นค่าที่ต่ำกว่าจากนั้นทดสอบว่า f(Xl) f(Xu) < 0 ถ้าไม่ใช้ให้หาจุดใหม่ซึ่งจากขั้นตอนนี้ เรารู้ว่ารากจะต้องอยู่ในช่วงนี้
ลำดับที่ 2: ทําการประมาณค่า Root ที่ต้องการที่จุดกึ่งกลางระหว่างสองค่าใน Step 1 โดยคํานวณ
ลำดับที่ 3: หาว่าตอนนี้ Root ที่ต้องการอยู่ในครึ่งไหนดังนี้
3.1) ถ้า f(Xl) f(Xr) < 0 แสดงว่า Root ที่ต้องการอยู่ในครึ่งล่าง ให้ตั้ง Xu= Xr และกลับไปทํา ลำดับที่ 2
3.2) ถ้า f(Xl) f(Xr) > 0 แสดงว่า Root ที่ต้องการอยู่ในครึ่งบน ให้ตั้ง Xl = Xr และกลับไปทํา ลำดับที่ 2
3.3) ถ้า f(Xl) f(Xr) = 0 แสดงว่าคําตอบที่ต้องการเท่ากับ X
อัลกอริทึม
[แก้]จากกระบวนการ จะสามารถเขียนเป็นภาษาโปรแกรมไพทอนได้ดังนี้
# มีรากเดียว
def fn(x):
return x**3 + 5*x - 9
# กำหนดวิธีการแบ่งช่วง
def bisection( eq, segment, app = 0.3 ):
a, b = segment['a'], segment['b']
Fa, Fb = eq(a), eq(b)
if Fa * Fb > 0:
raise Exception('No change of sign - bisection not possible')
while( b - a > app ):
x = ( a + b ) / 2.0
f = eq(x)
if f * Fa > 0: a = x
else: b = x
return x
#test
print(bisection(fn, {'a':0,'b':5}, 0.00003)) # => 1.32974624634
ตัวอย่าง: การหารากของพหุนาม
[แก้]สมมติว่ามีการใช้วิธีการแบ่งครึ่งช่วง เพื่อหารากของพหุนาม
ประการแรกต้องใช้ตัวเลขสองตัว a และ b เพื่อให้ f(a) และ f(b) มีสัญญาณตรงกันข้าม สำหรับฟังก์ชันข้างต้น a = 1 และ b = 2
เป็นไปตามเกณฑ์นี้เช่น
และ
เนื่องจากฟังก์ชันเป็นแบบต่อเนื่องต้องมีรากภายในช่วง [1, 2] ในจุดเริ่มต้นจุดสิ้นสุดของช่วงที่วงเล็บรากเป็น a1 = 1 และ b1 = 2 ดังนั้นจุดกึ่งกลางคือ
ค่าฟังก์ชันที่จุดกึ่งกลางคือ f(c1) = (1.5)3 - (1.5) - 2 = -0.125 เนื่องจาก f(c1) เป็นค่าลบ a = 1 จะถูกแทนที่ด้วย a = 1.5 สำหรับการทำซ้ำถัดไปเพื่อให้แน่ใจว่า f(a) และ f(b) มีสัญญาณที่ตรงกันข้าม เช่นนี้ยังคงช่วงระหว่าง a และ b จะกลายเป็นเล็กมากขึ้นบรรจบกับรากของฟังก์ชัน ดูสิ่งนี้เกิดขึ้นในตารางด้านล่าง