W e‑materiale Wyznaczanie przybliżonej wartości miejsca zerowego funkcji metodą stycznychPtrE9QP2nWyznaczanie przybliżonej wartości miejsca zerowego funkcji metodą stycznych poznaliśmy algorytm wyszukiwania wartości miejsca zerowego funkcji z pewną dokładnością. Napiszmy zatem program w języku Python, który pozwoli dokonać obliczenia przybliżenia takiego pierwiastkapierwiastek funkcjipierwiastka.

Pamiętajmy, że kolejne przybliżenia (pierwiastki) wyznaczane są na podstawie następującego wzoru:

x2=x1-fx1f'x1

gdzie:

  • x1 – punkt startowy; przybliżona wartość miejsca zerowego funkcji fx w przedziale ;

  • fx – przybliżona wartość miejsca zerowego funkcji fx w przedziale ; punkt przecięcia stycznej do wykresu funkcji w punkcie z osią ;

  • fx1 – wartość funkcji fx w punkcie ;

  • f'x1 – pochodna funkcji fx w punkcie .

Styczna jest geometryczną interpretacją pochodnej.

Napiszmy program realizujący algorytm wyznaczania miejsca zerowego funkcji w przedziale z dokładnością do trzech miejsc po przecinku.

fx=x3-5x
Przykład 1

Tworzymy definicję funkcji o nazwie funkcja. Jej rolą jest obliczenie i zwrócenie wartości analizowanej funkcji w punkcie x zgodnie z wcześniej podanym wzorem.

Linia 1. def funkcja otwórz nawias okrągły x zamknij nawias okrągły dwukropek. Linia 2. return x asterysk asterysk 3 minus 5 asterysk x.

Następnie tworzymy kolejną funkcję obliczającą pochodną funkcji, której miejsce zerowe chcemy wyznaczyć. Pochodna funkcji ma następujący wzór:

f'x=3x2-5

W programie nadajemy jej nazwę pochodna.

Linia 1. def pochodna otwórz nawias okrągły x zamknij nawias okrągły dwukropek. Linia 2. return 3 asterysk x asterysk asterysk 2 minus 5.

Najważniejszą funkcją będzie metoda_stycznych o następujących parametrach: punkt startowy xIndeks dolny 1, wartość błędu bezwzględnego ex oraz dokładność ey, czyli maksymalna różnica pomiędzy kolejnymi przybliżeniami, przy której możemy zakończyć algorytm. W trakcie pisania programu będziemy korzystali z funkcji fabs umożliwiającej obliczenie wartości bezwzględnejwartość bezwzględnawartości bezwzględnej wyrażenia.

Linia 1. from math import fabs. Linia 2. def metoda podkreślnik stycznych otwórz nawias okrągły x1 przecinek ex przecinek ey zamknij nawias okrągły dwukropek. Linia 3. x2 znak równości x1. Linia 4. while True dwukropek. Linia 5. x1 znak równości x2. Linia 6. x2 znak równości x1 minus funkcja otwórz nawias okrągły x1 zamknij nawias okrągły prawy ukośnik pochodna otwórz nawias okrągły x1 zamknij nawias okrągły. Linia 7. if otwórz nawias okrągły fabs otwórz nawias okrągły x2 minus x1 zamknij nawias okrągły otwórz nawias ostrokątny znak równości ex or funkcja otwórz nawias okrągły x2 zamknij nawias okrągły otwórz nawias ostrokątny znak równości ey zamknij nawias okrągły dwukropek. Linia 8. break. Linia 10. return x2.

Na początek tworzymy dodatkową zmienną lokalną x2, której przypisujemy wartość zmiennej x1. W pętli nieskończonej while True przypisujemy zmiennej x1 wartość zmiennej x2. W tym momencie wartość zapisana w zmiennej x2 staje się nowym punktem startowym. Następnie zgodnie z przedstawionym wcześniej wzorem obliczamy miejsce zerowe i zapisujemy do zmiennej x2. Jeżeli różnica pomiędzy kolejnymi przybliżeniami (wartość bezwzględna, którą obliczamy funkcją fabs()) jest mniejsza lub równa wartości błędu bezwzględnego bądź wartość funkcji dla podanego argumentu jest mniejsza lub równa dokładności, wychodzimy z pętli i na koniec zwracamy wartość zmiennej x2, czyli przybliżoną wartość miejsca zerowego funkcji.

W omawianym przykładzie wykonanie takiego programu będzie wyglądać następująco (użyjemy specjalnego formatowania liczb rzeczywistych):

