MN03LAB: Różnice pomiędzy wersjami
mNie podano opisu zmian |
mNie podano opisu zmian |
||
Linia 1: | Linia 1: | ||
==Ćwiczenie: Szeregi zbieżne(?) | |||
<div | ==Ćwiczenia. Własności arytmetyki zmiennopozycyjnej.== | ||
<div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;"> | |||
<span style="font-variant:small-caps; color: exeA6ABF;">Ćwiczenie: Szeregi zbieżne(?)</span> | |||
<div class="exercise"> | |||
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 | 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 | ||
Linia 18: | Linia 22: | ||
Wykonaj to samo zadanie, ale podając przykłady szeregów ''rozbieżnych'' (w | Wykonaj to samo zadanie, ale podając przykłady szeregów ''rozbieżnych'' (w | ||
arytmetyce dokładnej). | arytmetyce dokładnej). | ||
</div> | </div></div> | ||
= | <div style="margin-top:1em; padding-top,padding-bottom:1em;"> | ||
< | <span style="font-variant:small-caps;">Rozwiązanie</span> | ||
<div class="solution"> | |||
Rozpatrz na przykład takie szeregi zbieżne: | Rozpatrz na przykład takie szeregi zbieżne: | ||
* Szereg zerowy (numerycznie dostajesz oczywiście też 0) | * Szereg zerowy (numerycznie dostajesz oczywiście też 0) | ||
Linia 31: | Linia 36: | ||
* Szereg jedynkowy. | * Szereg jedynkowy. | ||
</div> | </div></div> | ||
= | <div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;"> | ||
< | <span style="font-variant:small-caps; color: exeA6ABF;">Ćwiczenie</span> | ||
<div class="exercise"> | |||
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>: | 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 | <center><math>\displaystyle | ||
Linia 46: | Linia 52: | ||
Czy --- zgodnie z teorią matematyczną --- sumy te dążą do wartości | Czy --- zgodnie z teorią matematyczną --- sumy te dążą do wartości | ||
<math>\displaystyle e^{x}</math>. Objaśnij dokładnie, co się stało. | <math>\displaystyle e^{x}</math>. Objaśnij dokładnie, co się stało. | ||
</div> | </div></div> | ||
= | <div style="margin-top:1em; padding-top,padding-bottom:1em;"> | ||
< | <span style="font-variant:small-caps;">Rozwiązanie</span> | ||
<div class="solution"> | |||
Zastosowanie naszego algorytmu dla <math>\displaystyle x=-90</math> daje w wyniku (dla arytmetyki | Zastosowanie naszego algorytmu dla <math>\displaystyle x=-90</math> daje w wyniku (dla arytmetyki | ||
podwójnej precyzji) sumę równą około <math>\displaystyle 10^{30}</math>, | podwójnej precyzji) sumę równą około <math>\displaystyle 10^{30}</math>, | ||
Linia 61: | Linia 68: | ||
wyniku. | wyniku. | ||
</div> | </div></div> | ||
= | <div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;"> | ||
< | <span style="font-variant:small-caps; color: exeA6ABF;">Ćwiczenie</span> | ||
<div class="exercise"> | |||
Już wcześniej stwierdziliśmy, że wyznaczanie <math>\displaystyle e \approx (1 + 1/n)^n</math> dla dużego | Już wcześniej stwierdziliśmy, że wyznaczanie <math>\displaystyle e \approx (1 + 1/n)^n</math> dla dużego | ||
<math>\displaystyle n</math> nie jest dobrym pomysłem. Przeprowadź eksperyment numeryczny potwierdzający | <math>\displaystyle n</math> nie jest dobrym pomysłem. Przeprowadź eksperyment numeryczny potwierdzający | ||
to stwierdzenie i objaśnij jego wyniki. | to stwierdzenie i objaśnij jego wyniki. | ||
</div> | </div></div> | ||
= | <div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;"> | ||
< | <span style="font-variant:small-caps; color: exeA6ABF;">Ćwiczenie</span> | ||
<div class="exercise"> | |||
Jak wiadomo, szereg harmoniczny <math>\displaystyle \sum_{n=1}^\infty 1/n</math> jest rozbieżny. | 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 | Spróbuj przewidzieć, jaki będzie efekt numerycznego wyznaczenia tej sumy w | ||
Linia 101: | Linia 110: | ||
</div></div> | </div></div> | ||
</div> | </div></div> | ||
= | <div style="margin-top:1em; padding-top,padding-bottom:1em;"> | ||
< | <span style="font-variant:small-caps;">Rozwiązanie</span> | ||
<div class="solution"> | |||
Nasza suma przekroczy wartość 20, więc aby <code>20 + dskladnik <nowiki>=</nowiki><nowiki>=</nowiki> 20</code>, musi | Nasza suma przekroczy wartość 20, więc aby <code>20 + dskladnik <nowiki>=</nowiki><nowiki>=</nowiki> 20</code>, musi | ||
być dskładnik <math>\displaystyle \approx 10^{-15}</math> (lub więcej). Tymczasem zakres liczb typu integer wynosi | być dskładnik <math>\displaystyle \approx 10^{-15}</math> (lub więcej). Tymczasem zakres liczb typu integer wynosi | ||
Linia 116: | Linia 126: | ||
potrzebowalibyśmy razem około <math>\displaystyle 10^7</math> sekund, czyli ponad trzy miesiące... | potrzebowalibyśmy razem około <math>\displaystyle 10^7</math> sekund, czyli ponad trzy miesiące... | ||
</div> | </div></div> | ||
= | <div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;"> | ||
< | <span style="font-variant:small-caps; color: exeA6ABF;">Ćwiczenie</span> | ||
<div class="exercise"> | |||
Jak szybko i na jakiej wysokości musiałby lecieć samolot npla, aby | 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 | pocisk wystrzeliwany z działka z prędkością 7500 km/h nie trafił w cel, gdy | ||
potrzebne pierwiastki liczone są wzorem szkolnym? | potrzebne pierwiastki liczone są wzorem szkolnym? | ||
</div> | </div></div> | ||
==Ćwiczenie: Zadanie o wyznaczaniu pierwiastka kwadratowego metodą Newtona | <div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;"> | ||
<div | <span style="font-variant:small-caps; color: exeA6ABF;">Ćwiczenie: Zadanie o wyznaczaniu pierwiastka kwadratowego metodą Newtona</span> | ||
<div class="exercise"> | |||
Dla zadanej liczby <math>\displaystyle a>1</math>, należy wyznaczyć przybliżenie <math>\displaystyle \sqrt{a}</math> stosując metodę Herona. Zaproponuj | Dla zadanej liczby <math>\displaystyle a>1</math>, należy wyznaczyć przybliżenie <math>\displaystyle \sqrt{a}</math> stosując metodę Herona. Zaproponuj | ||
dobre przybliżenie początkowe <math>\displaystyle x_0</math> wiedząc, że <math>\displaystyle a</math> jest liczbą maszynową typu | dobre przybliżenie początkowe <math>\displaystyle x_0</math> wiedząc, że <math>\displaystyle a</math> jest liczbą maszynową typu | ||
<code>double</code>. Ile iteracji wystarczy, by osiągnąć <math>\displaystyle \epsilon</math>-zadowalające przybliżenie? | <code>double</code>. Ile iteracji wystarczy, by osiągnąć <math>\displaystyle \epsilon</math>-zadowalające przybliżenie? | ||
</div> | </div></div> | ||
= | <div style="margin-top:1em; padding-top,padding-bottom:1em;"> | ||
< | <span style="font-variant:small-caps;">Rozwiązanie</span> | ||
<div class="solution"> | |||
Jak pamiętamy, <math>\displaystyle a = (1+f)2^p = \widetilde{f} 2^{p+1}</math>, | 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 | gdzie <math>\displaystyle \frac{1}{2}\leq \widetilde{f} < 1</math> oraz <math>\displaystyle p\in N</math>. Stąd | ||
Linia 150: | Linia 163: | ||
Jak można jeszcze bardziej poprawić <math>\displaystyle x_0</math>? | Jak można jeszcze bardziej poprawić <math>\displaystyle x_0</math>? | ||
</div> | </div></div> | ||
==Ćwiczenie: Zadanie o wyznaczaniu odwrotności bez dzielenia metodą Newtona | <div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;"> | ||
<div | <span style="font-variant:small-caps; color: exeA6ABF;">Ćwiczenie: Zadanie o wyznaczaniu odwrotności bez dzielenia metodą Newtona</span> | ||
<div class="exercise"> | |||
Należy wyznaczyć przybliżenie <math>\displaystyle \frac{1}{a}</math> stosując metodę Newtona do równania | Należy wyznaczyć przybliżenie <math>\displaystyle \frac{1}{a}</math> stosując metodę Newtona do równania | ||
Linia 159: | Linia 173: | ||
dobre przybliżenie początkowe <math>\displaystyle x_0</math> wiedząc, że <math>\displaystyle a</math> jest liczbą maszynową typu | dobre przybliżenie początkowe <math>\displaystyle x_0</math> wiedząc, że <math>\displaystyle a</math> jest liczbą maszynową typu | ||
<code>double</code>. Ile iteracji wystarczy, by osiągnąć <math>\displaystyle \epsilon</math>-zadowalające przybliżenie? | <code>double</code>. Ile iteracji wystarczy, by osiągnąć <math>\displaystyle \epsilon</math>-zadowalające przybliżenie? | ||
</div> | </div></div> | ||
= | <div style="margin-top:1em; padding-top,padding-bottom:1em;"> | ||
< | <span style="font-variant:small-caps;">Rozwiązanie</span> | ||
<div class="solution"> | |||
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>. | 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>, | Wystarczy więc przybliżyć <math>\displaystyle \frac{1}{1+f}</math>. Ponieważ dla <math>\displaystyle 0 \leq f < 1</math>, | ||
Linia 199: | Linia 214: | ||
[http://arith.stanford.edu/techrep.html raportów technicznych Stanford Computer Architecture and Arithmetic Group | [http://arith.stanford.edu/techrep.html raportów technicznych Stanford Computer Architecture and Arithmetic Group | ||
] | ] | ||
</div> | </div></div> | ||
= | <div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;"> | ||
< | <span style="font-variant:small-caps; color: exeA6ABF;">Ćwiczenie</span> | ||
<div class="exercise"> | |||
Niech <math>\displaystyle 0<a_1<a_2<\cdots < a_n</math>. Czy z punktu widzenia | 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 | 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? | od najmniejszej do największej czy odwrotnie? | ||
</div> | </div></div> | ||
= | <div style="margin-top:1em; padding-top,padding-bottom:1em;"> | ||
< | <span style="font-variant:small-caps;">Rozwiązanie</span> | ||
<div class="solution"> | |||
Od najmniejszej do największej. | Od najmniejszej do największej. | ||
</div> | </div></div> | ||
= | <div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;"> | ||
< | <span style="font-variant:small-caps; color: exeA6ABF;">Ćwiczenie</span> | ||
<div class="exercise"> | |||
Aby obliczyć <math>\displaystyle S(a,b)=a^2-b^2</math> można zastosować | Aby obliczyć <math>\displaystyle S(a,b)=a^2-b^2</math> można zastosować | ||
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>. | 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>. | ||
Linia 220: | Linia 238: | ||
z nich wywołuje mniejszy błąd względny wyniku w przypadku, gdy | 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>. | <math>\displaystyle rd_\nu(a)=a</math> i <math>\displaystyle rd_\nu(b)=b</math>. | ||
</div> | </div></div> | ||
= | <div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;"> | ||
< | <span style="font-variant:small-caps; color: exeA6ABF;">Ćwiczenie</span> | ||
<div class="exercise"> | |||
Pokazać, że naturalny algorytm obliczania cosinusa | Pokazać, że naturalny algorytm obliczania cosinusa | ||
kąta między dwoma wektorami <math>\displaystyle a, b\inR^n</math>, | kąta między dwoma wektorami <math>\displaystyle a, b\inR^n</math>, | ||
Linia 234: | Linia 253: | ||
jest numerycznie poprawny. Oszacować błąd względny wyniku | jest numerycznie poprawny. Oszacować błąd względny wyniku | ||
w <math>\displaystyle fl_\nu</math>. | w <math>\displaystyle fl_\nu</math>. | ||
</div> | </div></div> | ||
= | <div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;"> | ||
< | <span style="font-variant:small-caps; color: exeA6ABF;">Ćwiczenie</span> | ||
<div class="exercise"> | |||
Pokazać, że naturalny algorytm obliczania | Pokazać, że naturalny algorytm obliczania | ||
<math>\displaystyle \|A x\|_2</math> dla danej macierzy <math>\displaystyle A\inR^{n\times n}</math> i wektora | <math>\displaystyle \|A x\|_2</math> dla danej macierzy <math>\displaystyle A\inR^{n\times n}</math> i wektora | ||
Linia 252: | Linia 272: | ||
</math></center> | </math></center> | ||
</div> | </div></div> | ||
= | <div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;"> | ||
< | <span style="font-variant:small-caps; color: exeA6ABF;">Ćwiczenie</span> | ||
<div class="exercise"> | |||
Niech <math>\displaystyle {\bf ALG}</math> będzie algorytmem numerycznie | Niech <math>\displaystyle {\bf ALG}</math> będzie algorytmem numerycznie | ||
poprawnym w zbiorze danych <math>\displaystyle f\in F_0</math>, przy czym dla małych <math>\displaystyle \nu</math>, | poprawnym w zbiorze danych <math>\displaystyle f\in F_0</math>, przy czym dla małych <math>\displaystyle \nu</math>, | ||
Linia 269: | Linia 290: | ||
gdzie <math>\displaystyle y=(y_1,\ldots,y_n)</math>. | gdzie <math>\displaystyle y=(y_1,\ldots,y_n)</math>. | ||
</div> | </div></div> | ||
<div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;"> | |||
<span style="font-variant:small-caps; color: exeA6ABF;">Ćwiczenie</span> | |||
< | <div class="exercise"> | ||
Podaj przykład funkcji <math>\displaystyle f</math>, której miejsce zerowe <math>\displaystyle x^*</math> ma wspólczynnik | Podaj przykład funkcji <math>\displaystyle f</math>, której miejsce zerowe <math>\displaystyle x^*</math> ma wspólczynnik | ||
uwarunkowania | uwarunkowania | ||
Linia 282: | Linia 300: | ||
* duży | * duży | ||
</div> | </div></div> | ||
= | <div style="margin-top:1em; padding-top,padding-bottom:1em;"> | ||
< | <span style="font-variant:small-caps;">Rozwiązanie</span> | ||
<div class="solution"> | |||
Ponieważ nasze zadanie to wyznaczenie <math>\displaystyle x^* = f^{-1}(0)</math>, to | Ponieważ nasze zadanie to wyznaczenie <math>\displaystyle x^* = f^{-1}(0)</math>, to | ||
<center><math>\displaystyle | <center><math>\displaystyle | ||
Linia 298: | Linia 317: | ||
co zgadza się z intuicją, bo może być, że nawet minimalne zaburzenie <math>\displaystyle f</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... | spowoduje, iż miejsc zerowych po prostu nie będzie... | ||
</div> | </div></div> |
Wersja z 12:29, 29 sie 2006
Ćwiczenia. Własności arytmetyki zmiennopozycyjnej.
Ćwiczenie: Szeregi zbieżne(?)
Podaj przykłady zbieżnych szeregów postaci , którego -te sumy częściowe obliczone w arytmetyce pojedynczej precyzji algorytmem
suma = 0.0; for n = 1..N suma += <math>\displaystyle a_n</math>;
będą
- ograniczone niezależnie od , albo
- numerycznie rozbieżne, to znaczy takie, że dla bardzo dużych zachodzi
suma == Inf
.
Wykonaj to samo zadanie, ale podając przykłady szeregów rozbieżnych (w arytmetyce dokładnej).
Rozwiązanie
Rozpatrz na przykład takie szeregi zbieżne:
- Szereg zerowy (numerycznie dostajesz oczywiście też 0)
- oraz
(numerycznie dostaniesz, odpowiednio, NaN
(dlaczego?) i Inf
.
- Szereg harmoniczny (numerycznie sumy częściowe w pewnym momencie przestaną
rosnąć).
- Szereg jedynkowy.
Ćwiczenie
Dla kolejnych , wyznacz -tą sumę częściową szeregu Taylora dla funkcji wykładniczej, gdy :
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 .
Czy --- zgodnie z teorią matematyczną --- sumy te dążą do wartości . Objaśnij dokładnie, co się stało.
Rozwiązanie
Zastosowanie naszego algorytmu dla daje w wyniku (dla arytmetyki podwójnej precyzji) sumę równą około , gdy oczywiście naprawdę ). 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.
Dla mamy, dla rosnącego , całkiem niezły błąd względny ostatecznego wyniku.
Ćwiczenie
Już wcześniej stwierdziliśmy, że wyznaczanie dla dużego nie jest dobrym pomysłem. Przeprowadź eksperyment numeryczny potwierdzający to stwierdzenie i objaśnij jego wyniki.
Ćwiczenie
Jak wiadomo, szereg harmoniczny 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.
int dlicznik; double dsuma, dstarasuma; double dskladnik; dstarasuma = 0.0; dsuma = 1.0; dlicznik = 1; while(dstarasuma != dsuma) { dskladnik = 1.0/dlicznik; dstarasuma = dsuma; dsuma += dskladnik; dlicznik++; } printf("Suma = dsuma, dlicznik-1, dskladnik); return(0); }
Rozwiązanie
Nasza suma przekroczy wartość 20, więc aby 20 + dskladnik == 20
, musi
być dskładnik (lub więcej). Tymczasem zakres liczb typu integer wynosi
niewiele ponad , więc po jakimś czasie dlicznik przyjmie wartości ujemne.
Aby doliczyć się "do końca", musielibyśmy licznik potraktować jako liczbę typu
long long double
, którego zakres sięga . Ale i tak mielibyśmy
kłopot z doczekaniem do końca działalności programu.
Zakładając optymistycznie, że na sekundę zliczamy składników, potrzebowalibyśmy razem około sekund, czyli ponad trzy miesiące...
Ć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 , należy wyznaczyć przybliżenie stosując metodę Herona. Zaproponuj
dobre przybliżenie początkowe wiedząc, że jest liczbą maszynową typu
double
. Ile iteracji wystarczy, by osiągnąć -zadowalające przybliżenie?
Rozwiązanie
Jak pamiętamy, , gdzie oraz . Stąd
dla pewnego (znanego) , przy czym . Wobec tego, obliczenie wymaga po prostu obliczenia . Najprostsze przybliżenie to . Błąd takiego przybliżenia to .
Jak można jeszcze bardziej poprawić ?
Ćwiczenie: Zadanie o wyznaczaniu odwrotności bez dzielenia metodą Newtona
Należy wyznaczyć przybliżenie stosując metodę Newtona do równania
. Zaproponuj
dobre przybliżenie początkowe wiedząc, że jest liczbą maszynową typu
double
. Ile iteracji wystarczy, by osiągnąć -zadowalające przybliżenie?
Rozwiązanie
Jak pamiętamy, , skąd . Wystarczy więc przybliżyć . Ponieważ dla ,
to możemy jako pierwsze przybliżenie wybrać . (Jak wybrać lepsze ?)
Wtedy mamy następujące oszacowania:
Ponieważ iteracja Newtona spełnia
to, jeśli chcemy, by błąd względny przybliżenia spełniał , to musimy wykonać co najwyżej iteracji. Ponieważ koszt jednej iteracji to 3 flopy, zatem wyznaczenie odwrotności byłoby 18 razy droższe od mnożenia i dodawania, które mają podobny koszt.
Tymczasem, we współczesnych realizacjach, dzielenie jest tylko około 4 razy droższe od mnożenia! Możesz sprawdzić, jak to się dzieje np. w procesorach AMD.
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 ]
Ćwiczenie
Niech . Czy z punktu widzenia błędów w lepiej jest policzyć sumę tych liczb w kolejności od najmniejszej do największej czy odwrotnie?
Rozwiązanie
Od najmniejszej do największej.
Ćwiczenie
Aby obliczyć można zastosować dwa algorytmy: oraz . Pokazać, że oba algorytmy są numerycznie poprawne, ale drugi z nich wywołuje mniejszy błąd względny wyniku w przypadku, gdy i .
Ć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} ,
jest numerycznie poprawny. Oszacować błąd względny wyniku w .
Ćwiczenie
Pokazać, że naturalny algorytm obliczania 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,
gdzie . Ponadto, jeśli jest nieosobliwa to
Ćwiczenie
Niech będzie algorytmem numerycznie poprawnym w zbiorze danych , przy czym dla małych , , gdzie i nie zależy od i (). 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 taka, że dla małych i dla dowolnej
gdzie .
Ćwiczenie
Podaj przykład funkcji , której miejsce zerowe ma wspólczynnik uwarunkowania
- mały
- duży
Rozwiązanie
Ponieważ nasze zadanie to wyznaczenie , to
Znaczy to, że im bardziej płaska jest w otoczeniu pierwiastka , tym bardziej nawet małe zaburzenia mogą spowodować duże przemieszczenie jej miejsca zerowego.
Zauważ, że dla wielokrotnych miejsc zerowych, , co zgadza się z intuicją, bo może być, że nawet minimalne zaburzenie spowoduje, iż miejsc zerowych po prostu nie będzie...