Metoda równego podziału

Metoda równego podziału, metoda połowienia, metoda bisekcji[1], metoda połowienia przedziału – jedna z metod rozwiązywania równań nieliniowych. Opiera się ona na twierdzeniu Darboux:

Jeżeli funkcja ciągła f ( x ) {\displaystyle f(x)} ma na końcach przedziału domkniętego wartości różnych znaków, to wewnątrz tego przedziału, istnieje co najmniej jeden pierwiastek równania f ( x ) = 0. {\displaystyle f(x)=0.}

Aby można było zastosować metodę równego podziału, muszą być spełnione założenia:

  1. funkcja f ( x ) {\displaystyle f(x)} jest ciągła w przedziale domkniętym [ a ; b ] , {\displaystyle [a;b],}
  2. funkcja przyjmuje różne znaki na końcach przedziału: f ( a ) f ( b ) < 0. {\displaystyle f(a)f(b)<0.}

Przebieg algorytmu

  1. Sprawdzenie, czy pierwiastkiem równania jest punkt x 1 = a + b 2 , {\displaystyle x_{1}={\tfrac {a+b}{2}},} czyli czy f ( x 1 ) = 0. {\displaystyle f(x_{1})=0.}
    Jeżeli tak jest, algorytm kończy działanie, a punkt x 1 {\displaystyle x_{1}} jest szukanym miejscem zerowym.
  2. W przeciwnym razie, dopóki nie osiągniemy żądanej dokładności, czyli dopóki a b ∣> ϵ : {\displaystyle \mid a-b\mid >\epsilon {:}}
    1. Zgodnie ze wzorem z punktu pierwszego ponownie wyznaczane jest x 1 , {\displaystyle x_{1},} dzieląc przedział [ a , b ] {\displaystyle [a,b]} na dwa mniejsze przedziały: [ a , x 1 ] {\displaystyle [a,x_{1}]} i [ x 1 , b ] . {\displaystyle [x_{1},b].}
    2. Wybierany jest koniec przedziału, którego wartość funkcji posiada znak przeciwny do f ( x 1 ) {\displaystyle f(x_{1})} i odpowiednio górny albo dolny kraniec przedziału ( b {\displaystyle b} albo a {\displaystyle a} ) przyjmuje wartość x 1 , {\displaystyle x_{1},} tj.
      1. Jeżeli f ( a ) f ( x 1 ) < 0 , {\displaystyle f(a)f(x_{1})<0,} to b = x 1 , {\displaystyle b=x_{1},}
      2. Jeżeli f ( x 1 ) f ( b ) < 0 , {\displaystyle f(x_{1})f(b)<0,} to a = x 1 . {\displaystyle a=x_{1}.}
  3. Po osiągnięciu żądanej dokładności algorytm kończy działanie, a szukany pierwiastek równania wynosi a + b 2 . {\displaystyle {\tfrac {a+b}{2}}.}

Przykład

Wyznaczyć pierwiastek równania f ( x ) = x 3 x + 1 {\displaystyle f(x)=x^{3}-x+1} w przedziale [ 2 ; 2 ] . {\displaystyle [-2;2].}

Rozwiązanie:

  • Obliczamy wartości funkcji na końcach przedziału: f ( 2 ) = 5 , {\displaystyle f(-2)=-5,} a f ( 2 ) = 7. {\displaystyle f(2)=7.}
  • Dzielimy przedział na połowy: x 1 = 2 + 2 2 = 0 {\displaystyle x_{1}={\tfrac {-2+2}{2}}=0} i obliczamy wartość f ( x 1 ) = 1. {\displaystyle f(x_{1})=1.}
  • Ponieważ wartość funkcji dla x 1 {\displaystyle x_{1}} jest różna od zera, algorytm jest kontynuowany. Mamy teraz dwa przedziały [ 2 , 0 ] {\displaystyle [-2,0]} i [ 0 , 2 ] . {\displaystyle [0,2].} Wybieramy ten, na którego końcach znaki funkcji są różne: f ( 2 ) f ( 0 ) = 5 1 = 5 < 0 {\displaystyle f(-2)f(0)=-5\cdot 1=-5<0} lub f ( 0 ) f ( 2 ) = 1 7 = 7 > 0. {\displaystyle f(0)f(2)=1\cdot 7=7>0.} Zatem pierwiastek leży w przedziale [ 2 , 0 ] . {\displaystyle [-2,0].}
  • Dzielimy przedział na połowy: x 2 = 2 + 0 2 = 1 {\displaystyle x_{2}={\tfrac {-2+0}{2}}=-1} i obliczamy wartość funkcji: f ( 1 ) = 1. {\displaystyle f(-1)=1.} Liczba x 2 {\displaystyle x_{2}} nie jest zatem pierwiastkiem.
  • Znowu dzielimy przedział na dwa podprzedziały, wybieramy jeden z nich itd.

Uwaga: rozwiązanie można wyznaczyć z dowolną dokładnością (czyli dla każdego ϵ > 0 {\displaystyle \epsilon >0} można znaleźć takie x 0 , {\displaystyle x_{0},} że x x 0 ∣< ϵ {\displaystyle \mid x-x_{0}\mid <\epsilon } gdzie x {\displaystyle x} jest pierwiastkiem równania), w rzadkich przypadkach można uzyskać dokładną wartość pierwiastka (gdy algorytm zostanie zakończony w 1. punkcie). Algorytm metody równego podziału jest blisko spokrewniony z wyszukiwaniem binarnym.

Pseudokod

Prezentacja metody równego podziału w języku Python 3. Początkowe wartości a {\displaystyle a} i b {\displaystyle b} muszą być wybrane w taki sposób, aby f ( a ) {\displaystyle f(a)} i f ( b ) {\displaystyle f(b)} były przeciwnego znaku oraz „otaczały” poszukiwane miejsce zerowe. Zmienna epsilon określa dokładność wyniku, np. 0,0001.

while abs(a - b) > epsilon: # dopóki nie uzyskamy zadanej dokładności
    x1 = (a + b) / 2

    if abs(f(x1)) <= epsilon: # jeżeli znaleźliśmy miejsce zerowe mniejsze bądź równe przybliżeniu zera
        break
    elif f(x1) * f(a) < 0:
        b = x1 # nadpisywanie prawego krańca przedziału
    else:
        a = x1 # nadpisywanie lewego krańca przedziału

print((a + b) / 2) # zwracanie znalezionego miejsca zerowego

Zobacz też

  • metoda numeryczna

Inne numeryczne metody wyznaczania pierwiastków równań:

  • metoda iteracji
  • metoda Newtona (zwana również metodą Newtona-Raphsona lub metodą stycznych)
  • metoda siecznych
  • odwrotna interpolacja kwadratowa
  • regula falsi

Przypisy

  1. publikacja w otwartym dostępie – możesz ją przeczytać Piotr Krzyżanowski i Leszek Plaskota, Równania nieliniowe. Metoda bisekcji, kurs „Metody numeryczne”, wazniak.mimuw.edu.pl [dostęp 2022-01-18].
Encyklopedie internetowe (dychotomia):