วิธีการแบ่งส่วน - คืออะไร อัลกอริทึม และตัวอย่าง

วิธีแบ่งส่วนคืออะไร?

วิธีการแบ่งครึ่งเป็นวิธีการแก้ปัญหาเชิงตัวเลขพื้นฐานวิธีหนึ่งในการหาค่ารากของสมการพหุนาม โดยจะใส่เครื่องหมายวงเล็บในช่วงที่ค่ารากของสมการอยู่ แล้วแบ่งค่ารากเหล่านั้นออกเป็นสองส่วนในแต่ละรอบจนกว่าจะหาค่ารากได้ ดังนั้น วิธีการแบ่งครึ่งจึงเรียกอีกอย่างหนึ่งว่าวิธีการใส่เครื่องหมายวงเล็บ

อย่างไรก็ตาม เนื่องจากกลไกการทำงานนั้นคล้ายคลึงกับอัลกอริทึมการค้นหาแบบไบนารี วิธีการแบ่งครึ่งจึงเรียกอีกอย่างหนึ่งว่าวิธีการค้นหาแบบไบนารี วิธีการแบ่งครึ่ง หรือวิธีการแบ่งแยก โดยวิธีการนี้ใช้ทฤษฎีบทค่ากลางเป็นหลัก

การหารากของสมการ

ในตัวอย่างนี้ เราจะพิจารณาเฉพาะสมการที่มีตัวแปรอิสระเพียงตัวเดียวเท่านั้น อาจเป็นเชิงเส้นหรือไม่เชิงเส้นก็ได้ สมการเชิงเส้นใช้เพื่อแสดงกราฟของเส้นตรง ในขณะที่สมการที่ไม่ใช่เชิงเส้นใช้แทนเส้นโค้ง

รากของสมการหมายถึงค่าของตัวแปรอิสระที่เป็นไปตามสมการ ตัวอย่างเช่น รากของสมการ f(x)= 4-x2 = 0 คือ 2 เพราะ f(2) = 4-22 = 0

ลองพิจารณา f(x) เป็นฟังก์ชันต่อเนื่องจริง ตามทฤษฎีบทค่ากลาง สมการ f(x)=0 มีอย่างน้อยหนึ่งรากระหว่าง a และ b ถ้า f(a)f(b) < 0 ฟังก์ชัน f(x) มีรากคือ “c” ระหว่าง a และ b

การหารากของสมการ

การแสดงภาพกราฟิกของวิธีแบ่งส่วน

กราฟต่อไปนี้แสดงกลไกการทำงานของวิธีแบ่งครึ่ง จากกราฟจะเห็นได้ว่ารากของสมการถูกทำเครื่องหมายด้วยสีแดง

เริ่มต้นกับ:

  • ขั้นแรกเราเดาสองครั้งก่อน คือ ก1 และ b1, ซึ่ง f(a1)FB1) < 0 ตามทฤษฎีบทค่ากลาง รากควรอยู่ใน [a1b1].
  • เราสามารถหาจุดกึ่งกลางของ a ได้1 และ b1, ซึ่งก็คือข2- ดังนั้น ช่วงเวลาเริ่มต้นจึงลดลงเหลือ [a1b2] เพราะฉ(ก1)FB2) < 0
  • ในทำนองเดียวกัน ระยะเวลาจะลดลงจนกว่าจะพบวิธีแก้ปัญหาโดยประมาณ

การแสดงภาพกราฟิกของวิธีแบ่งส่วน

อัลกอริธึมวิธีการแบ่งส่วน

ขั้นตอนในการใช้อัลกอริธึมวิธีแบ่งส่วนเพื่อค้นหารากของสมการ f(x)=0 มีดังต่อไปนี้

ขั้นตอน 1) เลือกการคาดเดาเริ่มต้น a, b และอัตราการยอมรับ e

ขั้นตอน 2) ถ้า f(a)f(b) >=0 แล้วรากจะไม่อยู่ในช่วงเวลานี้ จึงจะไม่มีทางแก้ไขได้

ขั้นตอน 3) ค้นหาจุดกึ่งกลาง c = (a+b)/2

(i) ถ้าค่าฟังก์ชันของจุดกึ่งกลาง f(c) = 0 แล้ว c คือราก ไปที่ขั้นตอนที่ 5
(ii) ถ้า f(a)f(c) < 0 รากจะอยู่ระหว่าง a และ c จากนั้นให้กำหนดให้ a = a, b = c
(iii) อย่างอื่นกำหนดให้ a = c, b = b

ขั้นตอน 4) หากข้อผิดพลาดสัมบูรณ์สูงกว่าอัตราที่ยอมรับได้หรือ (ba) > e ให้ไปที่ขั้นตอนที่ 3

ขั้นตอน 5) แสดง c เป็นรากโดยประมาณ

เรามาดูตัวอย่างอัลกอริธึมวิธีการแบ่งส่วนกัน
เราต้องหาค่ารากของฟังก์ชันต่อเนื่องต่อไปนี้โดยใช้สูตรของวิธีการแบ่งครึ่ง

ฉ(x) = x3 - x2 + 2

ตัวอย่างวิธีการแบ่งส่วน

ขั้นตอน 1) สมมติว่า

         ก = -10,
         ข = 10 และ
         อี = 1% หรือ 0.01

ขั้นตอน 2) ตอนนี้เราจะตรวจสอบว่า f(a)f(b) >= 0 หรือไม่

         ฉ(ก) = ฉ(-10) = (-10)3 – (-10)2 + 2 = -1098
         ฉ(ข) = ฉ(10) = (10)3 – (10)2 + 2 = 902
         ฉ(ก)ฉ(ข) = ฉ(-10)ฉ(10) = (-1098)(902) < 0

ดังนั้น รากของฟังก์ชันข้างต้นจึงอยู่ในช่วง [-10, 10]

ขั้นตอน 3) จากนั้นจุดกึ่งกลาง c จะถูกคำนวณก่อน

ตัวอย่างวิธีการแบ่งส่วน

ตอนนี้จะต้องตรวจสอบเงื่อนไขต่อไปนี้:

(i) ว่า f(c) = 0:
         ฉ(ค) = ฉ(0) = (0)3 – (0)2 + 2 = 2 ≠ 0

(ii) ถ้า f(a)f(c) < 0:
         ฉ(ค)ฉ(ก) = 2*(-1098) < 0

เป็นไปตามเงื่อนไข สำหรับการวนซ้ำครั้งต่อไปค่าจะเป็น

         ก = ก = -10
         ข = ค = 0

ขั้นตอน 4) เมื่อ (ba) = (0-(-10)) = 10>0.05 กระบวนการจะถูกทำซ้ำ การวนซ้ำครั้งต่อไปจะแสดงในตาราง

การย้ำ a b c ba ฉ(ค)
1 -10 0 0 10 2
2 -5 0 -5 5 -148
3 -2.5 0 -2.5 2.5 -19.875
4 -1.25 0 -1.25 1.25 -1.52562
5 -1.25 -0.625 -0.625 0.625 1.36523
6 -1.25 -0.9375 -0.9375 0.3125 0.297119
7 -1.09375 -0.9375 -1.09375 0.15625 -0.50473
8 -1.01562 -0.9375 -1.01562 0.078125 -0.0791054
9 -1.01562 -0.976562 -0.976562 0.0390625 0.115003
10 -1.01562 -0.996094 -0.996094 0.0195312 0.0194703
11 -1.00586 -0.996094 -1.00586 0.00976562 -0.0294344

ขั้นตอน 5) ในการวนซ้ำครั้งที่ 11 เงื่อนไขขั้นตอนที่ 4 จะเป็นเท็จ ดังนั้น รากของสมการนี้คือ -1.00586

แผนภาพลอจิกวิธีการแบ่งส่วน

แผนภาพลอจิกวิธีการแบ่งส่วน

รหัสหลอก

Start
Set a, b, e
if f(a)*f(b) >=0 
	Output("Root does not exist in this interval")
	Stop
while (b-a)>e do   
	c ← (a + b)/2    
	if f(c) = 0
        	break    
	end if 
	if f(c)*f(a) < 0 then
      	b ← c    
	else        
		a ← c
end while
Output(c)
Stop

ตัวอย่างวิธีการแบ่งส่วนในภาษา C/C++

Input:

#include<bits/stdc++.h>
using namespace std;
#define Error 0.01
double value(double x)
{
	return x*x*x - x*x + 2;
}
void bisection_method(double a, double b)
{
	if (value(a) * value(b) >= 0)
	{
		cout << "The root does not lie in this interval\n";
		return;
	}
	double c = a;
	while ((b-a) >= Error)
	{
		c = (a+b)/2;
		if (value(c) == 0.0)
			break;
		else if (value(c)*value(a) < 0)
			b = c;
		else
			a = c;
	}
	cout << "The root is :" << c;
}
int main()
{
	double a =-10 , b = 10;
	bisection_method(a, b);
	return 0;
}

Output:

The root is :-1.00586

ตัวอย่างวิธีการแบ่งส่วนใน Python

Input:

def value(x):
	return x*x*x - x*x + 2
def bisection_method(a,b):
	if (value(a) * value(b) >= 0):
		return
	c = a
	while ((b-a) >= 0.01):
		c = (a+b)/2
		if (value(c) == 0.0):
			break
		if (value(c)*value(a) < 0):
			b = c
		else:
			a = c			
	print("The root is : ","%.4f"%c)	
a =-10
b = 10
bisection_method(a, b)

Output:

The root is :  -1.0059

ข้อดีและข้อจำกัดของวิธีแบ่งส่วน

ต่อไปนี้เป็นข้อดีและข้อเสียของวิธีแบ่งส่วน:

ข้อดี จุดด้อย
วิธีการหารากที่ง่ายและสะดวกเพื่อนำไปใช้ การบรรจบกันนั้นช้าเพราะมันขึ้นอยู่กับการลดช่วงเวลาลงครึ่งหนึ่ง
เนื่องจากมันล้อมรากไว้ มันจึงบรรจบกันเสมอ หากการคาดเดาครั้งแรกอยู่ใกล้ราก การไปถึงรากจะต้องทำซ้ำมากขึ้น
อัตราข้อผิดพลาดสามารถควบคุมได้โดยการเพิ่มหรือลดจำนวนการวนซ้ำ