MN03LAB: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Przykry (dyskusja | edycje)
mNie podano opisu zmian
m Zastępowanie tekstu – „\displaystyle ” na „”
Linia 32: Linia 32:


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">
<div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> Kluczem jest wyjaśnienie, jaka jest reprezentacja liczby <math>\displaystyle 10^{309}</math> w podwójnej precyzji... A reprezentacja <math>\displaystyle 10^{306}</math>? </div>
<div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> Kluczem jest wyjaśnienie, jaka jest reprezentacja liczby <math>10^{309}</math> w podwójnej precyzji... A reprezentacja <math>10^{306}</math>? </div>
</div></div>
</div></div>


Linia 41: Linia 41:
<div class="exercise">
<div class="exercise">


Podaj przykłady <strong>zbieżnych</strong> szeregów postaci <math>\displaystyle \sum_{n=1}^{\infty} a_n</math>, których <math>\displaystyle N</math>-te sumy częściowe
Podaj przykłady <strong>zbieżnych</strong> szeregów postaci <math>\sum_{n=1}^{\infty} a_n</math>, których <math>N</math>-te sumy częściowe
obliczone w arytmetyce pojedynczej precyzji algorytmem
obliczone w arytmetyce pojedynczej precyzji algorytmem
  <div style="margin: 1em; padding:1em; color: #000; background-color:#fcfcfc;"><pre>suma = 0.0;
  <div style="margin: 1em; padding:1em; color: #000; background-color:#fcfcfc;"><pre>suma = 0.0;
