MN03LAB: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Przykry (dyskusja | edycje)
mNie podano opisu zmian
Przykry (dyskusja | edycje)
Nie podano opisu zmian
Linia 1: Linia 1:
''Uwaga: przekonwertowane latex2mediawiki; prawdopodobnie trzeba wprowadzi? poprawki''


{Ćwiczenia: równania nieliniowe skalarne}
==Ćwiczenia. Własności arytmetyki zmiennopozycyjnej.==


{{cwiczenie|Metoda Newtona może być zbieżna globalnie||
{{cwiczenie|||
Podaj przykłady ''zbieżnych'' szeregów postaci <math>\displaystyle \sum_{n=1}^{\infty} a_n</math>, którego <math>\displaystyle N</math>-te sumy częściowe
obliczone w arytmetyce pojedynczej precyzji algorytmem
 
{{algorytm|||
<pre>
suma <nowiki>=</nowiki> 0.0;
for n <nowiki>=</nowiki> 1..N
suma +<nowiki>=</nowiki> <math>\displaystyle a_n</math>;
</pre>}}
 
będą
* ograniczone niezależnie od <math>\displaystyle N</math>, albo
* numerycznie rozbieżne, to znaczy takie, że dla bardzo dużych <math>\displaystyle N</math> zachodzi
<code>suma <nowiki>=</nowiki><nowiki>=</nowiki> Inf</code>.
Wykonaj to samo zadanie, ale podając przykłady szeregów  ''rozbieżnych'' (w
arytmetyce dokładnej).


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.
}}
}}


<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 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">   
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
nietrudno sprawdzić, że <math>\displaystyle 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?).
</div></div>


{{cwiczenie|Fraktale||
Rozpatrz na przykład takie szeregi zbieżne:
* Szereg zerowy (numerycznie dostajesz oczywiście też 0)
* <math>\displaystyle 1 + 10^{2006} - 10^{2006} + 0 + \ldots = 1</math> oraz <math>\displaystyle 1 + 10^{2006} - 1 + 0 + \ldots = 10^{2006}</math>


Ciekawy zbiór o charakterze fraktalnym powstaje w wyniku zastosowania metody
(numerycznie dostaniesz, odpowiednio, <code>NaN</code> (dlaczego?) i <code>Inf</code>.
Newtona do rozwiązania równania <math>\displaystyle z^n-1=0</math> w dziedzinie zespolonej. Punkt <math>\displaystyle z_0 =
* Szereg harmoniczny (numerycznie sumy częściowe w pewnym momencie przestaną
(x_0,y_0)</math> należy do ''basenu zbiezności metody'', jeśli metoda Newtona jest
rosnąć).
zeń zbieżna do (jakiegokolwiek) pierwiastka w/w równania. Kolor odpowiadający
* Szereg jedynkowy.
<math>\displaystyle z_0</math> jest określany na podstawie liczby iteracji potrzebnych metodzie do
zbieżności.
</div></div>


Zupełnie miłym (i estetycznie wartościowym) doświadczeniem, jest napisanie
{{cwiczenie|||
programu w Octave, który wyświetla baseny zbieżności metody Newtona jak poniżej.
Dla kolejnych <math>\displaystyle N</math>, wyznacz <math>\displaystyle N</math>-tą sumę częściową szeregu Taylora dla funkcji wykładniczej, gdy <math>\displaystyle x=-90</math>:
<center><math>\displaystyle
e^x \approx \sum_{n=0}^N \frac{x^n}{n!},
</math></center>


[[Image:fraktal.png|thumb|right|400px|Basen zbiezności metody Newtona w okolicy początku układu
korzystając z algorytmu podanego w poprzednim zadaniu. Porównaj błąd: względny
współrzędnych, dla równania <math>\displaystyle z^5-1=0</math>]]
i bezwzględny w porównaniu
do wartości wyznaczonej z wykorzystaniem funkcji bibliotecznej <code>exp()</code>. Powtórz następnie dla <math>\displaystyle x=10</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">
Czy --- zgodnie z teorią matematyczną --- sumy te dążą do wartości
Bardzo wygodnie napisać taki program w postaci skryptu Octave. Pamiętaj
<math>\displaystyle e^{x}</math>. Objaśnij dokładnie, co się stało.
jednak, by uniknąć w nim pętli w rodzaju
}}


for xpixels <nowiki>=</nowiki> 1:1024<br>
<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">
for ypixels <nowiki>=</nowiki> 1:768<br>
Zastosowanie naszego algorytmu dla <math>\displaystyle x=-90</math> daje w wyniku (dla arytmetyki
... wyznacz kolor pixela ....<br>
podwójnej precyzji) sumę równą około <math>\displaystyle 10^{30}</math>,
end<br>
gdy oczywiście naprawdę <math>\displaystyle \exp(-90)
end<br>
\approx 0</math>). Problem jest skutkiem zjawiska redukcji cyfr przy odejmowaniu: aby
nasza suma była równa zeru, w pewnym momencie musimy odjąć duży składnik od
innego podobnego, by w rezultacie dostać coś małego. Spróbuj wychwycić ten
moment i wartość dodawanego składnika.


Taka podwójnie zagnieżdżona pętla może skutecznie zniechęcić Cię do
Dla <math>\displaystyle x=10</math> mamy, dla rosnącego <math>\displaystyle N</math>, całkiem niezły błąd względny ostatecznego
Octave'a --- obrazek będzie liczyć się wieki --- zupełnie niepotrzebnie!
wyniku.


</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">
{{cwiczenie|||
Kluczem do efektywnej implementacji w Octave jest przeprowadzenie
Już wcześniej stwierdziliśmy, że wyznaczanie <math>\displaystyle e \approx (1 + 1/n)^n</math> dla dużego
iteracji Newtona na ''wszystkich pikselach jednocześnie''. W tym celu musisz
<math>\displaystyle n</math> nie jest dobrym pomysłem. Przeprowadź eksperyment numeryczny potwierdzający
skorzystać z prowadzenia działań na całych macierzach.
to stwierdzenie i objaśnij jego wyniki.  
</div></div>
 
}}
}}


