Algebraik va transendent tenglamalarni yarim bo'lish usuli bilan yechish
Biseksiya usuli (yarim bo'lish usuli) – ildizni o'z ichiga olgan oraliqni har safar teng ikkiga bo'lib, ildizni topish usuli.
Faraz qilaylik, $[a, b]$ kesmada aniqlangan va uzluksiz bo'lgan $f(x)$ funksiya berilgan bo'lsin. Biz $f(x) = 0$ ko'rinishidagi tenglamaning ildizini topishimiz kerak.
Agar funksiya kesmaning chetki nuqtalarida turli ishorali qiymatlarni qabul qilsa:
shart bajarilsa, Bolsano-Koshi teoremasiga ko'ra, $[a, b]$ oraliqda kamida bitta $x^*$ ildiz mavjud bo'ladi.
Oraliqni bo'lish
Kesmaning o'rtasini topamiz:
Ildizni tekshirish:
Agar $f(c) = 0$ bo'lsa, $c$ — aniq yechim. Aks holda, $f(a) \cdot f(c) < 0$ shartini tekshiramiz.
Oraliqni toraytirish:
To'xtash sharti:
Berilgan $\epsilon$ aniqlik uchun $|b - a| < \epsilon$ sharti bajarilgunicha jarayon takrorlanadi.
Ushbu funksiyani kesmani teng ikkiga bo'lish usuli yordamida yeching: $f(x) = x - 1 - \frac{\sin(x)}{10} = 0$
Oraliq: $[1, 1.1]$ | Aniqlik: $\epsilon = 0.01$
| Iter | a | b | $c = \frac{(a+b)}{2}$ | f(c) | |b-a| | Holat |
|---|---|---|---|---|---|---|
| 1 | 1.00000 | 1.10000 | 1.05000 | -0.03674 | 0.10000 | f(1)·f(1.05) < 0 ✓ |
| 2 | 1.05000 | 1.10000 | 1.07500 | -0.01296 | 0.05000 | f(1.05)·f(1.075) < 0 ✓ |
| 3 | 1.07500 | 1.10000 | 1.08750 | -0.00105 | 0.02500 | f(1.075)·f(1.0875) < 0 ✓ |
| 4 | 1.08750 | 1.10000 | 1.09375 | 0.00491 | 0.01250 | f(1.0875)·f(1.09375) > 0 |
| 5 | 1.087500 | 1.093750 | 1.09063 | 0.00193 | 0.00625 < ϵ ✓ | TO'XTASH! |
📌 Natija:
$|b - a| = 0.00625 < \epsilon=0.01$ shart bajarilgani uchun jarayon to'xtatiladi.
Ildiz: $x^* \approx 1.09063$
Jami iteratsiyalar: 5 ta
using System;
class Program
{
// Misolning berilishi: f(x) = x - 1 - sin(x)/10
static double f(double x) => x - 1 - Math.Sin(x) / 10;
static void Main()
{
double a = 1, b = 1.1, eps = 0.01;
int iter = 0;
if (f(a) * f(b) >= 0) {
Console.WriteLine("Shart bajarilmadi!");
return;
}
Console.WriteLine("Iter | a | b | c | f(c) | |b-a|");
while ((b - a) >= eps)
{
iter++;
double c = (a + b) / 2;
double fc = f(c);
// Natijani chop etish
Console.WriteLine($"{iter,4} | {a,7:F5} | {b,7:F5} | {c,7:F5} | {fc,8:F5} | {b - a,7:F5}");
if (fc == 0.0) break;
if (f(a) * fc < 0)
b = c;
else
a = c;
}
// Oxirgi nuqtani (ildizni) topish
double ildiz = (a + b) / 2;
Console.WriteLine($"\nIldiz: {ildiz:F5}");
Console.WriteLine($"Jami iteratsiyalar: {iter}");
}
}