MN03LAB

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

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