Obliczenia w arytmetyce zmiennopozycyjnej

Zadania z tego rozdziału powinny wykazać pewne charakterystyczne własności arytmetyki zmiennopozycyjnej.

W octavie wykorzystywane są domyślnie liczby zmiennopozycyjne o podwójnej precyzji, jakkolwiek w najnowszych wersjach octave'a można również sztucznie wymusić używanie zmiennych w precyzji pojedynczej przy pomocy funkcji single(a) zwracającej
zmienną pojedynczej precyzji z tą samą wartością.

Jedną z ważnych własności arytmetyki zmiennopozycyjnej, która wynika z jej konstrukcji, jest to, że odejmowanie
dwóch wartości o tym samym znaku o małej różnicy może skutkować
dużą utratą dokładności względnej.

  1. Funkcje single(a) i eps.
    Wywołaj pomoc do tych funkcji w octave'ie.
    Sprawdź, czy prawdą jest, że $ 1+eps $
    obliczone w arytmetyce podwójnej precyzji w octave'ie jest większe od jeden.
    Przyjmij, że $ a=single(eps) $ i sprawdź, czy ponownie $ 1+a $ jest większe od
    jeden.
  2. Epsilon maszynowy w arytmetyce podwójnej precyzji

    Wyznacz samodzielnie epsilon maszynowy - czyli najmniejszą liczbę w arytmetyce zmiennopozycyjnej taką, że po dodaniu jej do jeden otrzymujemy liczbę większą od jeden. Będziemy szukali liczby postaci $ 2^{-t} $ dla t - ilości bitów mantysy.
    Porównaj z eps komendą octave'a.
    Zadanie można też wykonać w C/C++. Czy otrzymane wyniki są takie same jak te otrzymane w octavie (dla liczb typu double)?

  3. Epsilon maszynowy w arytmetyce pojedynczej precyzji
    \nopagebreak
    Powtórz poprzednie zadanie dla arytmetyki pojedynczej precyzji. Funkcja octave'a single(x)
    tworzy zmienne takiego typu. Wykorzystując tę funkcję ponownie wyznacz epsilon maszynowy jako liczbę postaci $ 2^{-t} $, ale dla liczb w pojedynczej precyzji.

  4. Narysuj wykres funkcji $ f(x)=(x+a)-a $ na $ [0,1] $ dla różnych wartości $ a=10^k $ dla $ k=1,2,..,20 $. Tutaj ważne jest aby obliczać wartość $ f(x) $ dokładnie ze wzorów: $ b=(x-a), \; f(x)=b-a $, choć matematycznie $ f(x)=x $.
  5. Policz
    $$f(x)=x-\sqrt{1+x*x}$$

    algorytmem wprost wynikającym z tego wzoru, a następnie z wykorzystaniem równoważnego wzoru

    $$f(x)=\frac{-1}{x+\sqrt{1+x*x}}$$

    tzn. proszę zastosować:

    Algorytm 1

    $$<br />
a= \sqrt{1+x^2} \quad<br />
w_1=x-a<br />
$$

    oraz

    Algorytm 2

    $$<br />
 a=\sqrt{1+x^2} \quad<br />
 w_2=\frac{-1}{x+a}<br />
$$

    dla $ x=10^k $ i $ k=4,\ldots,10 $.
    Czy widać różnicę w wyniku?

    Powtórz zadanie w arytmetyce pojedynczej precyzji, tzn. z wykorzystaniem funkcji octave'a single(x).

  6. Wykres wielomianu na dwa sposoby

    Oblicz wartości wielomianu

    $$(x-2)^4 =x^4-.....+16$$

    na siatce równomiernej $ 1000 $ punktowej na $ [2-a,2+a] $ dla $ a=10^{-3} $ za pomocą
    dwóch algorytmów:\\
    Algorytm 1

    $$<br />
a= (x-2), \quad<br />
f_1(x)=a^4;<br />
$$

    \\ Algorytm 2

    $$<br />
 f_2(x)=x*x*x*x-\ldots+16.<br />
