MN02LAB: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Przykry (dyskusja | edycje)
mNie podano opisu zmian
 
m Zastępowanie tekstu – „.↵</math>” na „</math>”
 
(Nie pokazano 10 wersji utworzonych przez 3 użytkowników)
Linia 1: Linia 1:
<!--
Konwertowane  z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/&nbsp;pawlik1/latex2mediawiki.php.
Niezb�dne rozszerzenia i modyfikacje oryginalnego latex2mediawiki
wprowadzi� przykry@mimuw.edu.pl
-->
=Równania nieliniowe skalarne=


==Ćwiczenia: równania nieliniowe skalarne==
{{powrot |Metody numeryczne | do strony głównej
przedmiotu <strong>Metody numeryczne</strong>}}
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
Oglądaj wskazówki i rozwiązania __SHOWALL__<br>
Ukryj wskazówki i rozwiązania __HIDEALL__
</div>


<div style="margin-top:1em; padding-top,padding-bottom:1em;">
<div style="margin-top:1em; padding-top,padding-bottom:1em;">
Linia 6: Linia 19:
<div class="exercise">
<div class="exercise">


Wykaż, że jeśli <math>\displaystyle f</math> jest rosnąca i wypukła na <math>\displaystyle [a,b]</math> oraz dla <math>\displaystyle x^*\in [a,b]\displaystyle f(x^*) = 0</math>, to metoda Newtona startująca z <math>\displaystyle x_0>x^*</math> jest zbieżna.
Wykaż, że jeśli <math>f</math> jest rosnąca i wypukła na <math>[a,b]</math> oraz dla <math>x^*\in [a,b]f(x^*) = 0</math>, to metoda Newtona startująca z <math>x_0>x^*</math> jest zbieżna.
</div></div>
</div></div>


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em">   
Powtarzając rachunki z dowodu lokalnej zbieżności, możemy łatwo stwierdzić, że kolejne
Powtarzając rachunki z dowodu lokalnej zbieżności, możemy łatwo stwierdzić, że kolejne
iteracje dają <math>\displaystyle x_k</math> które także spełniają warunek <math>\displaystyle x_k - x^* > 0</math>. Ponadto
iteracje dają <math>x_k</math>, które także spełniają warunek <math>x_k - x^* > 0</math>. Ponadto
nietrudno sprawdzić, że <math>\displaystyle x_{k+1} < x_k</math>, a więc mamy ciąg malejący i
nietrudno sprawdzić, że <math>x_{k+1} < x_k</math>, a więc mamy ciąg malejący i
ograniczony. Jego granicą musi być <math>\displaystyle x^*</math> (dlaczego?).
ograniczony. Jego granicą musi być <math>x^*</math> (dlaczego?).
</div></div></div>
</div></div></div>


Linia 21: Linia 34:


Ciekawy zbiór o charakterze fraktalnym powstaje w wyniku zastosowania metody
Ciekawy zbiór o charakterze fraktalnym powstaje w wyniku zastosowania metody
Newtona do rozwiązania równania <math>\displaystyle z^n-1=0</math> w dziedzinie zespolonej. Punkt <math>\displaystyle z_0 =
Newtona do rozwiązania równania <math>z^n-1=0</math> w dziedzinie zespolonej. Punkt <math>z_0 =
(x_0,y_0)</math> należy do ''basenu zbiezności metody'', jeśli metoda Newtona jest
(x_0,y_0)</math> należy do <strong>basenu zbieżności metody</strong>, jeśli startująca z niego metoda Newtona jest zbieżna do (jakiegokolwiek) pierwiastka w/w równania. Kolor odpowiadający <math>z_0</math> jest określany na podstawie liczby iteracji potrzebnych metodzie do
zeń zbieżna do (jakiegokolwiek) pierwiastka w/w równania. Kolor odpowiadający
<math>\displaystyle z_0</math> jest określany na podstawie liczby iteracji potrzebnych metodzie do
zbieżności.
zbieżności.


Zupełnie miłym (i estetycznie wartościowym) doświadczeniem, jest napisanie
Zupełnie miłym (i estetycznie wartościowym) doświadczeniem jest napisanie
programu w Octave, który wyświetla baseny zbieżności metody Newtona jak poniżej.
programu w Octave, który wyświetla baseny zbieżności metody Newtona, takie jak na rysunku poniżej.


