Algorytm metody bisekcji z przykładami

Inteligentne podsumowanie

Metoda bisekcji to niezawodna technika numeryczna, która umożliwia znalezienie pierwiastka funkcji ciągłej poprzez wielokrotne dzielenie przedziału, w którym funkcja zmienia znak, na pół. Jest prosta, gwarantuje zbieżność i jest szeroko stosowana w inżynierii, obliczeniach naukowych i na kursach analizy numerycznej dla początkujących.

  • Podstawowa idea: Wielokrotnie dziel nawias [a, b], gdzie f(a) i f(b) mają przeciwne znaki, aż przedział zmniejszy się poniżej pewnej tolerancji.
  • 📐 Podstawy teoretyczne: Zbudowany bezpośrednio na twierdzeniu o wartościach pośrednich, które gwarantuje, że pierwiastek istnieje, gdy funkcja zmienia znak w przedziale ciągłym.
  • 🔁 Zachowanie konwergencji: Liniowa konwergencja z błędem zmniejszonym o połowę na iterację zapewnia przewidywalną, ale stosunkowo powolną poprawę dokładności.
  • Moce: Zawsze zbiega się dla prawidłowych nawiasów, wymaga tylko wartości funkcji i jest łatwy do zaimplementowania w dowolnym języku programowania.
  • 🧪 Praktyczne użycie: Przydatny do rozwiązywania równań nieliniowych w fizyce, finansach, wyszukiwaniu hiperparametrów za pomocą uczenia maszynowego i rozwiązywaniu zadań numerycznych sterowanych przez sztuczną inteligencję.

Czym jest metoda bisekcji?

Metoda bisekcji to jedna z najbardziej podstawowych technik numerycznych służących do znajdowania pierwiastka równania wielomianowego lub przestępnego. Polega ona na uwzględnieniu przedziału zawierającego pierwiastek w nawiasach, a następnie podzieleniu go na połowy w każdej iteracji, aż pierwiastek znajdzie się w akceptowalnym zakresie tolerancji. Ze względu na ten mechanizm, metoda bisekcji jest również nazywana metodą bracketingu.

Ponieważ jej mechanizm działania przypomina przeszukiwanie binarne, metoda bisekcji jest również znana jako metoda przeszukiwania binarnego, metoda podziału na pół lub metoda dychotomii. Opiera się ona na silnych podstawach teoretycznych: twierdzeniu o wartościach pośrednich, które gwarantuje, że funkcja ciągła zmieniająca znak w pewnym przedziale musi przechodzić przez zero w którymś miejscu tego przedziału.

Mając już podstawową definicję, możemy teraz zbadać, dlaczego znajdowanie pierwiastków równań jest tak ważne i jak metoda bisekcji wpisuje się w ten szerszy obraz.

Znajdowanie pierwiastków równań

W tej dyskusji skupimy się wyłącznie na równaniach z jedną zmienną niezależną. Takie równania mogą być liniowe lub nieliniowe. Równania liniowe opisują wykres linii prostej, podczas gdy równania nieliniowe opisują krzywe i bardziej złożone kształty.

Pierwiastek równania to wartość zmiennej niezależnej, która spełnia równanie. Na przykład pierwiastek równania f(x) = 4 – x2 = 0 to 2, ponieważ f(2) = 4 – 22 = 0.

Rozważmy f(x) jako funkcję ciągłą rzeczywistą. Zgodnie z twierdzeniem o wartościach pośrednich, równanie f(x) = 0 ma co najmniej jeden pierwiastek między a i b, gdy f(a)f(b) < 0. Innymi słowy, funkcja f(x) ma pierwiastek „c” gdzieś między a i b.

Znajdowanie pierwiastków równań

Ta właściwość zmiany znaku jest dokładnie tym, co wykorzystuje metoda bisekcji. W następnej sekcji pokazano, jak ta koncepcja wygląda graficznie.

Graficzna reprezentacja metody bisekcji

Poniższy wykres przedstawia mechanizm działania metody bisekcji. Na wykresie widać, że rzeczywisty pierwiastek równania jest zaznaczony na czerwono.