Linia 1. from math import fabs. Linia 3. def funkcja otwórz nawias okrągły x zamknij nawias okrągły dwukropek. Linia 4. return x asterysk asterysk 3 minus 5 asterysk x. Linia 7. def pochodna otwórz nawias okrągły x zamknij nawias okrągły dwukropek. Linia 8. return 3 asterysk x asterysk asterysk 2 minus 5. Linia 11. def metoda podkreślnik stycznych otwórz nawias okrągły x1 przecinek ex przecinek ey zamknij nawias okrągły dwukropek. Linia 12. x2 znak równości x1. Linia 13. while True dwukropek. Linia 14. x1 znak równości x2. Linia 15. x2 znak równości x1 minus funkcja otwórz nawias okrągły x1 zamknij nawias okrągły prawy ukośnik pochodna otwórz nawias okrągły x1 zamknij nawias okrągły. Linia 16. if otwórz nawias okrągły fabs otwórz nawias okrągły x2 minus x1 zamknij nawias okrągły otwórz nawias ostrokątny znak równości ex or funkcja otwórz nawias okrągły x2 zamknij nawias okrągły otwórz nawias ostrokątny znak równości ey zamknij nawias okrągły dwukropek. Linia 17. break. Linia 19. return x2. Linia 22. przyblizenie znak równości metoda podkreślnik stycznych otwórz nawias okrągły 3 przecinek 0 kropka 0001 przecinek 0 kropka 0001 zamknij nawias okrągły asterysk 1000. Linia 23. print otwórz nawias okrągły f cudzysłów Wartość pierwiastka wynosi otwórz nawias klamrowy przyblizenie dwukropek kropka 4f zamknij nawias klamrowy cudzysłów zamknij nawias okrągły. Linia 24. wynik znak równości przyblizenie prawy ukośnik 1000. Linia 25. print otwórz nawias okrągły f cudzysłów Wartość pierwiastka wynosi otwórz nawias klamrowy wynik dwukropek kropka 4f zamknij nawias klamrowy cudzysłów zamknij nawias okrągły. Linia 27. kratka efekt działania programu. Linia 28. kratka Wartość pierwiastka wynosi 2236 kropka 0681. Linia 29. kratka Wartość pierwiastka wynosi 2 kropka 2361.

Dobieranie punktu startowego oraz zbieżność

1
Ważne!

ZbieżnośćzbieżnośćZbieżność nie zawsze musi zachodzić. Jeżeli źle dobierzemy punkt startowy, algorytm stycznej nie zwróci wyniku. W takim wypadku program może nigdy się nie kończyć, ponieważ w każdej iteracji będzie się oddalał od znalezienia miejsca zerowego. Taką zbieżność nazywamy lokalną. Aby uniknąć możliwej nieskończonej pętli, możemy do funkcji wprowadzić parametr, który ograniczy liczbę prób, np.:

Linia 1. from math import fabs. Linia 3. def funkcja otwórz nawias okrągły x zamknij nawias okrągły dwukropek. Linia 4. return x asterysk asterysk 3 minus 5 asterysk x. Linia 7. def pochodna otwórz nawias okrągły x zamknij nawias okrągły dwukropek. Linia 8. return 3 asterysk x asterysk asterysk 2 minus 5. Linia 11. def metoda podkreślnik stycznych otwórz nawias okrągły x1 przecinek ex przecinek ey przecinek max podkreślnik iter znak równości 100 zamknij nawias okrągły dwukropek. Linia 12. x2 znak równości x1. Linia 13. iteracja znak równości 0. Linia 14. while True dwukropek. Linia 15. iteracja plus znak równości 1. Linia 16. if iteracja zamknij nawias ostrokątny max podkreślnik iter dwukropek. Linia 17. raise Exception otwórz nawias okrągły cudzysłów Zbyt wiele operacji kropka cudzysłów zamknij nawias okrągły. Linia 18. x1 znak równości x2. Linia 19. x2 znak równości x1 minus funkcja otwórz nawias okrągły x1 zamknij nawias okrągły prawy ukośnik pochodna otwórz nawias okrągły x1 zamknij nawias okrągły. Linia 20. if otwórz nawias okrągły fabs otwórz nawias okrągły x2 minus x1 zamknij nawias okrągły otwórz nawias ostrokątny znak równości ex or funkcja otwórz nawias okrągły x2 zamknij nawias okrągły otwórz nawias ostrokątny znak równości ey zamknij nawias okrągły dwukropek. Linia 21. break. Linia 23. return x2.

Efekt wykonania takiego kodu dla dwóch wartości parametru x1:

  • x1 = 99999999999999

  • x1 = 99999999999999999999999