[[Image:MNfraktal.png|thumb|300px|Basen zbiezności metody Newtona w okolicy początku układu
[[Image:MNfraktal.png|thumb|550px|center|Basen zbieżności metody Newtona w okolicy początku układu
współrzędnych, dla równania <math>\displaystyle z^5-1=0</math>]]
współrzędnych, dla równania <math>z^5-1=0</math>]]


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">
<div style="font-size:smaller; background-color:#efe"> Bardzo wygodnie napisać taki program w postaci skryptu Octave. Pamiętaj
<div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> Bardzo wygodnie napisać taki program w postaci skryptu Octave. Pamiętaj jednak, by uniknąć w nim pętli w rodzaju
jednak, by uniknąć w nim pętli w rodzaju


<div class="code" style="background-color:#e8e8e8; padding:1em"><pre>
<code style="color: #006">for xpixels = 1:1024, for ypixels = 1:768,... wyznacz kolor pixela ....</code>
 
for xpixels <nowiki>=</nowiki> 1:1024
Taka podwójnie zagnieżdżona pętla może skutecznie zniechęcić Cię do Octave'a --- obrazek będzie liczyć się wieki --- zupełnie niepotrzebnie!  
for ypixels <nowiki>=</nowiki> 1:768
... wyznacz kolor pixela ....
end
end
</pre></div>
Taka podwójnie zagnieżdżona pętla może skutecznie zniechęcić Cię do  
Octave'a --- obrazek będzie liczyć się wieki --- zupełnie niepotrzebnie!  
  </div>
  </div>
</div></div>
</div></div>


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">
<div style="font-size:smaller; background-color:#efe"> Kluczem do efektywnej implementacji w Octave jest przeprowadzenie
<div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> Kluczem do efektywnej implementacji w Octave jest przeprowadzenie iteracji Newtona na <strong>wszystkich pikselach jednocześnie</strong>. W tym celu musisz skorzystać z prowadzenia działań na całych macierzach. </div>
iteracji Newtona na ''wszystkich pikselach jednocześnie''. W tym celu musisz
skorzystać z prowadzenia działań na całych macierzach. </div>
</div></div>
</div></div>


Linia 63: Linia 63:
<div class="exercise">
<div class="exercise">


Niech <math>\displaystyle a\geq 0</math>. Aby wyznaczyć <math>\displaystyle \sqrt{a}</math>, można skorzystać z metody Newtona dla
Niech <math>a\geq 0</math>. Aby wyznaczyć <math>\sqrt{a}</math>, można skorzystać z metody Newtona dla
równania <math>\displaystyle x^2 = a</math>. Zaprogramuj tę metodę i sprawdź, jak wiele dokładnych cyfr
równania <math>x^2 = a</math>. Zaprogramuj tę metodę i sprawdź, jak wiele dokładnych cyfr
wyniku dostajesz w kolejnych krokach. Czy to możliwe, by liczba dokładnych cyfr
wyniku dostajesz w kolejnych krokach. Czy to możliwe, by liczba dokładnych cyfr
znaczących z grubsza podwajała się na każdej iteracji? Wskaż takie <math>\displaystyle a</math> dla
znaczących z grubsza podwajała się na każdej iteracji? Wskaż takie <math>a</math>, dla
którego to nie będzie prawdą.
którego to nie będzie prawdą.


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">
<div style="font-size:smaller; background-color:#efe"> Na pewno kusi Cię, by zaprogramować najpierw ogólnie funkcję "metoda
<div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> Na pewno kusi Cię, by zaprogramować najpierw ogólnie funkcję "metoda Newtona", a następnie przekazać jej jako parametr naszą funkcję. Jednak gdy prostu wyliczysz na karteczce wzór na iterację dla <strong>tej konkretnej funkcji, <math>F(x) = x^2-a</math></strong>, będziesz miał szansę dokonać większych optymalizacji. </div>
Newtona", a następnie przekazać jej jako parametr naszą funkcję. To oczywiście
będzie działać, i to praktycznie tak samo szybko jak drugi spsoób, w którym po prostu
wyliczysz na karteczce wzór na iterację dla ''tej konkretnej funkcji, <math>\displaystyle F(x) =
x^2-a</math>'' i potem go zaimplementujesz. Jednak
drugie podejście jest tutaj godne polecenia, bo ma na sobie znak charakterystyczny dla numeryki: niech
wszystko, co programujesz będzie tak proste, jak tylko możliwe (ale nie
prostsze)! </div>
</div></div>
</div></div>


