อัลกอริทึมวิธีแบ่งครึ่งช่วง พร้อมตัวอย่าง

สรุปอย่างชาญฉลาด

วิธีการแบ่งครึ่งช่วง (Bisection Method) เป็นเทคนิคเชิงตัวเลขที่เชื่อถือได้ ซึ่งใช้หาค่ารากของฟังก์ชันต่อเนื่องโดยการแบ่งครึ่งช่วงที่ฟังก์ชันเปลี่ยนเครื่องหมายซ้ำๆ วิธีนี้เรียบง่าย รับประกันการลู่เข้า และใช้กันอย่างแพร่หลายในงานวิศวกรรม การคำนวณทางวิทยาศาสตร์ และหลักสูตรการวิเคราะห์เชิงตัวเลขเบื้องต้น

  • แนวคิดหลัก: แบ่งช่วง [a, b] ออกเป็นครึ่งซ้ำๆ โดยที่ f(a) และ f(b) มีเครื่องหมายตรงข้ามกัน จนกว่าช่วงจะหดตัวลงต่ำกว่าค่าความคลาดเคลื่อนที่ยอมรับได้
  • 📐 พื้นฐานทางทฤษฎี: สร้างขึ้นโดยตรงจากทฤษฎีบทค่ากลาง ซึ่งรับประกันว่าจะมีรากอยู่เสมอเมื่อฟังก์ชันเปลี่ยนเครื่องหมายในช่วงต่อเนื่อง
  • 🔁 พฤติกรรมการบรรจบกัน: การลู่เข้าเชิงเส้นโดยที่ข้อผิดพลาดลดลงครึ่งหนึ่งในแต่ละรอบการทำซ้ำ ทำให้ได้การปรับปรุงความแม่นยำที่คาดการณ์ได้ แต่ค่อนข้างช้า
  • จุดแข็ง: ฟังก์ชันนี้จะลู่เข้าเสมอสำหรับวงเล็บที่ถูกต้อง ต้องการเพียงค่าฟังก์ชัน และง่ายต่อการใช้งานในภาษาโปรแกรมใดๆ ก็ได้
  • 🧪 การใช้งานจริง: มีประโยชน์สำหรับการแก้สมการไม่เชิงเส้นในฟิสิกส์ การเงิน การค้นหาพารามิเตอร์ขั้นสูงในแมชชีนเลิร์นนิง และตัวแก้ปัญหาเชิงตัวเลขที่ขับเคลื่อนด้วย AI

วิธีการแบ่งครึ่งคืออะไร?

วิธีการแบ่งครึ่งช่วง (Bisection Method) เป็นหนึ่งในเทคนิคเชิงตัวเลขพื้นฐานที่สุดสำหรับการหาค่ารากของสมการพหุนามหรือสมการอดิศัย วิธีการนี้ทำงานโดยการกำหนดช่วงที่ประกอบด้วยราก แล้วแบ่งช่วงนั้นออกเป็นครึ่งในแต่ละรอบการคำนวณ จนกว่าจะพบรากภายในค่าความคลาดเคลื่อนที่ยอมรับได้ เนื่องจากลักษณะการกำหนดช่วงเช่นนี้ วิธีการแบ่งครึ่งช่วงจึงถูกเรียกว่า วิธีการกำหนดช่วง (Bracketing Method) ด้วยเช่นกัน

เนื่องจากกลไกการทำงานคล้ายกับการค้นหาแบบไบนารี วิธีการแบ่งครึ่งจึงเป็นที่รู้จักกันในชื่อ วิธีการค้นหาแบบไบนารี วิธีการแบ่งครึ่ง หรือวิธีการแบ่งสองส่วน วิธีการนี้มีพื้นฐานทางทฤษฎีที่แข็งแกร่ง คือ ทฤษฎีบทค่ากลาง ซึ่งรับประกันว่าฟังก์ชันต่อเนื่องที่เปลี่ยนเครื่องหมายในช่วงหนึ่งจะต้องตัดผ่านศูนย์ที่ใดที่หนึ่งภายในช่วงนั้น

