MN03LAB: Różnice pomiędzy wersjami
mNie podano opisu zmian |
mNie podano opisu zmian |
||
Linia 270: | Linia 270: | ||
gdzie <math>\displaystyle y=(y_1,\ldots,y_n)</math>. | gdzie <math>\displaystyle y=(y_1,\ldots,y_n)</math>. | ||
</div> | </div> | ||
{{cwiczenie||| | |||
aaa | |||
}} | |||
==Ćwiczenie == | ==Ćwiczenie == |
Wersja z 12:22, 29 sie 2006
Ć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
aaa
Ć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...