Linia 84: Linia 77:
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em">   
Nasza iteracja, którą chcemy zaprogramować, to
Nasza iteracja, którą chcemy zaprogramować, to
<center><math>\displaystyle
<center><math>
x_{k+1} = \frac{1}{2}\left( x_k + \frac{a}{x_k}\right).
x_{k+1} = \frac{1}{2}\left( x_k + \frac{a}{x_k}\right)</math></center>
</math></center>


Dla <math>\displaystyle a\neq 0</math>, spełnione są założenia twierdzenia o zbieżności metody Newtona,
Jest to, znana już w starożytności, <strong>metoda Herona</strong>. Teraz jest jasne, dlaczego zbiega tak szybko do <math>\sqrt{a}</math>.
Dla <math>a\neq 0</math>, spełnione są założenia twierdzenia o zbieżności metody Newtona,
więc
więc


<center><math>\displaystyle |x_{k+1}-x^*|\leq K |x_{k}-x^*|^2
<center><math>|x_{k+1}-x^*|\leq K |x_{k}-x^*|^2
</math></center>
</math></center>


co właśnie tłumaczy się jako podwajanie liczby dokładnych cyfr
co właśnie tłumaczy się jako podwajanie liczby dokładnych cyfr znaczących wyniku po każdej iteracji.
znaczących wyniku.
 
Ale jeśli <math>a=0</math>, to metoda zbieżna jest już tylko liniowo (z ilorazem 0.5 --- bo jaki wtedy jest wzór na iterację?); dlatego kolejną dokładną cyfrę wyniku <math>x^*=0</math> będziemy dostawali co mniej więcej trzy kroki... Zbieżność będzie ''powolna!'' (Na szczęście, gdy <math>a=0</math>, nie ma żadnego problemu z podaniem ''dokładnego'' rozwiązania...)
 
Nie dyskutujemy tutaj sposobu doboru właściwego punktu startowego dla metody: na razie wiadomo, że musi być "dostatecznie blisko" rozwiązania. Czy jesteś w stanie sprawdzić --- wypisując bardziej precyzyjne oszacowanie błędu (zob. dowód twierdzenia o zbieżności) --- jakie <math>x_0</math> na pewno jest "dostatecznie blisko" rozwiązania?


Ale jeśli <math>\displaystyle a=0</math> to metoda zbieżna jest już tylko liniowo (z ilorazem 0.5 --- bo
jaki wtedy jest wzór na iterację?), więc co mniej więcej trzy kroki będziemy
dostawali kolejne zero dokładnego wyniku <math>\displaystyle x^*=0</math>.
</div></div></div>
</div></div></div>


Linia 107: Linia 99:
<div class="exercise">
<div class="exercise">


Aby wyznaczyć <math>\displaystyle 1/a</math> dla <math>\displaystyle a>0</math> bez dzielenia(!), można zastosować metodę Newtona
Aby wyznaczyć <math>1/a</math> dla <math>a>0</math> bez dzielenia(!), można zastosować metodę Newtona
do funkcji <math>\displaystyle f(x) = 1/x - a</math>. Pokaż, że na <math>\displaystyle k</math>-tym kroku iteracji,
do funkcji <math>f(x) = 1/x - a</math>. Pokaż, że na <math>k</math>-tym kroku iteracji,
<center><math>\displaystyle
<center><math>
|ax_k - 1| = |ax_{k-1} - 1|^2.
|ax_k - 1| = |ax_{k-1} - 1|^2</math></center>
</math></center>


Dla jakich <math>\displaystyle x_0</math> metoda będzie zbieżna do <math>\displaystyle \frac{1}{a}</math>, a dla jakich nie?
Dla jakich <math>x_0</math> metoda będzie zbieżna do <math>\frac{1}{a}</math>, a dla jakich nie?
Oceń, ile iteracji potrzeba do spełnienia warunku <math>\displaystyle \frac{|x_k-\frac{1}{a}|}{|a|} \leq
Oceń, ile iteracji potrzeba do spełnienia warunku <math>\frac{|x_k-\frac{1}{a}|}{|a|} \leq
\epsilon</math>, gdy <math>\displaystyle \frac{|x_0-\frac{1}{a}|}{|a|} \leq \gamma < 1</math>,
\epsilon</math>, gdy <math>\frac{|x_0-\frac{1}{a}|}{|a|} \leq \gamma < 1</math>,
</div></div>
</div></div>


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em">   
Proste ćwiczenie z analizy. Warunkiem zbieżności jest oczywiście (ze względu na
Proste ćwiczenie z [[Analiza_matematyczna_1|analizy matematycznej]]. Warunkiem zbieżności jest oczywiście (ze względu na
równość w wyrażeniu na błąd iteracji powyżej) <math>\displaystyle |ax_0 - 1| < 1</math>, to znaczy  
równość w wyrażeniu na błąd iteracji powyżej) <math>|ax_0 - 1| < 1</math>, to znaczy  
<center><math>\displaystyle 0 < x_0 < \frac{2}{a}.</math></center>
<center><math>0 < x_0 < \frac{2}{a}</math>.</center>


</div></div></div>
</div></div></div>
Linia 130: Linia 121:


Zaimplementuj metodę bisekcji. Sprawdź, jak będzie działać m.in. dla funkcji
Zaimplementuj metodę bisekcji. Sprawdź, jak będzie działać m.in. dla funkcji
* <math>\displaystyle f(x) = \sin(x)</math>,
* <math>f(x) = \sin(x)</math>,
* <math>\displaystyle f(x) = \sin^2(x)</math>,
* <math>f(x) = \sin^2(x)</math>,
* <math>\displaystyle f(x) = (x-1)^5</math> (wzór A),
* <math>f(x) = (x-1)^5</math> (wzór A),
* <math>\displaystyle f(x) = (x-1)*(x^4 - 4x^3 + 6x^2 - 4x + 1)</math> (wzór B),
* <math>f(x) = (x-1)\cdot (x^4 - 4x^3 + 6x^2 - 4x + 1)</math> (wzór B),
* <math>\displaystyle f(x) = (x-2)^13</math> (wzór C),
* <math>f(x) = (x-2)^{13}</math> (wzór C),
* <math>\displaystyle f(x) = x^13 - 26*x^12 + 312*x^11 - 2288*x^10 + ... - 8192</math> (wzór D),
* <math>f(x) = x^{13} - 26x^{12} + 312x^{11} - 2288x^{10} + ... - 8192</math> (wzór D),
   
   
gdy tolerancję błędu zadasz na poziomie <math>\displaystyle 10^{-10}</math>.
gdy tolerancję błędu zadasz na poziomie <math>10^{-10}</math>.


Jak wyjaśnić te wyniki? Czy możesz już być pewna, że masz dobrą implementację?
[[Image:MNbisekcjawblad.png|thumb|550px|center|Metoda bisekcji ma kłopoty, gdy funkcja zadana jest
wzorem D.]]
[[Image:MNbisekcjawresid.png|thumb|550px|center|Residuum też jest duże, gdy <math>f</math> zadana jest
wzorem D.]]
 
Jak wyjaśnić te wyniki? Czy możesz już być pewien, że masz dobrą implementację?


</div></div>
</div></div>
Linia 146: Linia 142:


Jeśli nie pomylisz się, metoda powinna zbiegać bez problemów do zera funkcji
Jeśli nie pomylisz się, metoda powinna zbiegać bez problemów do zera funkcji
<math>\displaystyle \sin</math>, dawać komunikat o błędzie dla <math>\displaystyle \sin^2</math> (bo nie ma przeciwnych znaków).
<math>\sin(x)</math>, dawać komunikat o błędzie dla <math>\sin^2(x)</math> (bo nie ma przeciwnych znaków).