for n = 1..N
for n = 1..N
suma += <math>\displaystyle a_n</math>;
suma += <math>a_n</math>;
</pre></div>
</pre></div>
   
   
będą  
będą  
* ograniczone niezależnie od <math>\displaystyle N</math>, albo
* ograniczone niezależnie od <math>N</math>, albo
* numerycznie rozbieżne, to znaczy takie, że dla bardzo dużych <math>\displaystyle N</math> zachodzi <code style="color: #006">suma == Inf</code>.
* numerycznie rozbieżne, to znaczy takie, że dla bardzo dużych <math>N</math> zachodzi <code style="color: #006">suma == Inf</code>.
   
   
Wykonaj to samo zadanie, ale podając przykłady szeregów  <strong>rozbieżnych</strong> (w
Wykonaj to samo zadanie, ale podając przykłady szeregów  <strong>rozbieżnych</strong> (w
Linia 60: Linia 60:
Rozpatrz na przykład takie szeregi:
Rozpatrz na przykład takie szeregi:
* Szereg zerowy (numerycznie dostajesz oczywiście też 0)
* Szereg zerowy (numerycznie dostajesz oczywiście też 0)
* <math>\displaystyle 1 + 10^{2006} - 10^{2006} + 0 + \ldots = 1</math> oraz <math>\displaystyle 1 + 10^{2006} - 1 + 0 + \ldots = 10^{2006}</math> (numerycznie dostaniesz, odpowiednio, <code style="color: #006">NaN</code> (dlaczego?) i <code style="color: #006">Inf</code>.
* <math>1 + 10^{2006} - 10^{2006} + 0 + \ldots = 1</math> oraz <math>1 + 10^{2006} - 1 + 0 + \ldots = 10^{2006}</math> (numerycznie dostaniesz, odpowiednio, <code style="color: #006">NaN</code> (dlaczego?) i <code style="color: #006">Inf</code>.
* Szereg harmoniczny (numerycznie sumy częściowe w pewnym momencie przestaną rosnąć).
* Szereg harmoniczny (numerycznie sumy częściowe w pewnym momencie przestaną rosnąć).
* Szereg jedynkowy.
* Szereg jedynkowy.
Linia 70: Linia 70:
<div class="exercise">
<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>N</math>, wyznacz <math>N</math>-tą sumę częściową szeregu Taylora dla funkcji wykładniczej, gdy <math>x=-90</math>:
<center><math>\displaystyle
<center><math>
e^x \approx \sum_{n=0}^N \frac{x^n}{n!},
e^x \approx \sum_{n=0}^N \frac{x^n}{n!},
</math></center>
</math></center>
Linia 77: Linia 77:
korzystając z algorytmu podanego w poprzednim zadaniu. Oblicz błąd względny
korzystając z algorytmu podanego w poprzednim zadaniu. Oblicz błąd względny
i bezwzględny wyznaczonego przybliżenia, w porównaniu  
i bezwzględny wyznaczonego przybliżenia, w porównaniu  
do wartości wyznaczonej z wykorzystaniem funkcji bibliotecznej <code>exp()</code>. Powtórz następnie dla <math>\displaystyle x=10</math>.
do wartości wyznaczonej z wykorzystaniem funkcji bibliotecznej <code>exp()</code>. Powtórz następnie dla <math>x=10</math>.


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>e^{x}</math>. Objaśnij dokładnie, co się stało.
</div></div>
</div></div>


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em">   
Zastosowanie naszego algorytmu dla <math>\displaystyle x=-90</math> daje w wyniku (dla arytmetyki
Zastosowanie naszego algorytmu dla <math>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>10^{30}</math>,  
gdy oczywiście naprawdę <math>\displaystyle \exp(-90)
gdy oczywiście naprawdę <math>\exp(-90)
\approx 0</math>). Problem jest skutkiem zjawiska redukcji cyfr przy odejmowaniu: aby
\approx 0</math>). 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
nasza suma była równa zeru, w pewnym momencie musimy odjąć duży składnik od
Linia 92: Linia 92:
moment i wartość dodawanego składnika.
moment i wartość dodawanego składnika.


Dla <math>\displaystyle x=10</math> mamy, dla rosnącego <math>\displaystyle N</math>, całkiem niezły błąd względny ostatecznego
Dla <math>x=10</math> mamy, dla rosnącego <math>N</math>, całkiem niezły błąd względny ostatecznego
wyniku.
wyniku.


Linia 101: Linia 101:
<div class="exercise">
<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>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>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.  


Linia 115: Linia 115:
<div class="exercise">
<div class="exercise">


Jak wiadomo, szereg harmoniczny <math>\displaystyle \sum_{n=1}^\infty 1/n</math> jest rozbieżny.
Jak wiadomo, szereg harmoniczny <math>\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
arytmetyce podwójnej precyzji przy użyciu poniższego kodu.
arytmetyce podwójnej precyzji przy użyciu poniższego kodu.
Linia 144: Linia 144:
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em">   
Nasza suma przekroczy wartość 20, więc aby <code>20 + dskladnik == 20</code>, musi
Nasza suma przekroczy wartość 20, więc aby <code>20 + dskladnik == 20</code>, musi
być dskładnik <math>\displaystyle \approx 10^{-15}</math> (lub więcej). Tymczasem zakres liczb typu integer wynosi niewiele ponad <math>\displaystyle 10^9</math>, więc po jakimś czasie <code>dlicznik</code> przyjmie wartości ujemne.
być dskładnik <math>\approx 10^{-15}</math> (lub więcej). Tymczasem zakres liczb typu integer wynosi niewiele ponad <math>10^9</math>, więc po jakimś czasie <code>dlicznik</code> przyjmie wartości ujemne.


</div></div></div>
</div></div></div>
Linia 154: Linia 154:
<div class="exercise">
<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>a>1</math> należy wyznaczyć przybliżenie <math>\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>x_0</math> wiedząc, że <math>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>\epsilon</math>-zadowalające przybliżenie?
</div></div>
</div></div>


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em">   


Jak pamiętamy, <math>\displaystyle a = (1+f)2^p = \widetilde{f} 2^{p+1}</math>,
Jak pamiętamy, <math>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>\frac{1}{2}\leq \widetilde{f} < 1</math> oraz <math>p\in N</math>. Stąd


<center><math>\displaystyle
<center><math>
\sqrt{a} = \sqrt{\widetilde{f}}2^{(p+1)/2} = \sqrt{g} 2^k,
\sqrt{a} = \sqrt{\widetilde{f}}2^{(p+1)/2} = \sqrt{g} 2^k,
</math></center>
</math></center>


dla pewnego (znanego) <math>\displaystyle k \in N</math>, przy czym <math>\displaystyle \frac{1}{2} \leq \sqrt{g} \leq 1</math>.  
dla pewnego (znanego) <math>k \in N</math>, przy czym <math>\frac{1}{2} \leq \sqrt{g} \leq 1</math>.  
Wobec tego, obliczenie
Wobec tego, obliczenie
<math>\displaystyle \sqrt{a}</math> wymaga po prostu wyznaczenia <math>\displaystyle \sqrt{g}</math>. Najprostsze przybliżenie <math>\displaystyle \sqrt{g}</math> to
<math>\sqrt{a}</math> wymaga po prostu wyznaczenia <math>\sqrt{g}</math>. Najprostsze przybliżenie <math>\sqrt{g}</math> to
<math>\displaystyle \sqrt{g}\approx 1</math>. Błąd takiego przybliżenia to
<math>\sqrt{g}\approx 1</math>. Błąd takiego przybliżenia to
<math>\displaystyle |\sqrt{g} - 1| \leq 0.5</math>.  
<math>|\sqrt{g} - 1| \leq 0.5</math>.  


Jak można jeszcze bardziej poprawić <math>\displaystyle x_0</math>?
Jak można jeszcze bardziej poprawić <math>x_0</math>?


</div></div></div>
</div></div></div>
Linia 184: Linia 184:
<div class="exercise">
<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>\frac{1}{a}</math> stosując metodę Newtona do równania
<math>\displaystyle \frac{1}{x} - a = 0</math>. Zaproponuj
<math>\frac{1}{x} - a = 0</math>. 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>x_0</math> wiedząc, że <math>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>\epsilon</math>-zadowalające przybliżenie?
</div></div>
</div></div>


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em">   
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>a = (1+f)2^p</math>, skąd <math>\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>\frac{1}{1+f}</math>. Ponieważ dla <math>0 \leq f < 1</math>,


<center><math>\displaystyle \frac{1}{2} \leq \frac{1}{1+f} \leq 1,
<center><math>\frac{1}{2} \leq \frac{1}{1+f} \leq 1,
</math></center>
</math></center>


to możemy jako pierwsze przybliżenie wybrać <math>\displaystyle x_0 = \frac{3}{4}2^{-p}</math> (jak
to możemy jako pierwsze przybliżenie wybrać <math>x_0 = \frac{3}{4}2^{-p}</math> (jak
wybrać jeszcze lepsze <math>\displaystyle x_0</math>?)
wybrać jeszcze lepsze <math>x_0</math>?)


Wtedy mamy następujące oszacowania:
Wtedy mamy następujące oszacowania:


<center><math>\displaystyle |x_0a - 1| = |\frac{3}{4}2^{-p}\cdot (1+f)2^p - 1| = |\frac{3}{4}(1+f) - 1|
<center><math>|x_0a - 1| = |\frac{3}{4}2^{-p}\cdot (1+f)2^p - 1| = |\frac{3}{4}(1+f) - 1|
\leq \frac{1}{2}.
\leq \frac{1}{2}.
</math></center>
</math></center>
Linia 208: Linia 208:
Ponieważ iteracja Newtona spełnia
Ponieważ iteracja Newtona spełnia


<center><math>\displaystyle |x_{k+1}a - 1| = |x_ka-1|^2 = |x_0a-1|^{2^k},
<center><math>|x_{k+1}a - 1| = |x_ka-1|^2 = |x_0a-1|^{2^k},
</math></center>
</math></center>


to, jeśli chcemy, by błąd względny przybliżenia <math>\displaystyle x_{k+1}</math> spełniał <math>\displaystyle \frac{|x_{k+1} -
to, jeśli chcemy, by błąd względny przybliżenia <math>x_{k+1}</math> spełniał <math>\frac{|x_{k+1} -
\frac{1}{a}|}{\frac{1}{a}} = |x_{k+1}a - 1| \leq \epsilon = 2^{-53}</math>,  
\frac{1}{a}|}{\frac{1}{a}} = |x_{k+1}a - 1| \leq \epsilon = 2^{-53}</math>,  
musimy wykonać co najwyżej <math>\displaystyle 6</math> iteracji. Ponieważ koszt jednej iteracji
musimy wykonać co najwyżej <math>6</math> iteracji. Ponieważ koszt jednej iteracji
to 3 działania arytmetyczne,  wyznaczenie odwrotności <math>\displaystyle a</math> byłoby 18 razy droższe od mnożenia i dodawania, które mają podobny koszt.
to 3 działania arytmetyczne,  wyznaczenie odwrotności <math>a</math> 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ć, [http://www.cs.utexas.edu/users/moore/publications/divide_paper.pdf  jak to się dzieje np. w procesorach AMD].
Tymczasem, we współczesnych realizacjach, dzielenie jest tylko około 4 razy droższe od mnożenia! Możesz sprawdzić, [http://www.cs.utexas.edu/users/moore/publications/divide_paper.pdf  jak to się dzieje np. w procesorach AMD].
Linia 228: Linia 228:
<div class="exercise">
<div class="exercise">


Niech <math>\displaystyle 0 < a_1 < a_2 < \cdots < a_n</math>. Czy z punktu widzenia  
Niech <math>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>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></div>
Linia 241: Linia 241:
<div class="exercise">
<div class="exercise">


Dlaczego w algorytmie bisekcji rozwiązywania równania <math>\displaystyle f(x)=0</math>, sprawdzając warunek różnych znaków <math>\displaystyle f</math> w krańcach przedziału <math>\displaystyle [a,b]</math>, używamy kryterium  
Dlaczego w algorytmie bisekcji rozwiązywania równania <math>f(x)=0</math>, sprawdzając warunek różnych znaków <math>f</math> w krańcach przedziału <math>[a,b]</math>, używamy kryterium  
  <div style="margin: 1em; padding:1em; color: #000; background-color:#fcfcfc;"><pre>if ( sign(f(x)) != sign(f(xl)) )
  <div style="margin: 1em; padding:1em; color: #000; background-color:#fcfcfc;"><pre>if ( sign(f(x)) != sign(f(xl)) )
...
...
Linia 258: Linia 258:


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em">   
Gdy zbliżamy się do miejsca zerowego <math>\displaystyle f</math>, wartości <code>f(x)</code> i <code>f(lewy)</code> mogą być na tyle małe, że ich iloczyn --- poprzez niedomiar --- będzie miał numeryczną wartość zero i w efekcie program może przeskoczyć do niewłaściwej gałęzi pętli <code>if</code>, a tym samym --- wybrać niewłaściwą lokalizację przedziału zawierającego poszukiwany pierwiastek.
Gdy zbliżamy się do miejsca zerowego <math>f</math>, wartości <code>f(x)</code> i <code>f(lewy)</code> mogą być na tyle małe, że ich iloczyn --- poprzez niedomiar --- będzie miał numeryczną wartość zero i w efekcie program może przeskoczyć do niewłaściwej gałęzi pętli <code>if</code>, a tym samym --- wybrać niewłaściwą lokalizację przedziału zawierającego poszukiwany pierwiastek.
</div></div></div>
</div></div></div>

Wersja z 08:44, 28 sie 2023


Własności arytmetyki zmiennoprzecinkowej

<<< Powrót do strony głównej przedmiotu Metody numeryczne

Oglądaj wskazówki i rozwiązania __SHOWALL__
Ukryj wskazówki i rozwiązania __HIDEALL__

Ćwiczenie: Równe i równiejsze

Wyjaśnij, dlaczego w arytmetyce podwójnej precyzji IEEE 754 mamy

octave:19> 2006/1e309 ans = 0 octave:20> 2.006/1e306 ans = 2.0060e-306 octave:21> (2006/1000)/(1e309/1000) ans = 0

Oczywiście, "teoretycznie" wszystkie trzy liczby powinny być sobie równe (i niezerowe).

Wskazówka

Ćwiczenie: Szeregi zbieżne(?)

Podaj przykłady zbieżnych szeregów postaci n=1an, których N-te sumy częściowe obliczone w arytmetyce pojedynczej precyzji algorytmem

suma = 0.0;
for n = 1..N
	suma += <math>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

Ć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. Oblicz błąd względny i bezwzględny wyznaczonego przybliżenia, 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

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

Wskazówka

Ć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 = %e. Liczba składników = %d, składnik = %e\n", 
		dsuma, dlicznik-1, dskladnik);
	 
Wskazówka
Rozwiązanie


Ć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

Ć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

Ćwiczenie

Dlaczego w algorytmie bisekcji rozwiązywania równania f(x)=0, sprawdzając warunek różnych znaków f w krańcach przedziału [a,b], używamy kryterium

if ( sign(f(x)) != sign(f(xl)) )
...	

a nie, matematycznie równoważnego, wyrażenia

if ( f(x)*f(lewy) < 0 )	
...
Wskazówka
Rozwiązanie