MN03LAB: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Przykry (dyskusja | edycje)
mNie podano opisu zmian
Przykry (dyskusja | edycje)
mNie podano opisu zmian
Linia 1: Linia 1:
==Ćwiczenie: Szeregi zbieżne(?) ==
 
<div style="background-color:red;">
==Ć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>


==Rozwiązanie ==
<div style="margin-top:1em; padding-top,padding-bottom:1em;">
<div style="background-color:red;">
<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>


==Ćwiczenie ==
<div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;">
<div style="background-color:red;">
<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>


==Rozwiązanie ==
<div style="margin-top:1em; padding-top,padding-bottom:1em;">
<div style="background-color:red;">
<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>


==Ćwiczenie ==
<div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;">
<div style="background-color:red;">
<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>


==Ćwiczenie ==
<div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;">
<div style="background-color:red;">
<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>


==Rozwiązanie ==
<div style="margin-top:1em; padding-top,padding-bottom:1em;">
<div style="background-color:red;">
<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>


==Ćwiczenie ==
<div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;">
<div style="background-color:red;">
<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 style="background-color:red;">
<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>


==Rozwiązanie ==
<div style="margin-top:1em; padding-top,padding-bottom:1em;">
<div style="background-color:red;">
<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 style="background-color:red;">
<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>


==Rozwiązanie ==
<div style="margin-top:1em; padding-top,padding-bottom:1em;">
<div style="background-color:red;">
<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>


==Ćwiczenie ==
<div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;">
<div style="background-color:red;">
<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>


==Rozwiązanie ==
<div style="margin-top:1em; padding-top,padding-bottom:1em;">
<div style="background-color:red;">
<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>


==Ćwiczenie ==
<div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;">
<div style="background-color:red;">
<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>


==Ćwiczenie ==
<div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;">
<div style="background-color:red;">
<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>


==Ćwiczenie ==
<div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;">
<div style="background-color:red;">
<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>


==Ćwiczenie ==
<div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;">
<div style="background-color:red;">
<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>
{{cwiczenie|||
aaa
}}


 
<div style="border-top-style:solid; border-top-width:thin; margin-top:1em; padding-top,padding-bottom:1em;">
==Ćwiczenie ==
<span  style="font-variant:small-caps; color: exeA6ABF;">Ćwiczenie</span>
<div style="background-color:red;">
<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>


==Rozwiązanie ==
<div style="margin-top:1em; padding-top,padding-bottom:1em;">
<div style="background-color:red;">
<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 n=1an, którego N-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 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

Rozpatrz na przykład takie szeregi zbieżne:

  • Szereg zerowy (numerycznie dostajesz oczywiście też 0)
  • 1+102006102006+0+=1 oraz 1+1020061+0+=102006

(numerycznie dostaniesz, odpowiednio, NaN (dlaczego?) i Inf.

  • Szereg harmoniczny (numerycznie sumy częściowe w pewnym momencie przestaną

rosnąć).

  • Szereg jedynkowy.

Ć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

Zastosowanie naszego algorytmu dla x=90 daje w wyniku (dla arytmetyki podwójnej precyzji) sumę równą około 1030, gdy oczywiście naprawdę exp(90)0). 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 x=10 mamy, dla rosnącego N, całkiem niezły błąd względny ostatecznego wyniku.

Ć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

Jak wiadomo, szereg harmoniczny n=11/n 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);
}

Wskaz�wka

Rozwiązanie

Nasza suma przekroczy wartość 20, więc aby 20 + dskladnik == 20, musi być dskładnik 1015 (lub więcej). Tymczasem zakres liczb typu integer wynosi niewiele ponad 109, 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 1018. Ale i tak mielibyśmy kłopot z doczekaniem do końca działalności programu.

Zakładając optymistycznie, że na sekundę zliczamy 107 składników, potrzebowalibyśmy razem około 107 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 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

Jak pamiętamy, a=(1+f)2p=f~2p+1, gdzie 12f~<1 oraz pN. Stąd

a=f~2(p+1)/2=g2k,

dla pewnego (znanego) kN, przy czym 12g1. Wobec tego, obliczenie a wymaga po prostu obliczenia g. Najprostsze przybliżenie g to g1. Błąd takiego przybliżenia to |g1|0.5.

Jak można jeszcze bardziej poprawić x0?

Ć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

Jak pamiętamy, a=(1+f)2p, skąd 1a=11+f2p. Wystarczy więc przybliżyć 11+f. Ponieważ dla 0f<1,

1211+f1,

to możemy jako pierwsze przybliżenie wybrać x0=342p. (Jak wybrać lepsze x0?)

Wtedy mamy następujące oszacowania:

|x0a1|=|342p(1+f)2p1|=|34(1+f)1|12.

Ponieważ iteracja Newtona spełnia

|xk+1a1|=|xka1|2=|x0a1|2k,

to, jeśli chcemy, by błąd względny przybliżenia xk+1 spełniał |xk+11a|1a=|xk+1a1|ϵ=253, to musimy wykonać co najwyżej 6 iteracji. Ponieważ koszt jednej iteracji to 3 flopy, zatem wyznaczenie odwrotności a 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 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

Od najmniejszej do największej.

Ć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

Ponieważ nasze zadanie to wyznaczenie x*=f1(0), to

condabs(f1,0)=1f(x*).

Znaczy to, że im bardziej płaska jest f w otoczeniu pierwiastka x*, tym bardziej nawet małe zaburzenia f mogą spowodować duże przemieszczenie jej miejsca zerowego.

Zauważ, że dla wielokrotnych miejsc zerowych, condabs(f1,0)=, co zgadza się z intuicją, bo może być, że nawet minimalne zaburzenie f spowoduje, iż miejsc zerowych po prostu nie będzie...