Zapewne zauważyłaś, że wzory A i B są matematycznie równoważne, podobnie zresztą
Zapewne zauważyłeś, że wzory A i B są matematycznie równoważne, podobnie zresztą jak wzory C i D. Niestety, tylko wzór A i C dają w efekcie dobre przybliżenia miejsca zerowego, podczas gdy wzory B i D prowadzą do oszacowania na miejsce zerowe, które <strong>w ogóle nie zawierają</strong> prawdziwego miejsca zerowego.
jak wzory C i D. Niestety, tylko wzór A i C dają w efekcie dobre przybliżenia
miejsca zerowego, podczas gdy wzory B i D prowadzą do oszacowania na miejsce
zerowe, które ''w ogóle nie zawierają'' prawdziwego miejsca zerowego.


Wyjaśnieniem tego fenomenu jest zjawisko redukcji cyfr przy odejmowaniu.
Wyjaśnieniem tego fenomenu jest zjawisko redukcji cyfr przy odejmowaniu, o którym mowa w następnym wykładzie.


[[Image:MNbisekcjawblad.png|thumb|300px|Metoda bisekcji ma kłopoty, gdy funkcja zadana jest
Jeśli chodzi o pewność... No cóż, sprawdziłeś, że <strong>działa</strong> w przypadkach,
wzorem D.]]
dla których oczekiwałeś, że będzie działać. Że tam, gdzie spodziewałeś się
[[Image:MNbisekcjawresid.png|thumb|300px|Residuum też jest duże, gdy <math>\displaystyle f</math> zadana jest
kłopotów, lub komunikatu o błędzie --- tak rzeczywiście się stało. Wreszcie,
wzorem D.]]
potwierdziłeś, że zachowanie metody jest zgodne z jej znanymi właściwościami.


Jeśli chodzi o pewność... No cóż, sprawdziłaś, że działa w przypadkach, gdy
Tak więc, można <strong>przypuszczać</strong>, że implementacja jest poprawna....
spodziewałaś się, że będzie działać. Że tam, gdzie spodziewałaś się kłopotów,
lub komunikatu o błędzie --- tak rzeczywiście się stało. Wreszcie,
potwierdziłaś, że zachowanie metody jest zgodne z jej znanymi właściwościami.
 
Tak więc, można ''przypuszczać'', że implementacja jest poprawna.


</div></div></div>
</div></div></div>
Linia 173: Linia 161:
<div class="exercise">
<div class="exercise">


Wskaż ''wszystkie'' wartości <math>\displaystyle x_0</math>, dla jakich metoda Newtona będzie zbieżna
Wskaż <strong>wszystkie</strong> wartości <math>x_0</math>, dla jakich metoda Newtona będzie zbieżna
do rozwiązania <math>\displaystyle x^*</math> równania
do rozwiązania <math>x^*</math> równania


<center><math>\displaystyle \arctan(x) = 0.
<center><math>\arctan(x) = 0</math></center>
</math></center>


Wyznacz wartość <math>\displaystyle X_0</math>, z którego startując powinieneś dostać ciąg oscylujący <math>\displaystyle X_0, -X_0,\ldots</math>.
Wyznacz wartość <math>X_0</math>, z którego startując powinieneś dostać ciąg oscylujący <math>X_0, -X_0,\ldots</math>.
Sprawdź eksperymentalnie, czy tak jest rzeczywiście.
Sprawdź eksperymentalnie, czy tak jest rzeczywiście.


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">
<div style="font-size:smaller; background-color:#efe"> Aby znaleźć graniczne <math>\displaystyle X_0</math>, czyli takie, dla którego dostaniesz
<div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> Aby znaleźć graniczne <math>X_0</math>, czyli takie, dla którego dostaniesz oscylacje <math>X_0, -X_0,\ldots</math>,  musisz rozwiązać równanie nieliniowe:
oscylacje <math>\displaystyle X_0, -X_0,\ldots</math>,  musisz rozwiązać równanie nieliniowe:


<center><math>\displaystyle -X_0 = X_0 - \frac{\arctan(X_0)}{\frac{1}{1+X_0^2}}.
<center><math>-X_0 = X_0 - \frac{\arctan(X_0)}{\frac{1}{1+X_0^2}}</math></center>
</math></center>


