Algorytm bisekcji

Metoda bisekcji (lub metoda równego podziału) jest metodą szacunkową, która pozwala znaleźć miejsce zerowe funkcji w danym przedziale a,b gdzie a<b. Aby tak się stało, muszą zostać spełnione pewne warunki:

  • obszar poszukiwania należy ograniczyć do przedziału a,b tak, aby funkcja na krańcach przedziałów przyjmowała wartości różnych znaków,

  • funkcja w tym przedziale musi być ciągłafunkcja ciągłaciągła.

Proces szukania miejsca zerowego polega na podzieleniu wybranego przedziału na dwie równe części, a następnie wybraniu jednej z nich (tej, która będzie dalszym obszarem poszukiwania). Wybór zależy od tego, który podprzedział dalej będzie spełniał warunek różności funkcji na swoich krańcach. Proces ten kontynuujemy do momentu, gdy osiągniemy określony warunek stopu.

Przykładowym warunkiem stopu mogą być następujące warunki:

  1. Wartość funkcji w znalezionym punkcie, będącym potencjalnym miejscem zerowym funkcji, czyli wartość funkcji w tym punkcie wynosi, co do wartości bezwzględnej, <= ε, gdzie ε jest określone na początku algorytmu.

  2. Różnica pomiędzy punktami będącymi potencjalnymi miejscami zerowymi w kolejnych iteracjach wynosi ±ε, gdzie ε jest określone na początku algorytmu.

  3. Osiągnięta została określona liczba iteracji algorytmu.

Bisekcja w języku Java – podejście rekurencyjne

Problem bisekcji może być zrealizowany w postaci rekurencji, od której zaczniemy implementację. Funkcja, której miejsca zerowego będziemy szukać, to sin(x) w przedziale 1,5. Rekurencja opiera się na założeniu istnienia stanu końcowego, do którego będziemy próbowali dotrzeć. W omawianym przypadku stan ten będzie określony przez wybrany warunek stopu.

Zrealizujmy zatem pierwszy z określonych warunków. Do funkcji rekurencyjnej przekazywać będziemy parametry a oraz b, które określają kraniec przedziału, a także epsilon, czyli dokładność. Wówczas program może wyglądać następująco:

Linia 1. public class Main otwórz nawias klamrowy. Linia 2. public static double f otwórz nawias okrągły double x zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. return Math kropka sin otwórz nawias okrągły x zamknij nawias okrągły średnik. Linia 4. zamknij nawias klamrowy. Linia 6. public static double bisekcja otwórz nawias okrągły double a przecinek double b przecinek double epsilon zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. double x znak równości otwórz nawias okrągły a plus b zamknij nawias okrągły prawy ukośnik 2 średnik. Linia 8. if otwórz nawias okrągły Math kropka abs otwórz nawias okrągły f otwórz nawias okrągły x zamknij nawias okrągły zamknij nawias okrągły otwórz nawias ostrokątny epsilon zamknij nawias okrągły otwórz nawias klamrowy. Linia 9. return x średnik. Linia 10. zamknij nawias klamrowy. Linia 11. else if otwórz nawias okrągły f otwórz nawias okrągły a zamknij nawias okrągły asterysk f otwórz nawias okrągły x zamknij nawias okrągły otwórz nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 12. return bisekcja otwórz nawias okrągły a przecinek x przecinek epsilon zamknij nawias okrągły średnik. Linia 13. zamknij nawias klamrowy. Linia 14. return bisekcja otwórz nawias okrągły x przecinek b przecinek epsilon zamknij nawias okrągły średnik. Linia 15. zamknij nawias klamrowy. Linia 17. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 18. System kropka out kropka println otwórz nawias okrągły bisekcja otwórz nawias okrągły 1 przecinek 5 przecinek 0 kropka 00001 zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 19. zamknij nawias klamrowy. Linia 20. zamknij nawias klamrowy.

W wyniku uruchomienia programu na ekran wypisany zostaje wynik 3.1416015625. Jest to zgodne z prawdą, gdyż jedynym miejscem zerowym funkcji sinus w podanym przedziale jest liczba π3.1415926535.

Bisekcja w języku Java – podejście iteracyjne

Podejście iteracyjne do bisekcji również wymaga określenia warunku stopu. Tym razem zaimplementujemy drugi z wymienionych na wstępie przykładowych warunków. Sprawdzenie warunku musi się wykonać co najmniej raz, aby uzyskać różnicę pomiędzy kolejnymi przybliżeniami miejsca zerowego. Odpowiednią konstrukcją informatyczną będzie zatem pętla do ... while (oczywiście jest to możliwe do zrealizowania również za pomocą pętli while).

Linia 1. public class Main otwórz nawias klamrowy. Linia 2. public static double f otwórz nawias okrągły double x zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. return Math kropka sin otwórz nawias okrągły x zamknij nawias okrągły średnik. Linia 4. zamknij nawias klamrowy. Linia 6. public static double bisekcja otwórz nawias okrągły double a przecinek double b przecinek double epsilon zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. double x0 przecinek x1 znak równości otwórz nawias okrągły a plus b zamknij nawias okrągły prawy ukośnik 2 średnik. Linia 9. do otwórz nawias klamrowy. Linia 10. x0 znak równości x1 średnik. Linia 12. if otwórz nawias okrągły f otwórz nawias okrągły a zamknij nawias okrągły asterysk f otwórz nawias okrągły x0 zamknij nawias okrągły otwórz nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 13. b znak równości x0 średnik. Linia 14. zamknij nawias klamrowy. Linia 15. else otwórz nawias klamrowy. Linia 16. a znak równości x0 średnik. Linia 17. zamknij nawias klamrowy. Linia 19. x1 znak równości otwórz nawias okrągły a plus b zamknij nawias okrągły prawy ukośnik 2 średnik. Linia 20. zamknij nawias klamrowy. Linia 21. while otwórz nawias okrągły Math kropka abs otwórz nawias okrągły x1 minus x0 zamknij nawias okrągły zamknij nawias ostrokątny epsilon zamknij nawias okrągły średnik. Linia 23. return x1 średnik. Linia 24. zamknij nawias klamrowy. Linia 26. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 27. System kropka out kropka println otwórz nawias okrągły bisekcja otwórz nawias okrągły 1 przecinek 5 przecinek 0 kropka 00001 zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 28. zamknij nawias klamrowy. Linia 29. zamknij nawias klamrowy.

W wyniku uruchomienia programu na ekran wypisany zostaje wynik 3.1415939331054688. Jest to rozwiązanie dużo dokładniejsze, jednak należy pamiętać, że wymagało wykonania większej liczby operacji.

Słownik

funkcja ciągła
funkcja ciągła

funkcja jest ciągła, gdy jest ciągła w każdym punkcie swojej dziedziny

warunek stopu
warunek stopu

moment zakończenia wykonywania algorytmu