Procedurę można podsumować następująco:

  • Najpierw wybieramy dwa początkowe przypuszczenia,1 oraz b1, dla którego f(a1)pełne wyżywienie1) < 0. Zgodnie z twierdzeniem o wartościach pośrednich pierwiastek musi leżeć w [a1b1].
  • Następnie obliczamy punkt środkowy1 oraz b1, który jest b2Początkowy interwał został teraz skrócony do [a1b2], ponieważ f(a1)pełne wyżywienie2) < 0.
  • W ten sam sposób przedział jest wielokrotnie zmniejszany o połowę, aż do znalezienia przybliżonego rozwiązania mieszczącego się w żądanej tolerancji.

Graficzne przedstawienie metody bisekcji

Mając jasną intuicję geometryczną, możemy teraz sformalizować procedurę jako algorytm krok po kroku.

Algorytm metody Bisekcji

Poniżej przedstawiono kroki zastosowania algorytmu metody bisekcji w celu znalezienia pierwiastka równania f(x) = 0.

Krok 1) Wybierz początkowe przypuszczenia a, b i współczynnik tolerancji e.

Krok 2) Jeżeli f(a)f(b) >= 0, to pierwiastek nie leży w tym przedziale. W takim przypadku nie ma rozwiązania w przedziale [a, b].

Krok 3) Znajdź punkt środkowy, c = (a + b)/2.

(i) Jeśli wartość funkcji w punkcie środkowym f(c) = 0, to c jest pierwiastkiem. Przejdź do kroku 5.
(ii) Jeśli f(a)f(c) < 0, pierwiastek leży między a i c. Wówczas przyjmijmy, że a = a, b = c.
(iii) W przeciwnym wypadku ustaw a = c, b = b.

Krok 4) Jeżeli błąd bezwzględny jest wyższy od współczynnika tolerancji, czyli (b – a) > e, wróć do kroku 3.

Krok 5) Wyświetl c jako przybliżony pierwiastek.

Zobaczmy przykład algorytmu metody bisekcji w akcji. Obliczymy pierwiastek poniższej funkcji ciągłej, używając wzoru metody bisekcji.

fa(x) = x3 - x2 + 2

Przykład metody bisekcji

Krok 1) Załóżmy,

         a = -10,
         b = 10 i
         e = 1% lub 0.01.

Krok 2) Teraz sprawdzimy, czy f(a)f(b) >= 0, czy nie.

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

Zatem pierwiastek powyższej funkcji leży w przedziale [-10, 10].

Krok 3) Następnie obliczany jest punkt środkowy c.

Przykład metody bisekcji

Teraz należy sprawdzić następujące warunki:

(i) Czy f(c) = 0:
         f(c) = f(0) = (0)3 - (0)2 + 2 = 2, co nie jest równe 0.

(ii) Czy f(a)f(c) < 0:
         f(c)f(a) = 2 * (-1098) < 0

Warunek jest spełniony. W kolejnej iteracji wartości będą następujące:

         a = a = -10
         b = do = 0

Krok 4) Gdy (b – a) = (0 – (-10)) = 10 > 0.01, proces jest powtarzany. Kolejne iteracje przedstawiono w poniższej tabeli.

Iteracja a b c ba f(c)
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

Krok 5) W 11. iteracji warunek z kroku 4 staje się fałszywy. Zatem przybliżony pierwiastek tego równania wynosi -1.00586.

Po zakończeniu przykładu liczbowego następna sekcja prezentuje diagram logiczny obrazujący cały przepływ sterowania.

Schemat logiczny metody bisekcji

Poniższy schemat blokowy podsumowuje logikę decyzyjną metody Bisekcji, w tym sprawdzenie nawiasów, aktualizację punktu środkowego i test tolerancji.

Schemat logiczny metody bisekcji

Rzekomy-Code

Poniższy pseudokod odzwierciedla algorytm i stanowi wzór do implementacji metody Bisekcji w dowolnym języku programowania.

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

Przykład metody bisekcji w C/C++

Następujące C/C++ program implementuje metodę bisekcji w celu znalezienia pierwiastka równania f(x) = x3 - x2 + 2 w przedziale [-10, 10].

Wejście:

#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;
}

Wyjście:

The root is :-1.00586

Przykład metody bisekcji w Python

Python wersja poniżej generuje ten sam przybliżony pierwiastek, stosując identyczną logikę, dzięki czemu idealnie nadaje się do szybkiego eksperymentowania i nauczania.