To łatwe.
To łatwe.
Linia 196: Linia 181:


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em">   
Dla <math>\displaystyle -X_0 < x_0 < X_0</math> mamy zbieżność. Dla <math>\displaystyle |x_0| = |X_0|</math> oscylacje, dla
Dla <math>-X_0 < x_0 < X_0</math> mamy zbieżność. Dla <math>|x_0| = |X_0|</math> oscylacje, dla
większych wartości --- rozbieżność. Jednak w eksperymencie wszystko zależy od
większych wartości --- rozbieżność. Jednak w eksperymencie wszystko zależy od
tego, jak dokładnie wyznaczyliśmy <math>\displaystyle X_0</math>. Na przykład, mój solver w Octave
tego, jak dokładnie wyznaczyliśmy <math>X_0</math>. Na przykład, funkcja <code style="color: #006">fzero</code> w Octave
wyznaczył wartość <math>\displaystyle X_0</math>, dla której metoda Newtona dała następujący ciąg:
wyznaczyła (przy standardowych ustawieniach) numeryczne przybliżenie <math>X_0</math>, dla którgo metoda Newtona dała następujący ciąg:
<div class="output" style="background-color:#e0e8e8; padding:1em"><pre>
<div style="font-family: monospace; white-space: pre; border-style: dashed; border-width: thin; border-color: black; margin: 1em; padding:1em; color: #444; background-color:#fdfdfd;"><nowiki>Iteracja:  1,  x = -1.39175
Iteracja:  2,  x = 1.39175
Iteracja:  1,  x <nowiki>=</nowiki> -1.39175
Iteracja:  3,  x = -1.39175
Iteracja:  2,  x <nowiki>=</nowiki> 1.39175
Iteracja:  4,  x = 1.39175
Iteracja:  3,  x <nowiki>=</nowiki> -1.39175
Iteracja:  5,  x = -1.39175
Iteracja:  4,  x <nowiki>=</nowiki> 1.39175
Iteracja:  5,  x <nowiki>=</nowiki> -1.39175


.. itd ..
.. itd ..


Iteracja:  25,  x <nowiki>=</nowiki> -1.39176
Iteracja:  25,  x = -1.39176
Iteracja:  26,  x <nowiki>=</nowiki> 1.39178
Iteracja:  26,  x = 1.39178
Iteracja:  27,  x <nowiki>=</nowiki> -1.39183
Iteracja:  27,  x = -1.39183
Iteracja:  28,  x <nowiki>=</nowiki> 1.39197
Iteracja:  28,  x = 1.39197
Iteracja:  29,  x <nowiki>=</nowiki> -1.39235
Iteracja:  29,  x = -1.39235
Iteracja:  30,  x <nowiki>=</nowiki> 1.39333
Iteracja:  30,  x = 1.39333
Iteracja:  31,  x <nowiki>=</nowiki> -1.39594
Iteracja:  31,  x = -1.39594
Iteracja:  32,  x <nowiki>=</nowiki> 1.40283
Iteracja:  32,  x = 1.40283
Iteracja:  33,  x <nowiki>=</nowiki> -1.42117
Iteracja:  33,  x = -1.42117
Iteracja:  34,  x <nowiki>=</nowiki> 1.47061
Iteracja:  34,  x = 1.47061
Iteracja:  35,  x <nowiki>=</nowiki> -1.60867
Iteracja:  35,  x = -1.60867
Iteracja:  36,  x <nowiki>=</nowiki> 2.03161
Iteracja:  36,  x = 2.03161
Iteracja:  37,  x <nowiki>=</nowiki> -3.67722
Iteracja:  37,  x = -3.67722
Iteracja:  38,  x <nowiki>=</nowiki> 15.2779
Iteracja:  38,  x = 15.2779
Iteracja:  39,  x <nowiki>=</nowiki> -337.619
Iteracja:  39,  x = -337.619
Iteracja:  40,  x <nowiki>=</nowiki> 178376
Iteracja:  40,  x = 178376
Iteracja:  41,  x <nowiki>=</nowiki> -4.99792e+10
Iteracja:  41,  x = -4.99792e+10
Iteracja:  42,  x <nowiki>=</nowiki> 3.92372e+21
Iteracja:  42,  x = 3.92372e+21
Iteracja:  43,  x <nowiki>=</nowiki> -2.41834e+43
Iteracja:  43,  x = -2.41834e+43
Iteracja:  44,  x <nowiki>=</nowiki> 9.18658e+86
Iteracja:  44,  x = 9.18658e+86
Iteracja:  45,  x <nowiki>=</nowiki> -1.32565e+174
Iteracja:  45,  x = -1.32565e+174
Iteracja:  46,  x <nowiki>=</nowiki> inf
Iteracja:  46,  x = inf
Iteracja:  47,  x <nowiki>=</nowiki> nan
Iteracja:  47,  x = nan
</pre></div>
</nowiki></div>
   
   
</div></div></div>
</div></div></div>