เมื่อเข้าใจความหมายพื้นฐานแล้ว เรามาสำรวจกันว่าเหตุใดการหาคำตอบของสมการจึงมีความสำคัญ และวิธีแบ่งครึ่งช่วง (Bisection Method) เข้ามามีบทบาทในภาพรวมนั้นอย่างไร

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

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

รากของสมการคือค่าของตัวแปรอิสระที่สอดคล้องกับสมการนั้น ตัวอย่างเช่น รากของสมการ 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

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

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

การแสดงผลเชิงกราฟของวิธีการแบ่งครึ่ง

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

ขั้นตอนสามารถสรุปได้ดังนี้:

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

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

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

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

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

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

ขั้นตอน 2) ถ้า f(a)f(b) >= 0 แสดงว่ารากไม่อยู่ในช่วงนี้ ในกรณีนั้น จะไม่มีคำตอบใดๆ ภายในช่วง [a, b]

ขั้นตอน 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) ถ้าค่าความคลาดเคลื่อนสัมบูรณ์สูงกว่าอัตราความคลาดเคลื่อนที่ยอมรับได้ นั่นคือ (b – a) > e ให้กลับไปที่ขั้นตอนที่ 3

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

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

ฉ(x) = x3 - x2 + 2

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

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

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

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

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

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

ขั้นตอน 3) ขั้นตอนต่อไปคือการคำนวณจุดกึ่งกลาง c

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

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

(i) ว่า f(c) = 0 หรือไม่:
         f(c) = f(0) = (0)3 - (0)2 + 2 = 2 ซึ่งไม่เท่ากับ 0

(ii) ว่า f(a)f(c) < 0 หรือไม่:
         f(c)f(a) = 2 * (-1098) < 0

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

         ก = ก = -10
         ข = ค = 0

ขั้นตอน 4) เนื่องจาก (b – a) = (0 – (-10)) = 10 > 0.01 กระบวนการจึงถูกทำซ้ำ การทำซ้ำครั้งต่อไปแสดงอยู่ในตารางด้านล่าง

การย้ำ 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

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

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

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

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

หลอกCode

รหัสเทียมด้านล่างนี้สะท้อนถึงอัลกอริทึมและทำหน้าที่เป็นแบบแผนสำหรับการนำวิธีการแบ่งครึ่งช่วงไปใช้ในภาษาโปรแกรมใดๆ ก็ได้

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++

ต่อไปนี้ C/C++ โปรแกรมนี้ใช้วิธีแบ่งครึ่งช่วงเพื่อหาค่ารากของ f(x) = x3 - x2 + 2 ภายในช่วง [-10, 10]

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

การขอ 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

ข้อดีและข้อจำกัดของวิธีการแบ่งครึ่ง

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

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

การประยุกต์ใช้ของวิธีการแบ่งครึ่ง

วิธีการแบ่งครึ่งช่วง (Bisection Method) ถูกนำมาใช้ในสถานการณ์การคำนวณเชิงปฏิบัติและสมัยใหม่หลายอย่างที่ต้องการขั้นตอนการหาค่ารากที่แม่นยำและเชื่อถือได้

  • การจำลองทางวิศวกรรม: การแก้สมการไม่เชิงเส้นที่ปรากฏในด้านการถ่ายเทความร้อน พลศาสตร์ของไหล และการวิเคราะห์โครงสร้าง
  • การสร้างแบบจำลองทางการเงิน: การคำนวณผลตอบแทน อัตราผลตอบแทนภายใน และจุดคุ้มทุน ในกรณีที่ไม่มีสูตรสำเร็จรูปสำหรับการคำนวณ
  • การเรียนรู้ของเครื่องจักรและปัญญาประดิษฐ์: การระบุค่าเกณฑ์ การปรับเทียบแบบจำลอง และการปรับค่าพารามิเตอร์ภายในตัวแก้ปัญหาเชิงตัวเลขที่ขับเคลื่อนด้วย AI
  • กราฟิกคอมพิวเตอร์: การหาจุดตัดระหว่างรังสีกับพื้นผิว และค่าพารามิเตอร์ตามเส้นโค้ง
  • ระบบฝังตัว: การประมาณค่ารากในตัวควบคุมที่มีทรัพยากรจำกัด ซึ่งความเรียบง่ายและความสามารถในการคาดการณ์มีความสำคัญมากกว่าความเร็ว