{{cwiczenie|Pierwiastkowanie||
{{cwiczenie|||
Jak wiadomo, szereg harmoniczny <math>\displaystyle \sum_{n=1}^\infty 1/n</math> jest rozbieżny.
Spróbuj przewidzieć, jaki będzie efekt numerycznego wyznaczenia tej sumy w
arytmetyce podwójnej precyzji przy użyciu poniższego kodu.


Niech <math>\displaystyle a\geq 0</math>. Aby wyznaczyć <math>\displaystyle \sqrt{a}</math>, można skorzystać z metody Newtona dla
<div class="code" style="background-color:#e8e8e8; padding:1em"><pre>
równania <math>\displaystyle 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
int dlicznik;
znaczących z grubsza podwajała się na każdej iteracji? Wskaż takie <math>\displaystyle a</math> dla
double dsuma, dstarasuma;
którego to nie będzie prawdą.
double dskladnik;
dstarasuma <nowiki>=</nowiki> 0.0; dsuma <nowiki>=</nowiki> 1.0; dlicznik <nowiki>=</nowiki> 1;
while(dstarasuma !<nowiki>=</nowiki> dsuma)
{
dskladnik <nowiki>=</nowiki> 1.0/dlicznik;
dstarasuma <nowiki>=</nowiki> dsuma;
dsuma +<nowiki>=</nowiki> dskladnik;
dlicznik++;
}
printf("Suma <nowiki>=</nowiki> dsuma, dlicznik-1, dskladnik);
return(0);
}


<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">
</pre></div>
Na pewno kusi Cię, by zaprogramować najpierw ogólnie funkcję "metoda
Newtona", a następnie przekazać jej jako parametr naszą funkcję. To oczywiś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">
będzie działać, i to praktycznie tak samo szybko jak drugi spsoób, w którym po prostu
<div style="font-size:smaller; background-color:#efe"> Policz, ile mniej więcej obrotów pętli potrzeba, by suma przestała rosnąć. </div>
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 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 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">   
Nasza iteracja, którą chcemy zaprogramować, to
Nasza suma przekroczy wartość 20, więc aby <code>20 + dskladnik <nowiki>=</nowiki><nowiki>=</nowiki> 20</code>, musi
<center><math>\displaystyle  
być dskładnik <math>\displaystyle \approx 10^{-15}</math> (lub więcej). Tymczasem zakres liczb typu integer wynosi
x_{k+1} = \frac{1}{2}\left( x_k + \frac{a}{x_k}\right).
niewiele ponad <math>\displaystyle 10^9</math>, więc po jakimś czasie dlicznik przyjmie wartości ujemne.
</math></center>
 
Aby doliczyć się "do końca", musielibyśmy licznik potraktować jako liczbę typu
<code>long long double</code>, którego zakres sięga <math>\displaystyle 10^{18}</math>. Ale i tak mielibyśmy
kłopot z doczekaniem do końca działalności programu.


Dla <math>\displaystyle a\neq 0</math>, spełnione są założenia twierdzenia o zbieżności metody Newtona,
Zakładając optymistycznie, że na sekundę zliczamy <math>\displaystyle 10^7</math> składników,
więc
potrzebowalibyśmy razem około <math>\displaystyle 10^7</math> sekund, czyli ponad trzy miesiące...


<center><math>\displaystyle |x_{k+1}-x^*|\leq K |x_{k}-x^*|^2
</div></div>
</math></center>
 
{{cwiczenie|||
Jak szybko i na jakiej wysokości musiałby lecieć samolot npla, aby
pocisk wystrzeliwany z działka z prędkością 7500 km/h nie trafił w cel, gdy
potrzebne pierwiastki liczone są wzorem szkolnym?
}}


co właśnie tłumaczy się jako podwajanie liczby dokładnych cyfr
{{cwiczenie|Zadanie o wyznaczaniu pierwiastka kwadratowego metodą Newtona||
znaczących wyniku.


Ale jeśli <math>\displaystyle a=0</math> to metoda zbieżna jest już tylko liniowo (z ilorazem 0.5 --- bo
Dla zadanej liczby <math>\displaystyle a>1</math>, należy wyznaczyć przybliżenie <math>\displaystyle \sqrt{a}</math> stosując metodę Herona. Zaproponuj
jaki wtedy jest wzór na iterację?), więc co mniej więcej trzy kroki będziemy
dobre przybliżenie początkowe <math>\displaystyle x_0</math> wiedząc, że <math>\displaystyle a</math> jest liczbą maszynową typu
dostawali kolejne zero dokładnego wyniku <math>\displaystyle x^*=0</math>.
<code>double</code>. Ile iteracji wystarczy, by osiągnąć <math>\displaystyle \epsilon</math>-zadowalające przybliżenie?
}}


</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">


{{cwiczenie|Odwrotność bez dzielenia||
Jak pamiętamy, <math>\displaystyle a = (1+f)2^p = \widetilde{f} 2^{p+1}</math>,
gdzie <math>\displaystyle \frac{1}{2}\leq \widetilde{f} < 1</math> oraz <math>\displaystyle p\in N</math>. Stąd


Aby wyznaczyć <math>\displaystyle 1/a</math> dla <math>\displaystyle 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,
<center><math>\displaystyle  
<center><math>\displaystyle  
|ax_k - 1| = |ax_{k-1} - 1|^2.
\sqrt{a} = \sqrt{\widetilde{f}}2^{(p+1)/2} = \sqrt{g} 2^k,
</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 pewnego (znanego) <math>\displaystyle k \in N</math>, przy czym <math>\displaystyle \frac{1}{2} \leq \sqrt{g} \leq 1</math>.
Oceń, ile iteracji potrzeba do spełnienia warunku <math>\displaystyle \frac{|x_k-\frac{1}{a}|}{|a|} \leq
Wobec tego, obliczenie
\epsilon</math>, gdy <math>\displaystyle \frac{|x_0-\frac{1}{a}|}{|a|} \leq \gamma < 1</math>,
<math>\displaystyle \sqrt{a}</math> wymaga po prostu obliczenia <math>\displaystyle \sqrt{g}</math>. Najprostsze przybliżenie <math>\displaystyle \sqrt{g}</math> to
}}
<math>\displaystyle \sqrt{g}\approx 1</math>. Błąd takiego przybliżenia to
<math>\displaystyle |\sqrt{g} - 1| \leq 0.5</math>.


<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"> 
Jak można jeszcze bardziej poprawić <math>\displaystyle x_0</math>?
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) <math>\displaystyle |ax_0 - 1| < 1</math>, to znaczy
<center><math>\displaystyle 0 < x_0 < \frac{2}{a}.</math></center>


</div></div>
</div></div>


{{cwiczenie|||
{{cwiczenie|Zadanie o wyznaczaniu odwrotności bez dzielenia metodą Newtona||
Zaimplementuj metodę bisekcji. Sprawdź, jak będzie działać m.in. dla funkcji
 
# <math>\displaystyle f(x) = \sin(x)</math>,
Należy wyznaczyć przybliżenie <math>\displaystyle \frac{1}{a}</math> stosując metodę Newtona do równania
# <math>\displaystyle f(x) = \sin^2(x)</math>,
<math>\displaystyle \frac{1}{x} - a = 0</math>. Zaproponuj
# <math>\displaystyle f(x) = (x-1)^5</math> (wzór A),
dobre przybliżenie początkowe <math>\displaystyle x_0</math> wiedząc, że <math>\displaystyle a</math> jest liczbą maszynową typu
# <math>\displaystyle f(x) = (x-1)*(x^4 - 4x^3 + 6x^2 - 4x + 1)</math> (wzór B),
<code>double</code>. Ile iteracji wystarczy, by osiągnąć <math>\displaystyle \epsilon</math>-zadowalające przybliżenie?
# <math>\displaystyle 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),


gdy tolerancję błędu zadasz na poziomie <math>\displaystyle 10^{-10}</math>.
<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"> 
Jak pamiętamy, <math>\displaystyle a = (1+f)2^p</math>, skąd <math>\displaystyle \frac{1}{a} = \frac{1}{1+f}2^{-p}</math>.
Wystarczy więc przybliżyć <math>\displaystyle \frac{1}{1+f}</math>. Ponieważ dla <math>\displaystyle 0 \leq f < 1</math>,


Jak wyjaśnić te wyniki? Czy możesz już być pewna, że masz dobrą implementację?
<center><math>\displaystyle \frac{1}{2} \leq \frac{1}{1+f} \leq 1,
</math></center>


}}
to możemy jako pierwsze przybliżenie wybrać <math>\displaystyle x_0 = \frac{3}{4}2^{-p}</math>. (Jak
wybrać lepsze <math>\displaystyle x_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">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"> 
Wtedy mamy następujące oszacowania:


Jeśli nie pomylisz się, metoda powinna zbiegać bez problemów do zera funkcji
<center><math>\displaystyle |x_0a - 1| = |\frac{3}{4}2^{-p}\cdot (1+f)2^p - 1| = |\frac{3}{4}(1+f) - 1|
<math>\displaystyle \sin</math>, dawać komunikat o błędzie dla <math>\displaystyle \sin^2</math> (bo nie ma przeciwnych znaków).
\leq \frac{1}{2}.
</math></center>


Zapewne zauważyłaś, że wzory A i B są matematycznie równoważne, podobnie zresztą
Ponieważ iteracja Newtona spełnia
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.
<center><math>\displaystyle |x_{k+1}a - 1| = |x_ka-1|^2 = |x_0a-1|^{2^k},
</math></center>


[[Image:bisekcjawblad.png|thumb|right|400px|Metoda bisekcji ma kłopoty, gdy funkcja zadana jest
to, jeśli chcemy, by błąd względny przybliżenia <math>\displaystyle x_{k+1}</math> spełniał <math>\displaystyle \frac{|x_{k+1} -
wzorem D.]]
\frac{1}{a}|}{\frac{1}{a}} = |x_{k+1}a - 1| \leq \epsilon = 2^{-53}</math>, to
[[Image:bisekcjawresid.png|thumb|right|400px|Residuum też jest duże, gdy <math>\displaystyle f</math> zadana jest
musimy wykonać co najwyżej <math>\displaystyle 6</math> iteracji. Ponieważ koszt jednej iteracji
wzorem D.]]
to 3 flopy, zatem wyznaczenie odwrotności <math>\displaystyle a</math> byłoby 18 razy droższe od
mnożenia i dodawania, które mają podobny koszt.


Jeśli chodzi o pewność... No cóż, sprawdziłaś, że działa w przypadkach, gdy
Tymczasem, we współczesnych realizacjach, dzielenie jest tylko około 4 razy droższe od
spodziewałaś się, że będzie działać. Że tam, gdzie spodziewałaś się kłopotów,
mnożenia! Możesz sprawdzić,  
lub komunikatu o błędzie --- tak rzeczywiście się stało. Wreszcie,
[http://www.cs.utexas.edu/users/moore/publications/divide_paper.pdf  jak to się dzieje np. w procesorach AMD].
potwierdziłaś, że zachowanie metody jest zgodne z jej znanymi właściwościami.


Tak więc, można ''przypuszczać'', że implementacja jest poprawna.
Więcej na temat implementacji algorytmów dzielenia oraz wyciągania pierwiastka
kwadratowego możesz dowiedzieć się np. z artykułu Petera Marksteina
[http://www.informatik.uni-trier.de/Reports/TR-08-2004/rnc6_12_markstein.pdf  Software
Division and Square Root Using Goldschmidt s Algorithms] oraz
[http://arith.stanford.edu/techrep.html  raportów technicznych Stanford Computer Architecture and Arithmetic Group
]
</div></div>


{{cwiczenie|||
Niech <math>\displaystyle 0<a_1<a_2<\cdots < a_n</math>. Czy z punktu widzenia
błędów w <math>\displaystyle fl_\nu</math> lepiej jest policzyć sumę tych liczb w kolejności
od najmniejszej do największej czy odwrotnie?
}}
<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"> 
Od najmniejszej do największej.
</div></div>
</div></div>


{{cwiczenie|||
{{cwiczenie|||
Wskaż ''wszystkie'' wartości <math>\displaystyle x_0</math>, dla jakich metoda Newtona będzie zbieżna
Aby obliczyć <math>\displaystyle S(a,b)=a^2-b^2</math> można zastosować
do rozwiązania <math>\displaystyle x^*</math> równania
dwa algorytmy: <math>\displaystyle {\bf ALG}_1(a,b)=a*a-b*b</math> oraz <math>\displaystyle {\bf ALG}_2(a,b)=(a+b)*(a-b)</math>.
Pokazać, że oba algorytmy są numerycznie poprawne, ale drugi
z nich wywołuje mniejszy błąd względny wyniku w przypadku, gdy
<math>\displaystyle rd_\nu(a)=a</math> i <math>\displaystyle rd_\nu(b)=b</math>.
}}
 
{{cwiczenie|||
Pokazać, że naturalny algorytm obliczania cosinusa
kąta między dwoma wektorami <math>\displaystyle  a, b\inR^n</math>,


<center><math>\displaystyle \arctan(x) = 0.
<center><math>\displaystyle \cos(a,b)\,=\,\frac{\sum_{j=1}^n a_jb_j}
      {\sqrt{\Big(\sum_{j=1}^n a_j^2\Big)
            \Big(\sum_{j=1}^n b_j^2\Big)}},
</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>.
jest numerycznie poprawny. Oszacować błąd względny wyniku
Sprawdź eksperymentalnie, czy tak jest rzeczywiście.
w <math>\displaystyle fl_\nu</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">
{{cwiczenie|||
Aby znaleźć graniczne <math>\displaystyle X_0</math>, czyli takie, dla którego dostaniesz
Pokazać, że naturalny algorytm obliczania
oscylacje <math>\displaystyle X_0, -X_0,\ldots</math>, musisz rozwiązać równanie nieliniowe:
<math>\displaystyle \|A x\|_2</math> dla danej macierzy <math>\displaystyle A\inR^{n\times n}</math> i wektora
<math>\displaystyle x\inR^n</math> jest numerycznie poprawny. Dokładniej,  


<center><math>\displaystyle -X_0 = X_0 - \frac{\arctan(X_0)}{\frac{1}{1+X_0^2}}.
<center><math>\displaystyle fl_\nu(\|A x\|_2)\,=\,(A+E) x,
</math></center>
</math></center>


To łatwe.
gdzie <math>\displaystyle \|E\|_2\leq 2(n+2)\sqrt n\nu\|A\|_2</math>. Ponadto, jeśli
<math>\displaystyle A</math> jest nieosobliwa to


</div></div>
<center><math>\displaystyle |fl_\nu(\|A x\|_2)-\|A x\|_2|\,\leq\,2(n+2)\sqrt{n}\,\nu\,
  \left(\|A\|_2\|A^{-1}\|_2\right)\,\|A x\|_2.
</math></center>


}}
}}


<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">
{{cwiczenie|||
Dla <math>\displaystyle -X_0 < x_0 < X_0</math> mamy zbieżność. Dla <math>\displaystyle |x_0| = |X_0|</math> oscylacje, dla
Niech <math>\displaystyle {\bf ALG}</math> będzie algorytmem numerycznie
większych wartości --- rozbieżność. Jednak w eksperymencie wszystko zależy od
poprawnym w zbiorze danych <math>\displaystyle f\in F_0</math>, przy czym dla małych <math>\displaystyle \nu</math>,
tego, jak dokładnie wyznaczyliśmy <math>\displaystyle X_0</math>. Na przykład, mój solver w Octave
<math>\displaystyle fl_\nu({\bf ALG}(f))=\varphi(y_\nu)</math>, gdzie <math>\displaystyle \|y_\nu-y\|\le K\nu\|y\|</math>  
wyznaczył wartość <math>\displaystyle X_0</math>, dla której metoda Newtona dała następujący ciąg:
i <math>\displaystyle K</math> nie zależy od <math>\displaystyle \nu</math> i <math>\displaystyle f</math> (<math>\displaystyle y=N(f)</math>). Pokazać, że
w ogólności <math>\displaystyle {\bf ALG}</math> nie musi być "numerycznie poprawny po
współrzędnych", tzn. w ogólności nie istnieje bezwzględna
stała <math>\displaystyle K_1</math> taka, że dla małych <math>\displaystyle \nu</math> i dla dowolnej
<math>\displaystyle f\in F_0</math>
 
<center><math>\displaystyle |y_{\nu,j}-y_j|\,\le\,K_1\,\nu\,|y_j|, \qquad 1\le j\le n,
</math></center>
 
gdzie <math>\displaystyle y=(y_1,\ldots,y_n)</math>
}}


Iteracja:  1,  x <nowiki>=</nowiki> -1.39175
{{cwiczenie|||
Iteracja:  2,   x <nowiki>=</nowiki> 1.39175
Podaj przykład funkcji <math>\displaystyle f</math>, której miejsce zerowe <math>\displaystyle x^*</math> ma wspólczynnik
Iteracja:  3,  x <nowiki>=</nowiki> -1.39175
uwarunkowania
Iteracja:  4,  x <nowiki>=</nowiki> 1.39175
* mały
Iteracja:  5,  x <nowiki>=</nowiki> -1.39175
* duży
}}


.. itd ..
<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"> 
Ponieważ nasze zadanie to wyznaczenie <math>\displaystyle x^* = f^{-1}(0)</math>, to
<center><math>\displaystyle
\mbox{cond} _{abs} (f^{-1},0) = \frac{1}{f'(x^*)}.
</math></center>


Iteracja:  25,   x <nowiki>=</nowiki> -1.39176
Znaczy to, że im bardziej płaska jest <math>\displaystyle f</math> w otoczeniu pierwiastka <math>\displaystyle x^*</math>, tym
Iteracja:  26,  x <nowiki>=</nowiki> 1.39178
bardziej nawet małe zaburzenia <math>\displaystyle f</math> mogą spowodować duże przemieszczenie jej
Iteracja:  27,  x <nowiki>=</nowiki> -1.39183
miejsca zerowego.
Iteracja:  28,  x <nowiki>=</nowiki> 1.39197
Iteracja:  29,  x <nowiki>=</nowiki> -1.39235
Iteracja:  30,  x <nowiki>=</nowiki> 1.39333
Iteracja:  31,  x <nowiki>=</nowiki> -1.39594
Iteracja:  32,  x <nowiki>=</nowiki> 1.40283
Iteracja:  33,  x <nowiki>=</nowiki> -1.42117
Iteracja:  34,  x <nowiki>=</nowiki> 1.47061
Iteracja:  35,  x <nowiki>=</nowiki> -1.60867
Iteracja:  36,  x <nowiki>=</nowiki> 2.03161
Iteracja:  37,  x <nowiki>=</nowiki> -3.67722
Iteracja:  38,  x <nowiki>=</nowiki> 15.2779
Iteracja:  39,   x <nowiki>=</nowiki> -337.619
Iteracja:  40,  x <nowiki>=</nowiki> 178376
Iteracja:  41,  x <nowiki>=</nowiki> -4.99792e+10
Iteracja:  42,  x <nowiki>=</nowiki> 3.92372e+21
Iteracja:  43,  x <nowiki>=</nowiki> -2.41834e+43
Iteracja:  44,  x <nowiki>=</nowiki> 9.18658e+86
Iteracja:  45,  x <nowiki>=</nowiki> -1.32565e+174
Iteracja:  46,  x <nowiki>=</nowiki> inf
Iteracja:  47,  x <nowiki>=</nowiki> nan


Zauważ, że dla wielokrotnych miejsc zerowych, <math>\displaystyle  \mbox{cond} _{abs} (f^{-1},0) = \infty</math>,
co zgadza się z intuicją, bo może być, że nawet minimalne zaburzenie <math>\displaystyle f</math>
spowoduje, iż miejsc zerowych po prostu nie będzie...
</div></div>
</div></div>

Wersja z 20:24, 28 sie 2006

Ćwiczenia. Własności arytmetyki zmiennopozycyjnej.

Ćwiczenie

Podaj przykłady zbieżnych szeregów postaci n=1an, którego N-te sumy częściowe obliczone w arytmetyce pojedynczej precyzji algorytmem

Algorytm


suma = 0.0;
for n = 1..N
	suma += <math>\displaystyle a_n</math>;

będą

  • ograniczone niezależnie od N, albo
  • numerycznie rozbieżne, to znaczy takie, że dla bardzo dużych N zachodzi

suma == Inf.

Wykonaj to samo zadanie, ale podając przykłady szeregów rozbieżnych (w arytmetyce dokładnej).

Rozwi�zanie

Ćwiczenie

Dla kolejnych N, wyznacz N-tą sumę częściową szeregu Taylora dla funkcji wykładniczej, gdy x=90:

exn=0Nxnn!,

korzystając z algorytmu podanego w poprzednim zadaniu. Porównaj błąd: względny i bezwzględny w porównaniu do wartości wyznaczonej z wykorzystaniem funkcji bibliotecznej exp(). Powtórz następnie dla x=10.

Czy --- zgodnie z teorią matematyczną --- sumy te dążą do wartości ex. Objaśnij dokładnie, co się stało.

Rozwi�zanie

Ćwiczenie

Już wcześniej stwierdziliśmy, że wyznaczanie e(1+1/n)n dla dużego n nie jest dobrym pomysłem. Przeprowadź eksperyment numeryczny potwierdzający to stwierdzenie i objaśnij jego wyniki.

Ćwiczenie

{{{3}}}
Rozwi�zanie

Ćwiczenie

Jak szybko i na jakiej wysokości musiałby lecieć samolot npla, aby pocisk wystrzeliwany z działka z prędkością 7500 km/h nie trafił w cel, gdy potrzebne pierwiastki liczone są wzorem szkolnym?

Ćwiczenie Zadanie o wyznaczaniu pierwiastka kwadratowego metodą Newtona

Dla zadanej liczby a>1, należy wyznaczyć przybliżenie a stosując metodę Herona. Zaproponuj dobre przybliżenie początkowe x0 wiedząc, że a jest liczbą maszynową typu double. Ile iteracji wystarczy, by osiągnąć ϵ-zadowalające przybliżenie?

Rozwi�zanie

Ćwiczenie Zadanie o wyznaczaniu odwrotności bez dzielenia metodą Newtona

Należy wyznaczyć przybliżenie 1a stosując metodę Newtona do równania 1xa=0. Zaproponuj dobre przybliżenie początkowe x0 wiedząc, że a jest liczbą maszynową typu double. Ile iteracji wystarczy, by osiągnąć ϵ-zadowalające przybliżenie?

Rozwi�zanie

Ćwiczenie

Niech 0<a1<a2<<an. Czy z punktu widzenia błędów w flν lepiej jest policzyć sumę tych liczb w kolejności od najmniejszej do największej czy odwrotnie?

Rozwi�zanie

Ćwiczenie

Aby obliczyć S(a,b)=a2b2 można zastosować dwa algorytmy: 𝐀𝐋𝐆1(a,b)=a*ab*b oraz 𝐀𝐋𝐆2(a,b)=(a+b)*(ab). Pokazać, że oba algorytmy są numerycznie poprawne, ale drugi z nich wywołuje mniejszy błąd względny wyniku w przypadku, gdy rdν(a)=a i rdν(b)=b.

Ćwiczenie

Pokazać, że naturalny algorytm obliczania cosinusa kąta między dwoma wektorami Parser nie mógł rozpoznać (nieznana funkcja „\inR”): {\displaystyle \displaystyle a, b\inR^n} ,

cos(a,b)=j=1najbj(j=1naj2)(j=1nbj2),

jest numerycznie poprawny. Oszacować błąd względny wyniku w flν.

Ćwiczenie

Pokazać, że naturalny algorytm obliczania Ax2 dla danej macierzy Parser nie mógł rozpoznać (nieznana funkcja „\inR”): {\displaystyle \displaystyle A\inR^{n\times n}} i wektora Parser nie mógł rozpoznać (nieznana funkcja „\inR”): {\displaystyle \displaystyle x\inR^n} jest numerycznie poprawny. Dokładniej,

flν(Ax2)=(A+E)x,

gdzie E22(n+2)nνA2. Ponadto, jeśli A jest nieosobliwa to

|flν(Ax2)Ax2|2(n+2)nν(A2A12)Ax2.

Ćwiczenie

Niech 𝐀𝐋𝐆 będzie algorytmem numerycznie poprawnym w zbiorze danych fF0, przy czym dla małych ν, flν(𝐀𝐋𝐆(f))=φ(yν), gdzie yνyKνy i K nie zależy od ν i f (y=N(f)). Pokazać, że w ogólności 𝐀𝐋𝐆 nie musi być "numerycznie poprawny po współrzędnych", tzn. w ogólności nie istnieje bezwzględna stała K1 taka, że dla małych ν i dla dowolnej fF0

|yν,jyj|K1ν|yj|,1jn,

gdzie y=(y1,,yn).

Ćwiczenie

Podaj przykład funkcji f, której miejsce zerowe x* ma wspólczynnik uwarunkowania

  • mały
  • duży
Rozwi�zanie