Linia 1. print otwórz nawias okrągły cudzysłów Test dla wartości dwukropek 99999999999999 cudzysłów zamknij nawias okrągły. Linia 2. przyblizenie znak równości metoda podkreślnik stycznych otwórz nawias okrągły 99999999999999 przecinek 0 kropka 0001 przecinek 0 kropka 0001 zamknij nawias okrągły asterysk 1000. Linia 3. print otwórz nawias okrągły f cudzysłów Wartość pierwiastka wynosi otwórz nawias klamrowy przyblizenie dwukropek kropka 4f zamknij nawias klamrowy cudzysłów zamknij nawias okrągły. Linia 4. wynik znak równości przyblizenie prawy ukośnik 1000. Linia 5. print otwórz nawias okrągły f cudzysłów Wartość pierwiastka w przybliżeniu 4 cyfr wynosi otwórz nawias klamrowy wynik dwukropek kropka 4f zamknij nawias klamrowy cudzysłów zamknij nawias okrągły. Linia 6. print otwórz nawias okrągły zamknij nawias okrągły. Linia 7. print otwórz nawias okrągły cudzysłów Test dla wartości dwukropek 99999999999999999999999 cudzysłów zamknij nawias okrągły. Linia 8. przyblizenie znak równości metoda podkreślnik stycznych otwórz nawias okrągły 99999999999999999999999 przecinek 0 kropka 0001 przecinek 0 kropka 0001 zamknij nawias okrągły asterysk 1000. Linia 9. print otwórz nawias okrągły f cudzysłów Wartość pierwiastka wynosi otwórz nawias klamrowy przyblizenie dwukropek kropka 4f zamknij nawias klamrowy cudzysłów zamknij nawias okrągły. Linia 10. wynik znak równości przyblizenie prawy ukośnik 1000. Linia 11. print otwórz nawias okrągły f cudzysłów Wartość pierwiastka w przybliżeniu 4 cyfr wynosi otwórz nawias klamrowy wynik dwukropek kropka 4f zamknij nawias klamrowy cudzysłów zamknij nawias okrągły. Linia 13. kratka Efekt działania takiego wywołania funkcji dwukropek. Linia 14. kratka Test dla wartości dwukropek 99999999999999. Linia 15. kratka Wartość pierwiastka wynosi 2236 kropka 0706. Linia 16. kratka Wartość pierwiastka w przybliżeniu 4 cyfr wynosi 2 kropka 2361. Linia 17. kratka. Linia 18. kratka Test dla wartości dwukropek 99999999999999999999999. Linia 19. kratka Traceback otwórz nawias okrągły most recent call last zamknij nawias okrągły dwukropek. Linia 20. kratka File cudzysłów prawy ukośnik home prawy ukośnik python prawy ukośnik epodreczniki prawy ukośnik metoda podkreślnik stycznych podkreślnik przyklad kropka py cudzysłów przecinek line 32 przecinek in otwórz nawias ostrokątny module zamknij nawias ostrokątny. Linia 21. kratka przyblizenie znak równości metoda podkreślnik stycznych otwórz nawias okrągły 99999999999999999999999 przecinek 0 kropka 0001 przecinek 0 kropka 0001 zamknij nawias okrągły asterysk 1000. Linia 22. kratka File cudzysłów prawy ukośnik home prawy ukośnik python prawy ukośnik epodreczniki prawy ukośnik metoda podkreślnik stycznych podkreślnik przyklad kropka py cudzysłów przecinek line 17 przecinek in metoda podkreślnik stycznych. Linia 23. kratka raise Exception otwórz nawias okrągły cudzysłów Zbyt wiele operacji kropka cudzysłów zamknij nawias okrągły. Linia 24. kratka Exception dwukropek Zbyt wiele operacji kropka.

O metodzie tej mówimy, że jest szybko zbieżna, ponieważ jej zbieżność jest kwadratowa, a nie liniowa; zależy ona jednak od różnych czynników, m.in. od przybliżenia założonego na starcie oraz od postaci funkcyjnej równania.

Słownik

algorytm numeryczny
algorytm numeryczny

metoda rozwiązywania problemów matematycznych za pomocą operacji na liczbach

błąd bezwzględny
błąd bezwzględny

bezwzględna różnica pomiędzy dokładną wartością a jej uzyskanym przybliżeniem (np. w wyniku obliczeń lub pomiarów)

funkcja wielomianowa
funkcja wielomianowa

funkcja wyrażana przez wielomian, czyli sumę co najmniej dwóch jednomianówjednomianjednomianów

jednomian
jednomian

iloczyn litery oznaczającej zmienną oraz liczby (nazywanej stałą)

pierwiastek funkcji
pierwiastek funkcji

inaczej: miejsce zerowe funkcji, czyli argument, dla którego wartość funkcji wynosi zero

pochodna
pochodna

miara szybkości, z jaką zmieniają się wartości funkcji; w ujęciu geometrycznym pochodną stanowi styczna do rozpatrywanej funkcji w ustalonym punkcie

styczna
styczna

linia prosta mająca jeden punkt wspólny z linią krzywą, np. wartością funkcji w punkcie, nieprzecinająca linii krzywej

wartość bezwzględna
wartość bezwzględna

odległość danej liczby od zera na osi liczbowej

zbieżność
zbieżność

zmierzanie do pewnej docelowej wartości granicznej wraz ze zwiększaniem się liczby iteracji