একটি ফাংশন f(x) এবং a, b সংখ্যা দেওয়া আছে যেখানে f(a) * f(b) > 0 এবং f(x) a এবং b-এর মধ্যে থাকে অর্থাৎ f(x) = [a, b]। কাজ হলো বাইসেকশন মেথড ব্যবহার করে f(x)-এ a এবং b ইন্টারভালের মধ্যকার রুটের মান বের করা।
বাইসেকশন মেথড কী?
বাইসেকশন মেথড f(x) ফাংশনে 'a' এবং 'b' লিমিটের মধ্যকার রুটের মান বের করতে ব্যবহৃত হয়। ফাংশনের রুট হলো এমন একটি মান a যাতে f(a) = 0।
উদাহরণ
দ্বিঘাত সমীকরণ F(x) = x^2 - 8। এটি ০ হয় যখন x = 2। অর্থাৎ x^2 - 8 = 0 হলে এই ফাংশনের রুট হবে ২।
যদি একটি ফাংশন f(x) ইন্টারভাল [a..b]-এ কন্টিনিউয়াস হয় এবং f(a) ≠ f(b) সাইন থাকে, তবে একটি মান m থাকবে যা a এবং b-এর মধ্যে অবস্থিত এবং f(m) = 0।
মান m ∈ [a..b] যাতে f(m) = 0। অর্থাৎ m হলো রুটের মান যা একাধিক হতে পারে।
নিচে চিত্র দেওয়া আছে যা f(a) এবং f(b) ইন্টারভাল দেখাচ্ছে। রুট বের করতে লিমিট দুটি ভাগ করে m-এ সংরক্ষণ করা হয়: m = (a + b) / 2

লিমিট ভাগ করার পর নতুন ইন্টারভাল তৈরি হয়:

উদাহরণ
ইনপুট: x^3 - x^2 + 2; a = -500, b = 100 আউটপুট: The value of root is : -0.991821 ইনপুট: x^3 - x^2 + 2; a = -200, b = 300 আউটপুট: The value of root is : -1.0025
প্রোগ্রামে ব্যবহৃত পদ্ধতি -
- ইকুয়েশন এবং a, b ইন্টারভাল ইনপুট নেওয়া।
- ইন্টারভাল ভাগ করা: m = (a + b) / 2
- m প্রিন্ট করা রুট হিসেবে।
- যদি f(m) ≠ 0
- চেক করুন f(a) * f(m) < 0 হলে রুট a এবং m-এর মধ্যে।
- চেক করুন f(b) * f(m) < 0 হলে রুট b এবং m-এর মধ্যে।
অ্যালগরিদম
শুরু
ধাপ ১ -> double solution(double x) ফাংশনে
return x*x*x - x*x + 2
ধাপ ২ -> bisection(double a, double b) ফাংশনে
যদি solution(a) * solution(b) >= 0 হয়, তবে
"You have not assumed right a and b" প্রিন্ট
রিটার্ন
শেষ
c = a সেট
লুপ যতক্ষণ (b-a) >= EP
c = (a+b)/2 সেট
যদি solution(c) == 0.0
ব্রেক
শেষ
অন্যথায় যদি solution(c)*solution(a) < 0
b = c সেট
শেষ
অন্যথায়
a = c সেট
শেষ
শেষ
"The value of root" প্রিন্ট
ধাপ ৩ -> int main() ফাংশনে
a = -500, b = 100 ইনিশিয়ালাইজ
bisection(a, b) কল
শেষ
উদাহরণ
#include <iostream>
using namespace std;
#define EP 0.01 // উদাহরণ ফাংশন যার সমাধান বাইসেকশন মেথড দিয়ে নির্ধারিত
// ফাংশন: x^3 - x^2 + 2
double solution(double x) {
return x*x*x - x*x + 2;
}
// EPSILON এররসহ solution(x)-র রুট প্রিন্ট
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;
// চেক করা মিডিল পয়েন্ট রুট কিনা
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