$$

    Matematycznie $ f_1\equiv f_2 $, ale wyniki obliczone w arytmetyce zmiennopozycyjnej mogą się różnić.

    Narysuj wykresy obu funkcji i policz błąd $ \| f_1(x)-f_2(x) \|_\infty $, czyli $ \max_k |f_1(x(k)-f_2(x(k))| $. Tu $ x(k)=2-a+k*h $ dla $ h=a/500 $.
    Wektor $ x $ można utworzyć w octavie przy pomocy funkcji octave'a
    linspace().

  7. Powtórz poprzednie zadanie dla arytmetyki pojedynczej precyzji, tzn. powtórz obliczenia wielomianu $ (x-2)^4=x^4-.....+16 $ na odcinku $ [2-a,2+a] $ dla $ a=10^{-3},10^{-2},10^{-4} $ dla zmiennych w pojedynczej precyzji uzyskanych za pomocą funkcji octave'a: single(x). Narysuj
    wykresy wielomianu obliczanego obydwoma algorytmami.

  8. Przybliżenie $ \exp(x) $ z rozwinięcia w szereg $ \sum_{k=0}^\infty x^k/k! $. Za odpowiednią aproksymacje $ \exp(x) $ bierzemy najpierw sto pierwszych elementów szeregu czyli przybliżamy $ \exp(x) $ przez
    $$F_N(x)=\sum_{k=0}^N\frac{x^k}{k!},$$

    dla $ N=100 $, a potem przybliżamy przez tysiąc elementów szeregu, czyli ustalamy $ N=1000 $.

    Sprawdź błąd względny $ |F_N(x)-\exp(x)|/|\exp(x)| $ dla $ x $ od $ -100 $ do $ 100 $ (np. dla liczb różniących się o dziesięć, czyli
    $ -100+k*10 $ dla $ k=0,\ldots,20 $) dla obu wartości $ N $.

    Czy błędy dla liczb ujemnych i dodatnich są tego samego rzędu?

    Jak zmodyfikować
    powyższą metodę przybliżonego obliczania funkcji eksponencjalnej $ \exp(x) $ dla $ x<<0 $ tak aby błąd względny był na tym samym poziomie co dla $ x>0 $?

  9. Policz całki $ I_n=\int_0^1x^n/(5+x)d x $ $ n=0,..,20 $
    dwoma algorytmami
    ze wzoru

    $$I_n+5*I_{n-1}=1/n$$

    Pierwszy algorytm przyjmuje
    $ I_0=\log(6/5) $ i oblicza z powyższego wzoru kolejne

    $$<br />
   I_n=1/n-5*I_{n-1}<br />
$$

    dla $ n=1,2,3,\ldots $.

    Drugi algorytm wykorzystuje fakt, że
    \begin{equation} (#)
    \frac{1}{(n+1)6} \leq I_n\leq \frac{1}{(n+1)5}
    \end{equation}
    W tym algorytmie przyjmujemy za $ I_{30} $ jakąkolwiek wartość z tego przedziału np.
    $ I_{30}=1/180 $ i
    iterujemy w tył, tzn. dla $ n=30,29,\ldots,20,\ldots,0 $ obliczamy

    $$<br />
  I_{n-1}=\frac{1}{5}(1/n-I_n).<br />
$$

    Porównaj wyniki obu algorytmów dla $ 0\leq n\leq 20 $ oraz sprawdź czy wyniki otrzymane w octave'ie spełniają oszacowanie
    ( [link]) dla $ n=1,\ldots,20 $.

    Dlaczego jeden z algorytmów działa zdecydowanie lepiej w arytmetyce zmiennopozycyjnej?

    Jako dodatkowe zadanie teoretyczne pozostawimy uzasadnienie wzoru rekurencyjnego i oszacowania ( [link]) wykorzystywanych w algorytmach.

  10. Zastosuj algorytm bisekcji (algorytm połowienia odcinka) dla funkcji $ (x-2)^3 $ liczonej z wzoru na rozwinięcie dwumianu $ x^3-...-8 $ startując z $ a=2-10^{-3} $ a $ b=2+10^{-3} $.
    Jako warunek zakończenia działania algorytmu przyjmujemy, że błąd jest mniejszy od $ 10^{-20} $ (za przybliżenie rozwiązania przyjmujemy środek danego odcinka w metodzie bisekcji, czyli warunkiem zakończenia iteracji jest to, że długości odcinka, w którym jest rozwiązanie powinna być mniejsza od $ 2*10^{-20} $).

    Czy algorytm zwraca przybliżenie liczby dwa jedynego pierwiastka tego wielomianu?

    Narysuj wykresy tej funkcji obliczone z obu wzorów. tzn. $ (x-2)^3 $ i $ x^3-...-8 $ na odcinkach $ 2+[-h,2*h] $ dla
    $ h=10^{-3},10^{-4},10^{-5} $. Czy z wykresów wynika, że ten wielomian ma tylko jedno miejsce zerowe w otoczeniu dwa?