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.
Rozwiązanie
Powtarzając rachunki z dowodu lokalnej zbieżności, możemy łatwo stwierdzić, że kolejne
iteracje dają które także spełniają warunek . Ponadto
nietrudno sprawdzić, że , a więc mamy ciąg malejący i
ograniczony. Jego granicą musi być (dlaczego?).
[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.
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.
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