MN03LAB: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
m Zastępowanie tekstu – „.↵</math>” na „</math>”
m Zastępowanie tekstu – „,↵</math>” na „</math>,”
 
Linia 72: Linia 72:
Dla kolejnych <math>N</math>, wyznacz <math>N</math>-tą sumę częściową szeregu Taylora dla funkcji wykładniczej, gdy <math>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>
<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>


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
Linia 165: Linia 164:


<center><math>
<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>k \in N</math>, przy czym <math>\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>.  
Linia 194: Linia 192:
Wystarczy więc przybliżyć <math>\frac{1}{1+f}</math>. Ponieważ dla <math>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>\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>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
Linia 207: Linia 204:
Ponieważ iteracja Newtona spełnia
Ponieważ iteracja Newtona spełnia


<center><math>|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>x_{k+1}</math> spełniał <math>\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} -

Aktualna wersja na dzień 21:44, 11 wrz 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