====== Analiza numeryczna (M) - Lista 3. ====== * {{:analiza_numeryczna:09.listam03.pdf|Lista 3}}. ===== Zadanie 1. ===== Można to zrobić bez użycia indukcji, ale dla nie wszystkich to może być oczywiste, więc bedzie indukcja. $n = 1$. $\displaystyle \prod_{i=1}^1{(1+\varepsilon_i)} = 1+\varepsilon_1 = 1+\sigma_1$ $n > 1$. $\displaystyle \prod_{i=1}^n{(1+\varepsilon_i)} = (1 + \sigma_{n-1})(1 + \varepsilon_n) = 1 + \sigma_{n-1} + \varepsilon_n + \sigma_{n-1}\cdot\varepsilon_n = 1 + \sigma_{n} + (\varepsilon_1\cdot\varepsilon_n + \varepsilon_2\cdot\varepsilon_n + \cdots + \varepsilon_{n-1}\cdot\varepsilon_n + O(2^{-2t})\cdot\varepsilon_n) \buildrel{(*)}\over{=} 1 + \sigma_n$ (*) Każdy z czynników $\varepsilon_i\cdot\varepsilon_n$ (dla i < n) jest mniejszy od $2^{-t}\cdot2^{-t} = 2^{-2t}$, więc można je wrzucić "pod" $O(2^{-2t})$ z $\sigma_n$. ===== Zadanie 2. ===== $\displaystyle |\sigma_n| \leq |\varepsilon_1| + |\varepsilon_2| + \cdots + |\varepsilon_n| + O(2^{-2t}) \buildrel{(2)}\over\leq n\cdot2^{-t} + O(2^{-2t}) \buildrel{(1)}\over\leq \frac{n2^{-t}}{1 - \frac 1 2 n 2^{-t}} = \omega_n$ (1) Ponieważ $n < 2\cdot2^t$, zawsze zachodzi $1 - \frac 1 2 n 2^{-t} < 1$. Mianownik zwiększa więc cały ułamek, w dodatku bardziej niż dodanie $O(2^{-2t})$. \\ (2) Przyda sie w zadaniu 3. edit: dotlumaczenie (1): $n\cdot2^{-t} + O(2^{-2t}) \leq \frac{n2^{-t}}{1 - \frac 1 2 n 2^{-t}}$ $\displaystyle O(2^{-2t}) \leq \frac{n2^{-t} - n2^{-t}(1 - \frac 1 2 n 2^{-t})}{1 - \frac 1 2 n 2^{-t}} = \frac{ \frac 1 2 n^2 2^{-2t} }{1 - \frac 1 2 n 2^{-t}} = \frac{ O(1) } { 1 - \frac 1 2 n 2^{-t} }$ (a to juz jest dosyc oczywiste) ===== Zadanie 3. ===== Ma być $\omega_n \leq n ( 1.06 \cdot 2^{-t} )$, czyli mianownik $\omega_n$ powinien zwiększać całośc ułamka o mniej niż 1.06, czyli powinien być większy od $\frac 1 {1.06} \approx 0.943$. $1- \frac 1 2 n 2^{-t} > 0.943$ \\ Czyli musi zachodzić $\frac 1 2 n 2^{-t} < 0.057 $. Sprawdźmy: $\frac 1 2 n 2^{-t} < \frac 1 2 \cdot (0.1) \cdot 2^t \cdot 2^{-t} = 0.05 < 0.057$. OK. Teraz pozostaje wywnioskować drugą nierówność: $\sigma_n \leq \omega_n \leq n (1.06 \cdot 2^{-t}) = n \cdot 2^{-t + \log(1.06)} = n \cdot 2^{-t + 0.08406} \buildrel{<}\over{\sim} n \cdot 2^{-t}$ Troche komentarza: ostatnia nierówność jest dlatego, że różnica w wykładniku rzędu -0.08 niewiele zmienia przebieg funkcji. Patrz notatki z wykładu. Ten wniosek można było również wyciągnąc patrząc po prostu na wzór $\sigma_n$. Jak widać, zaburzeniem nierówności jest $O(2^{-2t})$. ===== Zadanie 4. ===== $\overline s_0 = 0$ $\overline s_k = \overline s_{k-1}(1+\varepsilon_{2k+1}) + x_ky_k(1+\varepsilon_{2k})(1+\varepsilon_{2k+1})$ $\overline s_n = \displaystyle \sum_{i=0}^{n}{x_iy_i( 1 + \varepsilon_{2i} )(\prod_{j=0}^i{(1+\varepsilon_{2j+1})})} \approx \sum_{i=0}^{n}{x_iy_i( 1 + \varepsilon_{2i} )(1 + \varepsilon_1 + \varepsilon_3 + \cdots + \varepsilon_{2i+1})} \approx \sum_{i=0}^{n}{x_iy_i(1 + \varepsilon_1 + \varepsilon_3 + \cdots + \varepsilon_{2i} + \varepsilon_{2i+1})} \leq (1 + \varepsilon_1 + \varepsilon_3 + \cdots + \varepsilon_{2n-1} + \varepsilon_{2n+1})\sum_{i=0}^{n}{x_iy_i}$ ===== Zadanie 5. ===== a) Wykaż, że $[a_n,b_n] \supset [a_{n+1},b_{n+1}] $ gdzie $ n \geq 0 $. Zgodnie z zasadami metody bisekcji: $I_{n+1}=[a_{n+1},b_{n+1}] = \begin{cases} {[m_{n+1},b_n], \ f(m_{n+1})f(a_n)>0} \cr {[a_n,m_{n+1}], \ f(a_n)f(m_{n+1})<0} \end{cases} $ gdzie $m_n = \frac{1}{2}(a_n+b_n)$ stąd oczywiście: $[a_{n+1},b_{n+1}]\subseteq [a_n,b_n]$ b) policzymy "długość" przedziału $|[a_n,b_n]|$ , wprost z definicji metody bisekcji. Wiemy że długość przedziału jest równa różnicy jego końców.. (pominę pisanie warunków, są identyczne jak w podpunkcie a) ) $|[a_{n+1},b_{n+1}]| = \begin{cases} {|[m_{n+1},b_n]| = b_n - \frac{a_n +b_n}{2} = \frac{b_n - a_n}{2} = \frac{1}{2}|[a_n,b_n]|} \cr {|[a_n,m_{n+1}]| = \frac{a_n +b_n}{2}- a_n = \frac{b_n - a_n}{2} = \frac{1}{2}|[a_n,b_n]|} \end{cases} $ zatem: $|[a_n,b_n]| = 2^{-1}|[a_{n-1},b_{n-1}]| = 2^{-2}|[a_{n-2},b_{n-2}]| =...= 2^{-n}|[a_0,b_0]| = 2^{-n}(b_0-a_0)$ czyli.. $\frac{|[a_n,b_n]|}{|[a_0,b_0]|} = 2^{-n}$ c) Wykaż, że $|e_n| \leq 2^{-n-1}(b_0-a_0)$ dla $ n \geq 0 $ Obliczenia przerwaliśmy po znalezieniu przedziału $[a_n,b_n]$, pierwiastek $\alpha$ na pewno się w nim znajduje. Pierwiastek przebliżamy wzorem: $ \alpha = \lim_{n\to\infty} m_n $ czyli do połowy znalezionego przedziału, więc błąd przybliżenia jest mniejszy równy połowie długości przedziału.. Zatem $|e_n|=|\alpha - m_n| \leq |[a_{n+1},b_{n+1}]| = 2^{-(n+1)}|[a_0,b_0]| = 2^{-n-1}(b_0-a_0)$ ===== Zadanie 6. ===== 6. Ile kroków według metody bisekcji należy wykonać, żeby wyznaczyć zero $\alpha$ z błędem bezwzględnym mniejszym niż zadana liczba $ \epsilon > 0 $. Czyli chcemy, aby $|e_n| < \epsilon $. Z zadania poprzedniego wiemy, że $|e_n| \leq 2^{-n-1}(b_0-a_0)$ czyli: $ 2^{-n-1} < \frac{\epsilon}{b_0 - a_0}$ $ 2^{n+1} > \frac{b_0 - a_0}{\epsilon} $ $ n > log_2 \frac{b_0 - a_0}{\epsilon} - 1 $ interesuje nas najmniejsza pewna liczba całkowita spełniająca powyższą nierównosć, więc: $ k(\epsilon) = \lceil log_2 \frac{b_0 - a_0}{\epsilon} \rceil -1 $ ===== Zadanie 7. ===== ^ $n$ ^ $m$ ^ $|e_n|$ ^ $\overline{|e_n|}$ ^ | 0 | 6.0000000000e-02 | 4.6926359948e-03 | 1.0000000000e-02 | | 1 | 6.5000000000e-02 | 3.0736400520e-04 | 2.5000000000e-03 | | 2 | 6.2500000000e-02 | 2.1926359948e-03 | 6.2500000000e-04 | | 3 | 6.3750000000e-02 | 9.4263599480e-04 | 1.5625000000e-04 | | 4 | 6.4375000000e-02 | 3.1763599480e-04 | 3.9062500000e-05 | | 5 | 6.4687500000e-02 | 5.1359947960e-06 | 9.7656250000e-06 | | 6 | 6.4843750000e-02 | 1.5111400520e-04 | 2.4414062500e-06 | | 7 | 6.4765625000e-02 | 7.2989005204e-05 | 6.1035156250e-07 | | 8 | 6.4726562500e-02 | 3.3926505204e-05 | 1.5258789062e-07 | | 9 | 6.4707031250e-02 | 1.4395255204e-05 | 3.8146972656e-08 | | 10 | 6.4697265625e-02 | 4.6296302040e-06 | 9.5367431641e-09 | | 11 | 6.4692382813e-02 | 2.5318229599e-07 | 2.3841857910e-09 | | 12 | 6.4694824219e-02 | 2.1882239540e-06 | 5.9604644775e-10 | | 13 | 6.4693603516e-02 | 9.6752082901e-07 | 1.4901161194e-10 | | 14 | 6.4692993164e-02 | 3.5716926651e-07 | 3.7252902985e-11 | | 15 | 6.4692687988e-02 | 5.1993485267e-08 | 9.3132257461e-12 | Wygenerowane przez: import math alpha = 0.0646926359947960 def f(x): return x * math.exp(-x) - 0.06064 def bisect(f,a,b,n,nmax): if f(b) < 0 and n == 0: raise if n > nmax: return m = (b+a)/2 e = math.fabs(alpha - m) eapprox = 2**(-n-1) * (b-a) print '| %d | %.10e | %.10e | %.10e |' % (n,m,e,eapprox) if f(m) == 0: print "f(%) = 0", m return elif f(m) < 0: bisect(f,m,b,n+1,nmax) else: bisect(f,a,m,n+1,nmax) def main(): bisect(f,0.05,0.07,0,15) if __name__ == "__main__": main() A czemu oszacowanie liczysz od b-a, a nie od b_0-a_0? No fakt, pomyliło mi się. Widać tu zalety upubliczniania kodu (wystarczy zmienić program w dwóch miejscach :)//--drx// ===== Zadanie 8. ===== //(by kz)// {{:analiza_numeryczna:wykres8.png|}} oszacowania z wykresu i reszta metodą bisekcji\\ funkcja jest symetryczna więc wystarczy policzyć zera po jednej stronie OY\\ +/- **1.9688**7293782\\ +/- **3.1619**5002471\\ from math import * def f(x): return x**2 + 10*cos(x) eps = pow(10,-12) def seek(a,b): if f(a)*f(b) > 0.: return None c = (a+b)/2. if f(c) == 0. or abs(b-a) < eps: return c elif f(a)*f(c) < 0.: return seek(a,c) else: return seek(c,b) print seek(-3.5,-3) print seek(-2.5,-1.5) print seek(1.5,2.5) print seek(3.0,3.5) {{tag>[listy_zadan]}}