Wejście:

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)

Wyjście:

The root is :  -1.0059

Zalety i ograniczenia metody bisekcji

Jak każda technika numeryczna, metoda bisekcji ma wyraźne zalety i kilka praktycznych wad. Poniższa tabela podsumowuje najważniejsze zalety i wady.

ZALETY Wady
Prosta i łatwa metoda znajdowania pierwiastków, możliwa do wdrożenia w dowolnym języku. Konwergencja jest powolna, ponieważ metoda ta po prostu dzieli przedział na pół na każdym kroku.
Zawsze zbiega się, gdy podany zostanie poprawny nawias, ponieważ obejmuje on element główny w całym procesie. Jeśli jedno z początkowych przypuszczeń jest już blisko pierwiastka, dotarcie do niego i tak zajmie wiele iteracji.
Współczynnik błędów można kontrolować bezpośrednio poprzez zwiększanie lub zmniejszanie liczby iteracji lub poprzez zawężanie tolerancji. Funkcja ta nie może znaleźć pierwiastków zespolonych ani pierwiastków wielokrotnych o parzystej krotności, ponieważ nie zmienia znaku przy takich pierwiastkach.

Zastosowania metody bisekcji

Metoda bisekcji jest stosowana w wielu praktycznych i nowoczesnych scenariuszach obliczeniowych, w których wymagany jest solidny krok znajdowania pierwiastków.

  • Symulacje inżynierskie: Rozwiązywanie równań nieliniowych występujących w przenoszeniu ciepła, dynamice płynów i analizie strukturalnej.
  • Modelowanie finansowe: Obliczanie rentowności, wewnętrznych stóp zwrotu i punktów rentowności w przypadku, gdy nie istnieją rozwiązania w formie zamkniętej.
  • Uczenie maszynowe i AI: Lokalizowanie progów, kalibracja modeli i dostrajanie hiperparametrów w ramach numerycznych rozwiązań opartych na sztucznej inteligencji.
  • Grafika komputerowa: Wyznaczanie przecięć promieni i powierzchni oraz wartości parametrów wzdłuż krzywych.
  • Systemy wbudowane: Przybliżone korzenie w kontrolerach o niskim zasobie, gdzie prostota i przewidywalność są ważniejsze niż szybkość.

FAQ

Metoda bisekcji to technika numeryczna, która pozwala na znalezienie pierwiastka funkcji ciągłej poprzez wielokrotne dzielenie na pół przedziału, w którym funkcja zmienia znak, i wybieranie połowy, która nadal zawiera pierwiastek.

Funkcja zbiega się zawsze, gdy jest ciągła na [a, b] i f(a)f(b) jest mniejsze od zera, ponieważ twierdzenie o wartościach pośrednich gwarantuje, że w tym przedziale istnieje pierwiastek, a dzielenie na pół powoduje ciągłe zmniejszanie nawiasu wokół niego.

Metoda bisekcji jest zbieżna liniowo. Błąd zmniejsza się mniej więcej o połowę w każdej iteracji, więc osiągnięcie tolerancji e z przedziału o długości L wymaga około log2(L/e) iteracji, co jest wolniejsze niż w przypadku metody Newtona lub secans.

Metoda ta nie działa, gdy f(a) i f(b) mają ten sam znak, gdy funkcja jest nieciągła w przedziale lub gdy pierwiastek ma parzystą krotność, ponieważ funkcja nie zmienia znaku wzdłuż takiego pierwiastka.

Rozwiązania oparte na sztucznej inteligencji często łączą metodę bisekcji z modelami poznanymi. Sieć neuronowa sugeruje ścisły nawias wokół prawdopodobnego pierwiastka, a metoda bisekcji gwarantuje niezawodne, certyfikowane rozwiązanie wewnątrz tego nawiasu.

Modele sztucznej inteligencji (AI) doskonale rozpoznają wzorce, ale nie zawsze potrafią udzielić dokładnych odpowiedzi. Klasyczne metody numeryczne, takie jak bisekcja, zapewniają możliwą do udowodnienia zbieżność i ograniczony błąd, co czyni je idealnymi narzędziami do tworzenia zaufanych back-endów w ramach procesów AI do obliczeń krytycznych dla bezpieczeństwa.

Podsumuj ten post następująco: