Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C++ สำหรับ Bisection Method (วิธีแบ่งครึ่ง)

โจทย์

กำหนดฟังก์ชัน f(x) กับตัวเลข a และ b โดยที่ f(a) * f(b) > 0 และฟังก์ชัน f(x) ควรอยู่ระหว่าง a และ b คือ f(x) = [a, b] งานคือหาค่าของ root ที่อยู่ระหว่างช่วง a และ b ในฟังก์ชัน f(x) โดยใช้ bisection method

Bisection Method คืออะไร?

Bisection method ใช้เพื่อหาค่าของ root ในฟังก์ชัน f(x) ภายในขอบเขตที่กำหนดโดย 'a' และ 'b' Root ของฟังก์ชันสามารถนิยามได้ว่าเป็นค่า a ที่ทำให้ f(a) = 0

ตัวอย่าง

สมการกำลังสอง F(x) = x^2 - 8 สมการนี้เท่ากับ 0 เมื่อค่าของ x เป็น 2 คือ x^2 - 8 = 0 ดังนั้น root ของฟังก์ชันกำลังสอง F(x) นี้คือ 2

ตอนนี้ ถ้าฟังก์ชัน f(x) เป็นต่อเนื่องในช่วง [a..b] ที่กำหนด และเครื่องหมายของ f(a) ≠ เครื่องหมายของ f(b) แล้วจะมีค่า m ที่เป็นสมาชิกของช่วง a และ b ที่ทำให้ f(m) = 0

ค่า m ∈ [a..b] ที่ทำให้ f(m) = 0

เช่น m คือค่าของ root ซึ่งอาจมีหลายค่า

รูปด้านล่างแสดงช่วง f(a) และ f(b) เพื่อหา root ระหว่างช่วงเหล่านี้ ขอบเขตถูกแบ่งเป็นส่วนๆ และเก็บในตัวแปร m คือ

m = (a + b) / 2

โปรแกรม C++ สำหรับ Bisection Method (วิธีแบ่งครึ่ง)

หลังจากการแบ่งขอบเขต ช่วงใหม่จะถูกสร้างขึ้นตามรูปด้านล่าง

โปรแกรม C++ สำหรับ Bisection Method (วิธีแบ่งครึ่ง)

ตัวอย่าง

Input-: x^3 - x^2 + 2 ; a =-500 and b = 100 Output-: The value of root is : -0.991821
Input-: x^3 - x^2 + 2 ; a =-200 and b = 300 Output-: The value of root is : -1.0025

แนวทางที่ใช้ในโปรแกรมด้านล่าง

  • รับสมการและค่าช่วง a และ b
  • แบ่งช่วงเป็น: m = (a + b) / 2
    • พิมพ์ m คือ root
  • ถ้า f(m) ≠ 0
    • ตรวจสอบถ้า f(a) * f(m) < 0
    • Root จะอยู่ระหว่าง a และ m
    • ตรวจสอบถ้า f(b) * f(m) < 0
    • Root จะอยู่ระหว่าง b และ m

อัลกอริทึม

เริ่ม
ขั้นตอน 1 → ในฟังก์ชัน double solution(double x)
  คืนค่า x*x*x - x*x + 2
ขั้นตอน 2 → ในฟังก์ชัน bisection(double a, double b)
  ถ้า solution(a) * solution(b) >= 0 แล้ว
    พิมพ์ "You have not assumed right a and b "
    คืนค่า
  จบถ้า
  ตั้งค่า c = a
  วนลูป While (b-a) >= EP
    ตั้งค่า c = (a+b)/2
    ถ้า solution(c) == 0.0
      Break
    จบถ้า
    มิฉะนั้น ถ้า solution(c)*solution(a) < 0
      ตั้งค่า b = c
    จบมิฉะนั้น
    มิฉะนั้น
      ตั้งค่า a = c
    จบมิฉะนั้น
  จบวน
  พิมพ์ "The value of root"
ขั้นตอน 3 → ในฟังก์ชัน int main()
  ประกาศและเริ่มต้นอินพุต a =-500, b = 100
  เรียกฟังก์ชัน bisection(a, b)
หยุด

ตัวอย่างโค้ด C++

#include <iostream>
using namespace std;
#define EP 0.01
// ฟังก์ชันตัวอย่างที่หาคำตอบโดยใช้ Bisection Method ฟังก์ชันคือ x^3 - x^2 + 2
double solution(double x) {
  return x*x*x - x*x + 2;
}
// พิมพ์ root ของ solution(x) ด้วย error ใน EPSILON
void bisection(double a, double b) {
  if (solution(a) * solution(b) >= 0) {
    cout << "You have not assumed right a and b\n";
    return;
  }
  double c = a;
  while ((b-a) >= EP) {
    // หาจุดกลาง
    c = (a+b)/2;
    // ตรวจสอบว่าจุดกลางเป็น root หรือไม่
    if (solution(c) == 0.0)
      break;
    // กำหนดด้านที่จะทำซ้ำขั้นตอน
    else if (solution(c)*solution(a) < 0)
      b = c;
    else
      a = c;
  }
  cout << "The value of root is : " << c;
}
// ฟังก์ชันหลัก
int main() {
  double a =-500, b = 100;
  bisection(a, b);
  return 0;
}

ผลลัพธ์

The value of root is : -0.991821