Uwaga: przekonwertowane latex2mediawiki; prawdopodobnie trzeba wprowadzi? poprawki
{Ćwiczenia: równania nieliniowe skalarne}
[Metoda Newtona może być zbieżna globalnie]
Wykaż, że jeśli
jest rosnąca i wypukła na
oraz dla
, to metoda Newtona startująca z
jest zbieżna.
[Fraktale]
Ciekawy zbiór o charakterze fraktalnym powstaje w wyniku zastosowania metody
Newtona do rozwiązania równania
w dziedzinie zespolonej. Punkt
należy do basenu zbiezności metody, jeśli metoda Newtona jest
zeń zbieżna do (jakiegokolwiek) pierwiastka w/w równania. Kolor odpowiadający
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 jak poniżej.
{fraktal.png}{Basen zbiezności metody Newtona w okolicy początku układu
współrzędnych, dla równania
}
Wskazówka
Bardzo wygodnie napisać taki program w postaci skryptu Octave. Pamiętaj
jednak, by uniknąć w nim pętli w rodzaju
for xpixels = 1:1024
for ypixels = 1:768
... wyznacz kolor pixela ....
end
end
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!
Wskazówka
Kluczem do efektywnej implementacji w Octave jest przeprowadzenie
iteracji Newtona na wszystkich pikselach jednocześnie. W tym celu musisz
skorzystać z prowadzenia działań na całych macierzach.
[Pierwiastkowanie]
Niech
. Aby wyznaczyć
, można skorzystać z metody Newtona dla
równania
. 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
dla
którego to nie będzie prawdą.
Wskazówka
Na pewno kusi Cię, by zaprogramować najpierw ogólnie funkcję "metoda
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,
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)!
Rozwiązanie
Nasza iteracja, którą chcemy zaprogramować, to
Dla
, spełnione są założenia twierdzenia o zbieżności metody Newtona,
więc
co właśnie tłumaczy się jako podwajanie liczby dokładnych cyfr
znaczących wyniku.
Ale jeśli
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
.
[Odwrotność bez dzielenia]
Aby wyznaczyć
dla
bez dzielenia(!), można zastosować metodę Newtona
do funkcji
. Pokaż, że na
-tym kroku iteracji,
Dla jakich
metoda będzie zbieżna do
, a dla jakich nie?
Oceń, ile iteracji potrzeba do spełnienia warunku
, gdy
,
Rozwiązanie
Proste ćwiczenie z analizy. Warunkiem zbieżności jest oczywiście (ze względu na
równość w wyrażeniu na błąd iteracji powyżej)
, to znaczy
Zaimplementuj metodę bisekcji. Sprawdź, jak będzie działać m.in. dla funkcji
,
,
(wzór A),
(wzór B),
(wzór C),
(wzór D),
gdy tolerancję błędu zadasz na poziomie
.
Jak wyjaśnić te wyniki? Czy możesz już być pewna, że masz dobrą implementację?
Rozwiązanie
Jeśli nie pomylisz się, metoda powinna zbiegać bez problemów do zera funkcji
, dawać komunikat o błędzie dla
(bo nie ma przeciwnych znaków).
Zapewne zauważyłaś, ż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 w ogóle nie zawierają prawdziwego miejsca zerowego.
Wyjaśnieniem tego fenomenu jest zjawisko redukcji cyfr przy odejmowaniu.
{bisekcjawblad.png}{Metoda bisekcji ma kłopoty, gdy funkcja zadana jest
wzorem D.}
{bisekcjawresid.png}{Residuum też jest duże, gdy
zadana jest
wzorem D.}
Jeśli chodzi o pewność... No cóż, sprawdziłaś, że działa w przypadkach, gdy
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.
Wskaż wszystkie wartości
, dla jakich metoda Newtona będzie zbieżna
do rozwiązania
równania
Wyznacz wartość
, z którego startując powinieneś dostać ciąg oscylujący
.
Sprawdź eksperymentalnie, czy tak jest rzeczywiście.
Wskazówka
Aby znaleźć graniczne
, czyli takie, dla którego dostaniesz
oscylacje
, musisz rozwiązać równanie nieliniowe:
To łatwe.
Rozwiązanie
Dla
mamy zbieżność. Dla
oscylacje, dla
większych wartości --- rozbieżność. Jednak w eksperymencie wszystko zależy od
tego, jak dokładnie wyznaczyliśmy
. Na przykład, mój solver w Octave
wyznaczył wartość
, dla której metoda Newtona dała następujący ciąg:
Iteracja: 1, x = -1.39175
Iteracja: 2, x = 1.39175
Iteracja: 3, x = -1.39175
Iteracja: 4, x = 1.39175
Iteracja: 5, x = -1.39175
.. itd ..
Iteracja: 25, x = -1.39176
Iteracja: 26, x = 1.39178
Iteracja: 27, x = -1.39183
Iteracja: 28, x = 1.39197
Iteracja: 29, x = -1.39235
Iteracja: 30, x = 1.39333
Iteracja: 31, x = -1.39594
Iteracja: 32, x = 1.40283
Iteracja: 33, x = -1.42117
Iteracja: 34, x = 1.47061
Iteracja: 35, x = -1.60867
Iteracja: 36, x = 2.03161
Iteracja: 37, x = -3.67722
Iteracja: 38, x = 15.2779
Iteracja: 39, x = -337.619
Iteracja: 40, x = 178376
Iteracja: 41, x = -4.99792e+10
Iteracja: 42, x = 3.92372e+21
Iteracja: 43, x = -2.41834e+43
Iteracja: 44, x = 9.18658e+86
Iteracja: 45, x = -1.32565e+174
Iteracja: 46, x = inf
Iteracja: 47, x = nan