คำถามที่พบบ่อย

วิธีการแบ่งครึ่งช่วง (Bisection Method) เป็นเทคนิคเชิงตัวเลขที่ใช้หาค่ารากของฟังก์ชันต่อเนื่อง โดยการแบ่งช่วงที่ฟังก์ชันเปลี่ยนเครื่องหมายออกเป็นครึ่งซ้ำๆ และเลือกครึ่งช่วงที่ยังคงมีค่ารากอยู่

การลู่เข้าจะเกิดขึ้นเสมอเมื่อฟังก์ชันมีความต่อเนื่องบนช่วง [a, b] และ f(a)f(b) มีค่าน้อยกว่าศูนย์ เนื่องจากทฤษฎีบทค่ากลางรับประกันว่ามีรากอยู่ในช่วงนั้น และการหารครึ่งจะทำให้ขอบเขตโดยรอบรากนั้นแคบลงเรื่อยๆ

วิธีการแบ่งครึ่งช่วง (Bisection Method) ลู่เข้าแบบเชิงเส้น ข้อผิดพลาดจะลดลงครึ่งหนึ่งโดยประมาณในแต่ละรอบการคำนวณ ดังนั้นการหาค่าความคลาดเคลื่อน e จากช่วงที่มีความยาว L จึงต้องใช้การคำนวณประมาณ log2(L/e) รอบ ซึ่งช้ากว่าวิธีการของนิวตันหรือวิธีการของซีแคนต์

วิธีการนี้ใช้ไม่ได้ผลเมื่อ f(a) และ f(b) มีเครื่องหมายเดียวกัน เมื่อฟังก์ชันไม่ต่อเนื่องในช่วง หรือเมื่อรากมีจำนวนซ้ำเป็นเลขคู่ เนื่องจากฟังก์ชันจะไม่เปลี่ยนเครื่องหมายเมื่อผ่านรากดังกล่าว

โปรแกรมแก้ปัญหาที่ขับเคลื่อนด้วย AI มักจะผสมผสานวิธีการแบ่งครึ่งช่วง (Bisection Method) เข้ากับแบบจำลองที่เรียนรู้มา เครือข่ายประสาทเทียมจะแนะนำขอบเขตที่แคบๆ รอบรากที่น่าจะเป็นไปได้ จากนั้นวิธีการแบ่งครึ่งช่วงจะรับประกันว่าได้คำตอบที่น่าเชื่อถือและได้รับการรับรองภายในขอบเขตนั้น

แบบจำลอง AI มีความสามารถในการจดจำรูปแบบได้ดีเยี่ยม แต่ไม่สามารถให้คำตอบที่ถูกต้องแม่นยำได้เสมอไป วิธีการเชิงตัวเลขแบบดั้งเดิม เช่น วิธีการแบ่งครึ่งช่วง (Bisection) ให้การลู่เข้าที่พิสูจน์ได้และข้อผิดพลาดที่จำกัด ทำให้เหมาะอย่างยิ่งที่จะใช้เป็นแบ็กเอนด์ที่เชื่อถือได้ภายในไปป์ไลน์ AI สำหรับการคำนวณที่สำคัญต่อความปลอดภัย

สรุปโพสต์นี้ด้วย: