Lista 3 - Arsenic Rose
Transkrypt
Lista 3 - Arsenic Rose
Lista 3 Kamil Matuszewski 27 października 2015 1 2 3 4 5 6 7 Zadanie 1 Znajdź wartości dla których obliczanie funkcji może wiązać się z utratą cyfr znaczących wyniku i zaproponuj sposób dokładniejszego obliczania funkcji. 2 • e−x − e2x 2 2 2 2 2 e−x − e2x = e−x (1 − e3x ) Kiedy 3x2 jest bliskie 0 wtedy w nawiasie mamy odejmowanie dwóch bliskich sobie liczb. Żeby to naprawić, rozwińmy ex w szereg Maclaurina: ex = ∞ ∞ X X xn xn =1+ n! n! n=0 n=1 2 e3x = 1 + 2 2 2 2 2 ∞ X (3x2 )n n! n=1 e−x − e2x = e−x (1 − e3x ) = e−x (1 − (1 + ∞ ∞ 2 n X 2 X (3x ) (3x2 )n )) = −e−x ( ) n! n! n=1 n=1 • 1 − sin (2x) Oczywiście, kiedy sin (2x) jest bliskie 1 to może nastąpić utrata cyfr znaczących wyniku. Jak to naprawić? sin x = cos (x − π/2) sin x = sin (x + 2π) 1 − cos x = 2sin2 (x/2) 1 − sin (2x) = 1 − cos (2x − π/2) = 2 sin2 (x − π/4) = 2 sin2 (x + 7π/4) Zadanie 2 Podaj bezpieczny numerycznie algorytm obliczania zer równania kwadratowego ax2 + bx + c = 0. Przeprowadź testy dla odpowiednio dobranych wartości a, b i c pokazujące, że Twój algorytm jest lepszy od metody √ szkolnej bazującej jedynie na dobrze znanych wzorach x1,2 = (−b ± b2 − 4ac)/(2a) Jeśli ac jest bardzo, bardzo, bardzo małe a b bardzo duże (co do modułu), wtedy mamy odejmowanie bliskich sobie liczb (w zależności od tego jaki znak ma b to inny wzór będzie nieprawidłowy). Żeby to naprawić użyjemy wzorów Vietta. Mając a, b i x1 możemy obliczyć x2 = − ab − x1 czy coś. Zrobienie testów w swoim ulubionym języku pozostawiam jako proste ćwiczenie. 1 Zadanie 4 Wyprowadź wzór na wskaźnik uwarunkowania zadania obliczania wartości funkcji f w punkcie x. Względna zmiana danych: (x + h) − x h = x x Względna zmiana wyniku: f (x + h) − f (x) f (x) Względna zmiana wyniku/Względna zmiana danych: 0 f (x + h) − f (x) x f (x + h) − f (x) h x f (x + h) − f (x) x · = = = |f 0 (x)| x = f (x)x f (x) h h f (x) h h f (x) f (x) f (x) Zadanie 5 Sprawdź dla jakich wartości x zadania obliczania funkcji f jest źle uwarunkowane. Korzystamy z zadania 2, a dokładniej ze wskaźnika uwarunkowania. • f (x) = √ 1 − x2 0 x x −x2 x −x3 f (x)x − √1−x 2 = √ f (x) 1 − x2 = (√1 − x2 )2 = 1 − x2 −x3 =∞ lim x→1 1 − x2 • f (x) = x ln x 0 f (x)x (1 + ln x)x 1 + ln x = = f (x) x ln x ln x 1 + ln x =∞ lim x→1 ln x √ x4 + 1 − x2 3 0 √2x4 2 2 − 2x)x − 2x f (x)x ( √2x wolf ram 2x2 − √ 2x = √ = √ x4 +1 = √ x4 +1 = f (x) x4 + 1 − x2 x4 + 1 − x2 x4 + 1 x4 + 1 • f (x) = Zadanie dobrze uwarunkowane • f (x) = sin(x) 0 f (x)x x cos x f (x) = sin x = |x ctg x| lim |x ctg x| = 0 x→kπ 2 Zadanie 6 Musimy sprawdzić, czy algorytm jest numerycznie poprawny. To jest dosyć łatwe, choć akurat dla mnie nigdy nie było intuicyjne, ale robi się to jakoś tak: Niech ei = (1 + εi ) a wi = (1 + αi ) S := (de1 + 1)w1 = de1 w1 + w1 ce2 S := w2 de1 w1 + w1 ce2 ce2 w2 w3 S := (be3 + w2 )w3 = be3 w3 + de1 w1 + w1 de1 w1 + w1 ae4 w4 ae4 S := w3 w4 = w3 be3 w3 + dece12ww12+w be3 w3 + dece12ww12+w 1 1 S := 1 ae4 w4 ce w w be3 w3 + de 2w 2+w3 1 = 1 w5 = w5 · be3 w3 + ce2 w2 w3 de1 w1 +w1 ae4 w4 = w5 · be3 w3 (de1 w1 +w1 )+ce2 w2 w3 de1 w1 +w1 ae4 w4 = 1 be3 w3 (de1 w1 + w1 )w5 + ce2 w2 w3 w5 be3 w3 de1 w1 w5 + be3 w3 w1 w5 + ce2 w2 w3 w5 = = ae4 w4 (de1 w1 + w1 ) ae4 w4 (de1 w1 + w1 ) = be3 w3 w1 w5 + ce2 w2 w3 w5 + bde3 w3 e1 w1 w5 ae4 w4 (de1 w1 + w1 ) Niech E = max {w1 , w2 , w3 , w4 , w5 , e1 , e2 , e3 , e4 }. Wtedy: S¬ e E 4 (b + c + bdE) (b + c + bd) bE 4 + cE 4 + bdE 5 E = = aE 2 (dE 2 + E) E 3 (a(dE + 1)) a(de + 1) e e b, c, d) = S(a, b, c, d)(1+), Mamy więc, że wynik to S(a, czyli lekkie zakłócenie danych i lekkie zakłócenie wyniku. Algorytm jest więc numerycznie poprawny, bo błędy zarówno danych jak i wyniku są na poziomie błędu reprezentacji (bo E było na poziomie błędu reprezentacji). DYGRESJA Na wykładzie było coś takiego jak twierdzenie o kumulacji błędów. To chyba leciało jakoś n Q tak, że jeśli mamy jakieś |αi | ¬ 2−t dla i = 1, 2, . . . , n to zachodzi (1 + αi ) = (1 + γi ), i=1 gdzie |γi | ¬ n2−t W praktyce to oznacza, że możemy jakoś sobie pozwijać błędy. Musimy tylko określić, czy ten skumulowany błąd jest duży, a to jest jakieś machanie rękami. Zazwyczaj jak te błędy się tak skumulują to algorytm jest dobrze uwarunkowany. To była jednak jakaś dygresja, i nie jest zupełnie potrzebna przy tym zadaniu. Zadanie 7 To robimy podobnie jak poprzednie, i korzystamy z tej śmiesznej kumulacji błędów. To nie jest trudne zadanie. Kiedy liczby nie są maszynowe będzie dwa razy więcej błędów, ale to wciąż będzie numerycznie poprawne. Jeśli zapiszecie wzór i skorzystacie z twierdzenia o kumulacji błędów, oraz trochę pomachacie, że ten skumulowany błąd to w sumie nie jest duży, to raczej grzyba nie dostaniecie (ja tak robiłem i nie dostałem). Te zadanka z numeryczną poprawnością polegają właśnie na takim machaniu, i u nas to przechodziło. Ciężko jest pokazać przykład algorytmu numerycznie niepoprawnego, i raczej nie będzie takich na L. 3