Postawienie problemu
Załóżmy, że mamy wyznaczyć pierwiastek stopnia
Jeżeli zadanie dodatkowo uprościmy zakładając:
funkcja ma dokładnie jedno miejsce zerowe,
jest różniczkowalna,
jej pochodna w całym przedziale jest albo dodatnia albo ujemna;
to możemy naszkicować rysunek (rys. 1) ilustrujący nasze zadanie.

Zaczynamy w punkcie
Z równania prostej mamy:
Jeżeli zauważymy, że
Gdy
Istotą algorytmu jest powtarzanie powyższych kroków „w nieskończoność". Procedura jest asymptotycznie zbieżna i umawiamy się, że program kończy pracę gdy kolejna poprawka
łącznie — połączone spójnikiem logicznym AND,
które „zadziała" pierwsze (spójnik logiczny OR).
Realizacja programowa
Program będzie się składał z trzech części (funkcji):
blisko(g, gprim)
— funkcja o wartościach logicznych sprawdzająca czy ,lepszy(n, w, g)
— funkcja rzeczywista wyliczająca następne, lepsze przybliżenie pierwiastka,pierwiastek(n, w, g)
— funkcja (rzeczywista) wyliczająca pierwiastek stopnia z zaczynając od przybliżenia .i, oczywiście, funkcji main.
Uwaga: Dalszy przykład zakłada
Na kolejnych rysunkach przedstawione są schematy blokowe poszczególnych funkcji. Funkcja pierwiastek realizowana jest w sposób rekurencyjny, ale można z rekurencji zrezygnować i obliczenia przeprowadzać w pętli (na przykład while
).
Kod do wykorzystania znajduje się w bryku na stronach 104 i następnych.
Schemat blokowy funkcji lepszy()
Schemat blokowy funkcji blisko()
Schemat blokowy rekurencyjnej wersji funkcji pierwiastek()
W tym przypadku rekurencja realizuje pętlę: każde wywołanie funkcji rozpoczyna wykonanie jej kodu od początku (z nowymi wartościami zmiennych). Rekurencję można zastąpić zwykłą pętlą…
Schemat blokowy funkcji main()
Zadania do wykonania
Zaprogramować metodę Newtona-Raphsona dla
. Przetestować jej działanie.Zmodyfikować schematy blokowe i programy aby metoda mogła działać dla dowolnego
(Uwaga: nie musi być całkowite!). Przetestować.
Program może być rekurencyjny lub nie.
Uwaga
Gdy zachodzi wyliczenie potęgi1 pow()
:
#include <math.h>
...
z = pow(x, y);
Wiem, że mając tę funkcję nie trzeba w zawily sposób wyliczać pierwiastka. Ale celem tych zajęć nie jest wyliczenie pierwiastka, tylko zaprojektowanie stosunkowo prostego algorytmu w podziale na funkcje. ↩︎