Aktualna wersja na dzień 21:35, 11 wrz 2023


Równania nieliniowe skalarne

<<< Powrót do strony głównej przedmiotu Metody numeryczne

Oglądaj wskazówki i rozwiązania __SHOWALL__
Ukryj wskazówki i rozwiązania __HIDEALL__

Ćwiczenie: Metoda Newtona może być zbieżna globalnie

Wykaż, że jeśli f jest rosnąca i wypukła na [a,b] oraz dla x*[a,b]f(x*)=0, to metoda Newtona startująca z x0>x* jest zbieżna.

Rozwiązanie

Ćwiczenie: Fraktale

Ciekawy zbiór o charakterze fraktalnym powstaje w wyniku zastosowania metody Newtona do rozwiązania równania zn1=0 w dziedzinie zespolonej. Punkt z0=(x0,y0) należy do basenu zbieżności metody, jeśli startująca z niego metoda Newtona jest zbieżna do (jakiegokolwiek) pierwiastka w/w równania. Kolor odpowiadający z0 jest określany na podstawie liczby iteracji potrzebnych metodzie do zbieżności.

Zupełnie miłym (i estetycznie wartościowym) doświadczeniem jest napisanie programu w Octave, który wyświetla baseny zbieżności metody Newtona, takie jak na rysunku poniżej.

Basen zbieżności metody Newtona w okolicy początku układu współrzędnych, dla równania z51=0
Wskazówka
Wskazówka

Ćwiczenie: Pierwiastkowanie

Niech a0. Aby wyznaczyć a, można skorzystać z metody Newtona dla równania x2=a. Zaprogramuj tę metodę i sprawdź, jak wiele dokładnych cyfr wyniku dostajesz w kolejnych krokach. Czy to możliwe, by liczba dokładnych cyfr znaczących z grubsza podwajała się na każdej iteracji? Wskaż takie a, dla którego to nie będzie prawdą.

Wskazówka
Rozwiązanie

Ćwiczenie: Odwrotność bez dzielenia

Aby wyznaczyć 1/a dla a>0 bez dzielenia(!), można zastosować metodę Newtona do funkcji f(x)=1/xa. Pokaż, że na k-tym kroku iteracji,

|axk1|=|axk11|2

Dla jakich x0 metoda będzie zbieżna do 1a, a dla jakich nie? Oceń, ile iteracji potrzeba do spełnienia warunku |xk1a||a|ϵ, gdy |x01a||a|γ<1,

Rozwiązanie

Ćwiczenie

Zaimplementuj metodę bisekcji. Sprawdź, jak będzie działać m.in. dla funkcji

  • f(x)=sin(x),
  • f(x)=sin2(x),
  • f(x)=(x1)5 (wzór A),
  • f(x)=(x1)(x44x3+6x24x+1) (wzór B),
  • f(x)=(x2)13 (wzór C),
  • f(x)=x1326x12+312x112288x10+...8192 (wzór D),

gdy tolerancję błędu zadasz na poziomie 1010.

Metoda bisekcji ma kłopoty, gdy funkcja zadana jest wzorem D.
Residuum też jest duże, gdy f zadana jest wzorem D.

Jak wyjaśnić te wyniki? Czy możesz już być pewien, że masz dobrą implementację?

Rozwiązanie

Ćwiczenie

Wskaż wszystkie wartości x0, dla jakich metoda Newtona będzie zbieżna do rozwiązania x* równania

arctan(x)=0

Wyznacz wartość X0, z którego startując powinieneś dostać ciąg oscylujący X0,X0,. Sprawdź eksperymentalnie, czy tak jest rzeczywiście.

Wskazówka
Rozwiązanie