W poniższych zadaniach przetestujemy jak działają cztery metody rozwiązywania równań nieliniowych skalarnych, tzn. metoda bisekcji, metoda Newtona, metoda siecznych i metoda iteracji prostych oraz
dwie metody rozwiązywania układów równań nieliniowych, czyli wielowymiarowa metoda Newtona i metoda iteracji prostych w najprostszej formie.
Zapoznamy się również z funkcjami octave'a fzero()
oraz fsolve()
służącymi do rozwiązywania równań nieliniowych skalarnych i układów równań nieliniowych.
- (#)
Zaimplementuj metodę bisekcji w skrypcie - dla rozwiązania równaniana odcinku
. Przetestuj, czy funkcja znajdzie dobre przybliżenie
.
- Przetestuj metodę bisekcji z poprzedniego zadania do rozwiązania innych problemów:
\begin{eqnarray*}
x^2-2=0 \\ \exp(x)=2 \\ \cos(10*x)=0
\end{eqnarray*}startując z odcinka
.
- Napisz funkcję octave'a:\\
function [y,iter,kod]=bisekcja(FCN,a,b,...
tola,maxit),której parametrami będą
-
wskaźnik do funkcji
FCN
(inaczej: function handle), -
- końce przedziału,
-
tola
- żądana tolerancja bezwzględna - błąd powinien być mniejszy odtola
, maxit
- maksymalna ilość iteracji.-
y
- przybliżone rozwiązanie, -
iter
- ilość iteracji, -
kod
- kod wyniku:
-
metoda zbiegła,
-
- metoda zatrzymała się z powodu przekroczenia maksymalnej ilości iteracji,
-
- wartości w końcach odcinka funkcji mają ten sam znak.
- Zapoznaj się z pomocą dla funkcji octave'a
fzero()
- rozwiązującą skalarne równania nieliniowe, przetestuj ją na kilku prostych przykładach skalarnych np.
,
-
,
-
,
-
- Zapoznaj się z pomocą dla funkcji octave'a
fsolve()
- rozwiązującą układy równań nieliniowych. Przetestuj ją na kilku prostych przykładach skalarnych, np. na tych z poprzedniego zadania. - (#)Zaimplementuj metodę Newtona w octavie i przetestuj jej zbieżność dla następujących funkcji:
- [ f1(x)=]
-
z
,
-
z
,
-
z
,
-
dla
,
-
z
-
x
dla
,
-
z
, sprawdź, czy metoda Newtona zbiega, a jeśli tak - to czy zbiega ona kwadratowo,
-
dla danych
(oczywiście implementując bez dzielenia) jak dobrać
?
Funkcja ma zwrócić
Funkcja ma działać również jeśli podamy tylko trzy lub cztery pierwsze argumenty - wtedy maksymalna ilość iteracji domyślnie powinna wynosić sto, a tolerancja .
i innych prostych równaniach nieliniowych.
Proszę przetestować tę funkcję dla różnych wartości początkowego przedziału .
Dla wszystkich tych funkcji znamy rozwiązania, więc można wyświetlać równocześnie na ekranie błąd
(tutaj - znane rozwiązanie) i badać eksperymentalnie rząd zbieżności, tzn. drukować na ekranie stosunki błędu bieżącego do poprzedniego w odpowiedniej potędze:
dla .
Proszę powtórzyć testy z innymi różnymi wartościami startowymi .
Przetestuj, czy
asymptotycznie zbiega do stałej, i czy
dla zbiega do stałej np. dla
z
lub innych równań z poprzedniego zadania.
Za możemy przyjąć
.
zbiega do .
Zbadaj eksperymentalnie, czy zbieżność jest liniowa, tzn. czy
zbiega do stałej. Za dobre przybliżenie można przyjąć rozwiązanie równania obliczone za pomocą wywołania funkcji octave'a:
fzero()
.
dla ustalonego .
Przetestuj różne , np.
itp.
Porównać zbieżność z dokładną metodą Newtona (szczególnie ostatnie iteracje) dla funkcji z zadania [link].
Dla funkcji zadanej w sposób uwikłany równaniem
znajdź przybliżone wartości dla
dla
i
, tzn. spełniające
.
Testuj dla różnych wartości , np.
.
oblicz rozwiązując równanie
korzystając z odpowiedniej funkcji octave'a lub własnej implementacji metody Newtona.
Jak w kolejnych krokach dobierać przybliżenie startowe w metodzie Newtona?
Rozpatrzmy daną funkcję, np.
Znajdź wartości funkcji odwrotnej na odcinku
na siatce
dla
. Narysuj wykres funkcji
.
Sam wykres można narysować dużo prościej bez wyliczania wartości . Jak to zrobić w octave'ie?
Zaimplementuj wielowymiarową metodę Newtona w wersji z dokładnym Jakobianem i w wersji, gdy Jakobian przybliżamy różnicami dzielonymi z parametrem .
Zastosuj tę metodę do rozwiązania układu
\begin{eqnarray*}
f_1(x_1,x_2)&=&x_1+2x_2=1\\
f_2(x_1,x_2)&=&3*x_1^2+x_2^2=1
\end{eqnarray*}
dla różnych przybliżeń początkowych.
W przypadku zbieżności policz
dla oraz
. Czy ten iloraz zbiega
do stałej dla jakiegoś z tych ?
Funkcję w octavie można zdefiniować następująco:
#x- wektor pionowy
y=[[1 2]*x-1;3.*x(1)*x(1)+x(2)*x(2)-1];
endfunction
Zastosuj metodę iteracji prostych
do układu z zadania [link], tzn. przyjmijmy, że , a parametr
np.
itp.
Czy metoda zawsze zbiega, a jeśli tak - to jak szybko?
W przypadku zbieżności policz
dla .
fsolve()
- porównaj z implementacją metody Newtona w zadaniu [link], która była zastosowana do rozwiązania tego układu.
Czy obie metody zbiegają do tego samego rozwiązania dla tych samych wartości wektorów startowych?
Sprawdź - za pomocą funkcji tic
i toc
- czas potrzebny do rozwiązania tego układu równań za pomocą obu metod.