Implementacja metody Newtona‑Raphsona w języku C++

metodzie Newtona‑Raphsonametoda Newtona‑Raphsonametodzie Newtona‑Raphsona korzystamy z faktu, że pierwiastkowana liczba jest równa polu kwadratu, którego boki są takiej długości jak wartość wyniku pierwiastkowania. Będziemy więc tworzyć kolejne prostokąty, coraz bardziej zbliżone do poszukiwanej figury. Załóżmy, że pierwiastkujemy pewną liczbę c, a pierwszy wielokąt wyglądać będzie następująco:

RmarJ3ppOrDmp
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Na podstawie długości boków prostokąta wyliczać będziemy kolejne poszukiwane wartości. Zapiszmy więc funkcję odpowiedzialną za proces wyszukiwania docelowej długości boku a kwadratu. Pamiętajmy, że jedną z niezbędnych zmiennych będzie również precyzja, której rolą zajmiemy się w następnym kroku. Na razie w funkcji znajdą się jedynie założenia początkowe, dotyczące długości boków pierwszego prostokąta.

Linia 1. double pierwiastkowanie otwórz nawias okrągły double pierwiastkowany przecinek double precyzja zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. double a znak równości pierwiastkowany prawy ukośnik 2 przecinek. Linia 3. b znak równości pierwiastkowany prawy ukośnik a średnik. Linia 4. zamknij nawias klamrowy.

Tworzymy pętlę odpowiedzialną za wyliczanie kolejnych długości boków wielokątów. Operację tę przeprowadzamy do momentu, gdy wartość bezwzględna różnicy pomiędzy długościami obu boków będzie mniejsza niż zadana precyzja. Im mniejszą wartość zmiennej precyzja ustalimy, tym wynik będzie dokładniejszy. Długości boków prostokątów wyliczamy w następujący sposób:

a=(a+b)2
b=ca

Mając już niezbędne informacje, możemy przejść do dokończenia funkcji. Powtarzanie przedstawionych operacji, dopóki nie spełnimy wspomnianego warunku dotyczącego precyzji i różnicy boków, oznacza konieczność zastosowania pętli. Dodatkowo w warunku zastosujemy wartość bezwzględną. Użyjemy funkcji fabs z biblioteki cmathcmathcmath.

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 2. kratka include otwórz nawias ostrokątny cmath zamknij nawias ostrokątny. Linia 3. using namespace std średnik. Linia 5. double pierwiastkowanie otwórz nawias okrągły double pierwiastkowany przecinek double precyzja zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. double a znak równości pierwiastkowany prawy ukośnik 2 przecinek. Linia 7. b znak równości pierwiastkowany prawy ukośnik a średnik. Linia 9. while otwórz nawias okrągły fabs otwórz nawias okrągły a minus b zamknij nawias okrągły zamknij nawias ostrokątny precyzja zamknij nawias okrągły otwórz nawias klamrowy. Linia 10. a znak równości otwórz nawias okrągły a plus b zamknij nawias okrągły prawy ukośnik 2 średnik. Linia 11. b znak równości pierwiastkowany prawy ukośnik a średnik. Linia 12. zamknij nawias klamrowy. Linia 13. return a średnik. Linia 14. zamknij nawias klamrowy.

Teraz wystarczy już tylko pobrać od użytkownika pierwiastkowaną liczbę oraz żądaną precyzję. Po wywołaniu funkcji otrzymamy wypisany przybliżony wynik pierwiastkowania kwadratowego.

Linia 1. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. double c przecinek p średnik. Linia 3. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Wprowadz liczbe do pierwiastkowania cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 4. cin zamknij nawias ostrokątny zamknij nawias ostrokątny c średnik. Linia 5. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Wprowadz precyzje cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 6. cin zamknij nawias ostrokątny zamknij nawias ostrokątny p średnik. Linia 7. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Wynik pierwiastkowania cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 8. cout otwórz nawias ostrokątny otwórz nawias ostrokątny pierwiastkowanie otwórz nawias okrągły c przecinek p zamknij nawias okrągły średnik. Linia 9. return 0 średnik. Linia 10. zamknij nawias klamrowy.

Cały program prezentuje się następująco:

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 2. kratka include otwórz nawias ostrokątny cmath zamknij nawias ostrokątny. Linia 3. using namespace std średnik. Linia 5. double pierwiastkowanie otwórz nawias okrągły double pierwiastkowany przecinek double precyzja zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. double a znak równości pierwiastkowany prawy ukośnik 2 przecinek. Linia 7. b znak równości pierwiastkowany prawy ukośnik a średnik. Linia 9. while otwórz nawias okrągły fabs otwórz nawias okrągły a minus b zamknij nawias okrągły zamknij nawias ostrokątny precyzja zamknij nawias okrągły otwórz nawias klamrowy. Linia 10. a znak równości otwórz nawias okrągły a plus b zamknij nawias okrągły prawy ukośnik 2 średnik. Linia 11. b znak równości pierwiastkowany prawy ukośnik a średnik. Linia 12. zamknij nawias klamrowy. Linia 13. return a średnik. Linia 14. zamknij nawias klamrowy. Linia 16. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 17. double c przecinek p średnik. Linia 18. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Wprowadz liczbe do pierwiastkowania cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 19. cin zamknij nawias ostrokątny zamknij nawias ostrokątny c średnik. Linia 20. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Wprowadz precyzje cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 21. cin zamknij nawias ostrokątny zamknij nawias ostrokątny p średnik. Linia 22. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Wynik pierwiastkowania cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 23. cout otwórz nawias ostrokątny otwórz nawias ostrokątny pierwiastkowanie otwórz nawias okrągły c przecinek p zamknij nawias okrągły średnik. Linia 24. return 0 średnik. Linia 25. zamknij nawias klamrowy.

W ten sposób zapisaliśmy algorytm Newtona‑Raphsona obliczania przybliżonej wartości pierwiastka kwadratowego z liczby nieujemnej w języku C++.

Słownik

cmath
cmath

używany w języku C++ nagłówek biblioteki przechowującej funkcje realizujące podstawowe operacje matematyczne, takie jak np. funkcje trygonometryczne, hiperboliczne czy zaokrąglenia; odpowiednikiem cmath w języku C jest nagłówek math.h (po dodaniu #include <cmath> funkcje stają się dostępne w programie); przykładem takiej funkcji jest funkcja fabs(x), która zwraca wartość bezwzględną liczby rzeczywistej x

metoda Newtona‑Raphsona
metoda Newtona‑Raphsona

(inaczej: metoda Newtona lub metoda stycznych) algorytm wyznaczania wartości pierwiastka funkcji oparty na wyliczaniu kolejnych przybliżeń coraz bliższych rzeczywistej wartości pierwiastka; metoda ta może być wykorzystywana między innymi do omawianego wyznaczania wartości pierwiastka kwadratowego

parametr
parametr

element składni w określonym języku programowania umożliwiający komunikację pomiędzy podprogramem wywołanym a programem wywołującym; parametry określa się wraz z deklaracją określonego podprogramu w jego nagłówku