Pliki do wykorzystania w poniższym ćwiczeniu można pobrać za pomocą poniższych linków:
Celem ćwiczenia jest zapoznanie się z różnymi metodami numerycznymi służącymi do znajdowania miejsc zerowych funkcji matematycznych. W praktyce najczęściej niemożliwe jest znalezienie dokładnej wartości pierwiastka równania, więc tak naprawdę będziemy szukać coraz dokładniejszych przybliżeń tego pierwiastka. W tym celu posłużymy się metodą bisekcji, siecznych oraz stycznych. Wszystkie metody wymagają, aby funkcja, której miejsc zerowych szukamy, była ciągła.
W przypadku metody bisekcji korzystamy z faktu, że jeśli na końcach
pewnego przedziału liczbowego wartości funkcji są przeciwnych znaków,
gdzieś na tym odcinku funkcja ma miejsce zerowe (ta trywialna obserwacja
to tzw. twierdzenie Darboux, sformułowane przez francuskiego matematyka
Jeana Gastona Darboux (1842-1917)). Za pomocą tej metody rozwiążemy
równanie: \[
\cos(x) = x
\] Posłużymy się przygotowaną wcześniej funkcją
bisec
. W tym celu należy załączyć do projektu pliki
nonlin.h oraz nonlin.cpp. Funkcja bisec
ma nagłówek następującej postaci:
Funkcja zwraca przybliżenie miejsca zerowego równania. Wymagane są następujące argumenty:
a
i b
- krańce przedziału, w którym
szukamy rozwiązania,double (*pf)(double)
- wskaźnik do funkcji utworzonej
na podstawie rozwiązywanego równania,eps
- dokładność rozwiązania \(\varepsilon\),iter
- zmienna typu wskaźnikowego, która zawiera adres,
pod który zostanie zapisana liczba iteracji. Jeśli na obu końcach
przedziału \([a, b]\) funkcja przyjmuje
wartości tego samego znaku to zmienna, której adres zawiera
iter
będzie zawierać wartość -1
a funkcja
zwróci wartość 0
.double fun(double x)
, która będzie
zwracać wartość funkcji \(f(x)\)
uzyskaną z przekształcenia naszego równania do postaci \(f(x) = 0\).eps
oraz
krańce przedziału przeszukiwań a
i b
. Pamiętaj
o tym, że krańce muszą spełniać nierówność \(f(a) \cdot f(b) < 0\).bisec
a następnie wypisz na ekranie
znalezione miejsce zerowe oraz liczbę iteracji.Innymi metodami poszukiwania rozwiązań równań nieliniowych są metody stycznych oraz siecznych. W przypadku metody siecznych kolejne przybliżenie miejsca zerowego wyznacza się jako miejsca przecięcia odpowiedniej siecznej wykresu funkcji z osią odciętych. Dana sieczna przechodzi przez punkty z wykresu funkcji, których rzędne były poprzednimi przybliżeniami miejsca zerowego. Schemat iteracyjny ma następującą postać: \[ x_{i+1} = x_i - f(x_i) \frac{x_i-x_{i-1}}{f(x_i)-f(x_{i-1})} \]
W przypadku metody stycznych (zwanej też metodą Newtona) kolejne przybliżenia miejsca zerowego są przecięciami stycznych do wykresu funkcji z osią odciętych. Obliczenie kolejnych przybliżeń wymaga znajomości pochodnej funkcji. Schemat iteracyjny przybiera następującą postać: \[ x_{i+1} = x_i - \frac{f(x_i)}{f'(x_i)} \]
Metody rozwiązywania równań nieliniowych mogą być również użyte do znajdowania ekstremów funkcji. Spróbuj znaleźć ekstremum funkcji: \[ f(x) = (1 + x) \cdot \arctan(x) \]