MN14: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Przykry (dyskusja | edycje)
Nie podano opisu zmian
Przykry (dyskusja | edycje)
mNie podano opisu zmian
Linia 31: Linia 31:
całka <math>\displaystyle S(f)</math> będzie więc w ogólności przybliżana  
całka <math>\displaystyle S(f)</math> będzie więc w ogólności przybliżana  
wartością <math>\displaystyle A(f)</math>, która zależy tylko od wartości <math>\displaystyle f</math>  
wartością <math>\displaystyle A(f)</math>, która zależy tylko od wartości <math>\displaystyle f</math>  
i ew. jej pochodnych w skończonej liczbie punktów.  
i ewentualnie jej pochodnych w skończonej liczbie punktów.  


==Kwadratury==
==Kwadratury==
Linia 61: Linia 61:
od danej informacji o <math>\displaystyle f</math>, otrzymana w ten sposób wartość  
od danej informacji o <math>\displaystyle f</math>, otrzymana w ten sposób wartość  
też będzie zależeć tylko od tej informacji, a w  
też będzie zależeć tylko od tej informacji, a w  
konsekwencji funkcjonał wynikowy będzie postaci  
konsekwencji funkcjonał wynikowy będzie takiej postaci,
ja wyżej. Są to tzw. kwadratury interpolacyjne.  
jak wyżej. Są to tzw. kwadratury interpolacyjne.  


{{definicja|||
{{definicja|||
Linia 99: Linia 99:


<strong>Kwadratura prostokątów</strong> jest oparta na jednym węźle
<strong>Kwadratura prostokątów</strong> jest oparta na jednym węźle
<math>\displaystyle x_0=(a+b)//2</math>,  
<math>\displaystyle x_0=(a+b)/2</math>,  


<center><math>\displaystyle Q^{I}_0(f)\,=\,(b-a)f\Big(\frac{a+b}2\Big).
<center><math>\displaystyle Q^{I}_0(f)\,=\,(b-a)f\Big(\frac{a+b}2\Big).
</math></center>
</math></center>
[[Image:MNprostokaty.png|thumb|550px|center|Kwadratura prostokątów]]


<strong>Kwadratura trapezów</strong> jest oparta na jednokrotnych  
<strong>Kwadratura trapezów</strong> jest oparta na jednokrotnych  
Linia 110: Linia 112:
<center><math>\displaystyle Q^{I}_1(f)\,=\,T(f)\,=\,\frac{b-a}2 \Big(f(a)+f(b)\Big).
<center><math>\displaystyle Q^{I}_1(f)\,=\,T(f)\,=\,\frac{b-a}2 \Big(f(a)+f(b)\Big).
</math></center>
</math></center>
[[Image:MNtrapezy.png|thumb|550px|center|Kwadratura trapezów]]


<strong>Kwadratura parabol (Simpsona)</strong> jest oparta na  
<strong>Kwadratura parabol (Simpsona)</strong> jest oparta na  
jednokrotnych węzłach <math>\displaystyle x_0=a</math>, <math>\displaystyle x_1=b</math>, <math>\displaystyle x_2=(a+b)//2</math>,  
jednokrotnych węzłach <math>\displaystyle x_0=a</math>, <math>\displaystyle x_1=b</math>, <math>\displaystyle x_2=(a+b)/2</math>,  
i jest równa polu pod parabolą interpolującą <math>\displaystyle f</math>  
i jest równa polu pod parabolą interpolującą <math>\displaystyle f</math>  
w tych węzłach,  
w tych węzłach,  
Linia 123: Linia 127:
na węzłach jednokrotnych i równoodległych, przy czym  
na węzłach jednokrotnych i równoodległych, przy czym  
<math>\displaystyle x_0=a</math> i <math>\displaystyle x_n=b</math>. Ogólnie, kwadratury interpolacyjne  
<math>\displaystyle x_0=a</math> i <math>\displaystyle x_n=b</math>. Ogólnie, kwadratury interpolacyjne  
oparte na węzłach równoodległych <math>\displaystyle x_i=a+(b-a)i/ń</math>,  
oparte na węzłach równoodległych <math>\displaystyle x_i=a+(b-a)i/n</math>,  
<math>\displaystyle 0\le i\le n</math>, nazywamy <strong>kwadraturami Newtona--Cotesa</strong>.  
<math>\displaystyle 0\le i\le n</math>, nazywamy <strong>kwadraturami Newtona--Cotesa</strong>.  


Linia 129: Linia 133:


Zajmiemy się teraz błędem kwadratur interpolacyjnych.  
Zajmiemy się teraz błędem kwadratur interpolacyjnych.  
Przypomnijmy, że <math>\displaystyle F^n_M([a,b])</math> oznacza klasę funkcji  
Przypomnijmy, że <math>\displaystyle F^r_M([a,b])</math> oznacza klasę funkcji  
<math>\displaystyle (n+1)</math> razy różniczkowalnych w sposób ciągły  
<math>\displaystyle (r+1)</math> razy różniczkowalnych w sposób ciągły  
i takich, że <math>\displaystyle |f^{(n+1)}(x)|\le M</math>, <math>\displaystyle \forall x</math>.  
i takich, że <math>\displaystyle |f^{(r+1)}(x)|\le M</math>, <math>\displaystyle \forall x</math>.  
 
{{twierdzenie|O błędzie kwadratur interpolacyjnych|O błędzie kwadratur interpolacyjnych|


{{twierdzenie|||
Niech <math>\displaystyle Q^I</math> będzie kwadraturą  
Niech <math>\displaystyle Q^I</math> będzie kwadraturą  
interpolacyjną opartą na (jednokrotnych lub wielokrotnych)  
interpolacyjną opartą na (jednokrotnych lub wielokrotnych)  
węzłach <math>\displaystyle x_i</math>, <math>\displaystyle 0\le i\le n</math>. Jeśli <math>\displaystyle f\in F^n_M([a,b])</math> to  
węzłach <math>\displaystyle x_i</math>, <math>\displaystyle 0\le i\le n</math>. Jeśli <math>\displaystyle f\in F^n_M([a,b])</math>, to  


<center><math>\displaystyle  
<center><math>\displaystyle  
Linia 143: Linia 147:
</math></center>
</math></center>


W klasie <math>\displaystyle F^n_M([a,b])</math>, maksymalny błąd kwadratury <math>\displaystyle Q^I</math>   
W klasie <math>\displaystyle F^n_M([a,b])</math> maksymalny błąd kwadratury <math>\displaystyle Q^I</math>   
wynosi  
wynosi  


Linia 152: Linia 156:
}}
}}


''Dowód''\quad Korzystając ze znanego nam już wzoru na  
{{dowod|||
Korzystając ze znanego nam już wzoru na  
błąd interpolacji wielomianowej z Lematu [[##leblint|Uzupelnic: leblint ]], mamy  
błąd interpolacji wielomianowej z Lematu [[##leblint|Uzupelnic: leblint ]], mamy  


Linia 159: Linia 164:
</math></center>
</math></center>


Stąd, jeśli <math>\displaystyle f\in F^n_M([a,b])</math> to  
Stąd, jeśli <math>\displaystyle f\in F^n_M([a,b])</math>, to  


<center><math>\displaystyle |S(f)\,-\,Q^I(f)|\,\le\,\int_a^b (b-a)^{n+1}\frac M{(n+1)!}\,dx
<center><math>\displaystyle |S(f)\,-\,Q^I(f)|\,\le\,\int_a^b (b-a)^{n+1}\frac M{(n+1)!}\,dx
Linia 176: Linia 181:
</math></center>
</math></center>


Co prawda, <math>\displaystyle g</math> nie jest w <math>\displaystyle F^n_M{[a,b]}</math>, ale może być  
Co prawda, <math>\displaystyle g</math> nie jest w <math>\displaystyle F^n_M([a,b])</math>, ale może być  
dla dowolnego <math>\displaystyle \epsilon>0</math> przybliżana funkcjami  
dla dowolnego <math>\displaystyle \epsilon>0</math> przybliżana funkcjami  
<math>\displaystyle f_\epsilon\in F^n_M([a,b])</math> w ten sposób, że całka  
<math>\displaystyle f_\epsilon\in F^n_M([a,b])</math> w ten sposób, że całka  
Linia 193: Linia 198:


co wobec dowolności <math>\displaystyle \epsilon</math> daje dowód twierdzenia.  
co wobec dowolności <math>\displaystyle \epsilon</math> daje dowód twierdzenia.  
<math>\displaystyle \quad\Box</math>
}}


W szczególnych przypadkach kwadratur trapezów <math>\displaystyle T</math>  
W szczególnych przypadkach kwadratur trapezów <math>\displaystyle T</math>  
Linia 199: Linia 204:
na błąd.  
na błąd.  


{{twierdzenie|||
{{twierdzenie|O postaci błędu kwadratury trapezów i Simpsona|O postaci błędu kwadratury trapezów i Simpsona|
 
Jeśli <math>\displaystyle f\in C^{(2)}([a,b])</math>  
Jeśli <math>\displaystyle f\in C^{(2)}([a,b])</math>,
to dla kwadratury trapezów mamy  
to dla kwadratury trapezów mamy  


Linia 207: Linia 212:
</math></center>
</math></center>


Jeśli <math>\displaystyle f\in C^{(4)}([a,b])</math> to dla kwadratury  
Jeśli <math>\displaystyle f\in C^{(4)}([a,b])</math>, to dla kwadratury  
parabol mamy  
parabol mamy  


Linia 216: Linia 221:
}}
}}


''Dowód''\quad (i) Ze wzoru ([[##blkwad|Uzupelnic: blkwad ]])
{{dowod|||
Najpierw udowodnimy część dotyczącą kwadratury trapezów.
Ze wzoru na błąd kwadratury,


<center><math>\displaystyle S(f)\,-\,T(f)\,=\,\int_a^b (x-a)(x-b)f(a,b,x)\,dx.
<center><math>\displaystyle S(f)\,-\,T(f)\,=\,\int_a^b (x-a)(x-b)f(a,b,x)\,dx.
Linia 232: Linia 239:
dla pewnych <math>\displaystyle c,\xi_1\in [a,b]</math>.
dla pewnych <math>\displaystyle c,\xi_1\in [a,b]</math>.


(ii) Niech <math>\displaystyle w_{f,2}\in\Pi_2</math> i <math>\displaystyle w_{f,3}\in\Pi_3</math> będą  
Teraz zajmiemy się kwadraturą parabol.
Niech <math>\displaystyle w_{f,2}\in\Pi_2</math> i <math>\displaystyle w_{f,3}\in\Pi_3</math> będą  
wielomianami interpolacyjnymi funkcji <math>\displaystyle f</math> odpowiednio dla  
wielomianami interpolacyjnymi funkcji <math>\displaystyle f</math> odpowiednio dla  
węzłów <math>\displaystyle a,b,(a+b)//2</math> oraz <math>\displaystyle a,b,(a+b)//2,(a+b)//2</math>. Wtedy  
węzłów <math>\displaystyle a,b,(a+b)//2</math> oraz <math>\displaystyle a,b,(a+b)//2,(a+b)//2</math>. Wtedy  
Linia 259: Linia 267:
\endaligned</math></center>
\endaligned</math></center>


Ponieważ wielomian <math>\displaystyle (x-a)(x-(a+b)//2)^2(x-b)</math> jest  
Ponieważ wielomian <math>\displaystyle (x-a)(x-(a+b)/2)^2(x-b)</math> jest  
niedodatni na <math>\displaystyle [a,b]</math>, możemy znów zastosować twierdzenie  
niedodatni na <math>\displaystyle [a,b]</math>, możemy znów zastosować twierdzenie  
o wartości średniej. Mamy  
o wartości średniej. Mamy  
Linia 269: Linia 277:
\endaligned</math></center>
\endaligned</math></center>


co kończy dowód. <math>\displaystyle \quad\Box</math>
co kończy dowód.
}}


==Kwadratury złożone==
==Kwadratury złożone==


Podobnie jak w przypadku zadania interpolacji chcielibyśmy,
Chcielibyśmy, aby błąd kwadratur malał do zera, gdy liczba  
aby błąd kwadratur malał do zera, gdy liczba węzłów  
węzłów rośnie do nieskończoności. Można to osiągnąć stosując  
rośnie do nieskończoności. Można to osiągnąć stosując  
np. <strong>kwadratury złożone</strong>. Są to kwadratury, które  
np. <strong>kwadratury złożone</strong>. Są to kwadratury, które  
powstają przez scałkowanie funkcji kawałkami  
powstają przez scałkowanie funkcji kawałkami  
wielomianowej interpolującej <math>\displaystyle f</math>.  
wielomianowej interpolującej <math>\displaystyle f</math>.  


Prostym przykładem kwadratury złożonej jest suma Riemanna,  
[[grafika:Riemann.jpg|thumb|right|| Riemann<br>  [[Biografia Riemann|Zobacz biografię]]]]
 
Prostym przykładem kwadratury złożonej jest ''suma Riemanna'',  


<center><math>\displaystyle \bar Q(f)\,=\,\sum_{i=0}^n (t_{i+1}-t_i)f(x_i),  
<center><math>\displaystyle \bar Q(f)\,=\,\sum_{i=0}^n (t_{i+1}-t_i)f(x_i),  
Linia 287: Linia 297:
gdzie <math>\displaystyle a=t_0<t_1<\cdots<t_{n+1}=b</math> oraz  
gdzie <math>\displaystyle a=t_0<t_1<\cdots<t_{n+1}=b</math> oraz  
<math>\displaystyle x_i\in [t_i,t_{i+1}]</math>. Jeśli średnica podziału,  
<math>\displaystyle x_i\in [t_i,t_{i+1}]</math>. Jeśli średnica podziału,  
<math>\displaystyle \max_{0\le i\le n}(t_i-t_{i-1})</math>, maleje do zera to  
<math>\displaystyle \max_{0\le i\le n}(t_i-t_{i-1})</math>, maleje do zera, to  
<math>\displaystyle \lim_{n\to\infty}\bar Q(f)=S(f)</math>.  
<math>\displaystyle \lim_{n\to\infty}\bar Q(f)=S(f)</math>.  


Linia 295: Linia 305:
</math></center>
</math></center>


gdzie <math>\displaystyle \bar w_f</math> jest kawałkami wielomianem z
gdzie <math>\displaystyle \bar w_f</math> jest kawałkami wielomianem. Dokładniej,  
Rozdziału [[##kawwiel|Uzupelnic: kawwiel ]]. To znaczy, dla danego <math>\displaystyle n</math>  
dla danego <math>\displaystyle n</math> kładziemy <math>\displaystyle t_i=a+(b-a)i/k</math>, <math>\displaystyle 0\le i\le k</math>,  
kładziemy <math>\displaystyle t_i=a+(b-a)i//k</math>, <math>\displaystyle 0\le i\le k</math>, a następnie  
a następnie dla każdego <math>\displaystyle i</math> wybieramy dowolne węzły  
dla każdego <math>\displaystyle i</math> wybieramy dowolne węzły  
<math>\displaystyle x_{i,j}\in [t_{i-1},t_i]</math>, <math>\displaystyle 0\le j\le r</math>. Wtedy <math>\displaystyle \bar w_f</math>  
<math>\displaystyle x_{i,j}\in [t_{i-1},t_i]</math>, <math>\displaystyle 0\le j\le r</math>. Wtedy <math>\displaystyle \bar w_f</math>  
jest na każdym przedziale wielomianem interpolacyjnym  
jest na każdym przedziale wielomianem interpolacyjnym  
Linia 305: Linia 314:
o łącznej krotności <math>\displaystyle n\le k(r+1)</math>.  
o łącznej krotności <math>\displaystyle n\le k(r+1)</math>.  


{{twierdzenie|||
{{twierdzenie|O błędzie kwadratur złożonych|O błędzie kwadratur złożonych|
 
Błąd kwadratury złożonej  
Błąd kwadratury złożonej  
<math>\displaystyle \bar Q(f)</math> w klasie <math>\displaystyle F^r_M([a,b])</math> jest ograniczony przez  
<math>\displaystyle \bar Q(f)</math> w klasie <math>\displaystyle F^r_M([a,b])</math> jest ograniczony przez  
Linia 322: Linia 331:
}}
}}


''Dowód''\quad Twierdzenie to jest bezpośrednim  
{{dowod|||
Twierdzenie to jest bezpośrednim  
wnioskiem z Twierdzenia [[##twblkw|Uzupelnic: twblkw ]]. Mamy bowiem  
wnioskiem z Twierdzenia [[##twblkw|Uzupelnic: twblkw ]]. Mamy bowiem  


Linia 332: Linia 342:
\endaligned</math></center>
\endaligned</math></center>


co kończy dowód. <math>\displaystyle \quad\Box</math>
co kończy dowód.  
}}


W klasie <math>\displaystyle F^r_M([a,b])</math>, błąd kwadratur złożonych  
W klasie <math>\displaystyle F^r_M([a,b])</math>, błąd kwadratur złożonych  
jest rzędu <math>\displaystyle n^{-(r+1)}</math>, czyli jest taki sam jak
jest rzędu <math>\displaystyle n^{-(r+1)}</math>. Można pokazać, że błąd każdej  
błąd interpolacji kawałkami wielomianowej. I tak
jak przy interpolacji można pokazać, że błąd każdej  
innej metody całkowania korzystającej jedynie  
innej metody całkowania korzystającej jedynie  
z wartości funkcji w <math>\displaystyle n</math> punktach nie może w klasie  
z wartości funkcji w <math>\displaystyle n</math> punktach nie może w klasie  
<math>\displaystyle F^r_M([a,b])</math> maleć szybciej niż <math>\displaystyle n^{-(r+1)}</math>,
<math>\displaystyle F^r_M([a,b])</math> maleć szybciej niż <math>\displaystyle n^{-(r+1)}</math>.
zob. U. [[##optzlo|Uzupelnic: optzlo ]]. Podane kwadratury złożone mają  
Podane kwadratury złożone mają więc optymalny rząd  
więc optymalny rząd zbieżności.  
zbieżności.  


Zajmiemy się teraz błędem szczególnych kwadratur  
Zajmiemy się teraz błędem szczególnych kwadratur  
Linia 349: Linia 358:
zastosowanie na każdym przedziale <math>\displaystyle [t_{i-1},t_i]</math>  
zastosowanie na każdym przedziale <math>\displaystyle [t_{i-1},t_i]</math>  
odpowiednio kwadratur trapezów <math>\displaystyle T</math> i parabol <math>\displaystyle P</math>.  
odpowiednio kwadratur trapezów <math>\displaystyle T</math> i parabol <math>\displaystyle P</math>.  
[[Image:MNzlozonetrapezy.png|thumb|550px|center|Złożona kwadratura trapezów]]
Jak łatwo się przekonać,  
Jak łatwo się przekonać,  


Linia 362: Linia 374:
</math></center>
</math></center>


{{twierdzenie|||
{{twierdzenie|O postaci błędu złożonych kwadratur trapezów i Simpsona|O postaci błędu złożonych kwadratur trapezów i Simpsona|
Jeśli <math>\displaystyle f\in C^{(2)}([a,b])</math> to   
 
Jeśli <math>\displaystyle f\in C^{(2)}([a,b])</math>, to   


<center><math>\displaystyle S(f)\,-\,\bar T_k(f)\,=\,-\frac{(b-a)^2}{12\,k^2}
<center><math>\displaystyle S(f)\,-\,\bar T_k(f)\,=\,-\frac{(b-a)^3}{12\,k^2}
       f^{(2)}(\xi_1).
       f^{(2)}(\xi_1).
</math></center>
</math></center>


Jeśli <math>\displaystyle f\in C^{(4)}([a,b])</math> to  
Jeśli <math>\displaystyle f\in C^{(4)}([a,b])</math>, to  


<center><math>\displaystyle S(f)\,-\,\bar P_k(f)\,=\,-\frac{(b-a)^4}{2280\,k^4}
<center><math>\displaystyle S(f)\,-\,\bar P_k(f)\,=\,-\frac{(b-a)^5}{2280\,k^4}
       f^{(4)}(\xi_2).
       f^{(4)}(\xi_2).
</math></center>
</math></center>
Linia 382: Linia 395:
<center><math>\displaystyle \aligned \lefteqn{ S(f)\,-\,\bar T_k(f) \;=\; -\sum_{i=1}^k
<center><math>\displaystyle \aligned \lefteqn{ S(f)\,-\,\bar T_k(f) \;=\; -\sum_{i=1}^k
       \frac{(b-a)^3}{12 k^3}f^{(2)}(\alpha_i) } \\
       \frac{(b-a)^3}{12 k^3}f^{(2)}(\alpha_i) } \\
     && =\;-\frac{(b-a)^2}{12 k^2}\sum_{i=1}^k
     && =\;-\frac{(b-a)^3}{12 k^2}\frac 1k
      \frac{b-a}k f^{(2)}(\alpha_i) \,=\,
      \sum_{i=1}^k f^{(2)}(\alpha_i) \,=\,
     -\frac{(b-a)^2}{12 k^2} f^{(2)}(\xi_1),
     -\frac{(b-a)^3}{12 k^2} f^{(2)}(\xi_1),
\endaligned</math></center>
\endaligned</math></center>


Linia 391: Linia 404:
<center><math>\displaystyle \aligned \lefteqn{ S(f)\,-\,\bar P_k(f) \;=\; -\sum_{i=1}^k
<center><math>\displaystyle \aligned \lefteqn{ S(f)\,-\,\bar P_k(f) \;=\; -\sum_{i=1}^k
       \frac{(b-a)^5}{2280 k^5}f^{(4)}(\beta_i) } \\
       \frac{(b-a)^5}{2280 k^5}f^{(4)}(\beta_i) } \\
     && =\; -\frac{(b-a)^4}{2280 k^4}\sum_{i=1}^k  
     && =\; -\frac{(b-a)^5}{2280 k^4}\frac 1k
      \frac{b-a}k f^{(4)}(\beta_i) \,=\,
      \sum_{i=1}^k f^{(4)}(\beta_i) \,=\,
     -\frac{(b-a)^4}{2280 k^4} f^{(4)}(\xi_2).
     -\frac{(b-a)^5}{2280 k^4} f^{(4)}(\xi_2).
\endaligned</math></center>
\endaligned</math></center>


Linia 422: Linia 435:
a priori o <math>\displaystyle \|f''\|_{ C([a,b])}</math>, a przez to nie potrafimy  
a priori o <math>\displaystyle \|f''\|_{ C([a,b])}</math>, a przez to nie potrafimy  
oszacować liczby <math>\displaystyle n</math> węzłów, dla której osiągniemy  
oszacować liczby <math>\displaystyle n</math> węzłów, dla której osiągniemy  
pożądaną dokładność, zob. U. [[##kwas|Uzupelnic: kwas ]].  
pożądaną dokładność.  


Jeśli funkcja jest więcej niż dwa razy różniczkowalna  
Jeśli funkcja jest więcej niż dwa razy różniczkowalna,
to użycie złożonych kwadratur trapezów zdaje się tracić  
to użycie złożonych kwadratur trapezów zdaje się tracić  
sens. Wtedy istnieją przecież kwadratury, których błąd  
sens. Wtedy istnieją przecież kwadratury, których błąd  
Linia 435: Linia 448:
[[grafika:Euler.jpg|thumb|right||Leonhard Euler<br>  [[Biografia Euler|Zobacz biografię]]]]
[[grafika:Euler.jpg|thumb|right||Leonhard Euler<br>  [[Biografia Euler|Zobacz biografię]]]]


[[grafika:Maclaurin.jpg|thumb|right||Colin Maclaurin<br>  [[Biografia Maclaurin|Zobacz biografię]]]]
[[grafika:Maclaurin.jpg|thumb|right|| Maclaurin<br>  [[Biografia Maclaurin|Zobacz biografię]]]]


{{lemat|Formuła Eulera-Maclaurina|Formuła Eulera-Maclaurina|
{{lemat|Formuła Eulera-Maclaurina|Formuła Eulera-Maclaurina|
Linia 447: Linia 460:
\endaligned</math></center>
\endaligned</math></center>


gdzie <math>\displaystyle h=(b-a)//k</math>, <math>\displaystyle \xi_{m,k}\in[a,b]</math>, a <math>\displaystyle c_i</math> są pewnymi stałymi  
gdzie <math>\displaystyle h=(b-a)/k</math>, <math>\displaystyle \xi_{m,k}\in[a,b]</math>, a <math>\displaystyle c_i</math> są pewnymi stałymi  
liczbowymi. Mamy <math>\displaystyle c_1=-1//12</math>, <math>\displaystyle c_2=-1//720</math> i, ogólnie,   
liczbowymi. Mamy <math>\displaystyle c_1=-1/12</math>, <math>\displaystyle c_2=-1/720</math> i, ogólnie,   
<math>\displaystyle c_i=B_i//(2i)!</math>, gdzie <math>\displaystyle B_i</math> są tzw. liczbami Bernoulliego.  
<math>\displaystyle c_i=B_i/(2i)!</math>, gdzie <math>\displaystyle B_i</math> są tzw. liczbami Bernoulliego.  
<math>\displaystyle \quad\Box</math>
<math>\displaystyle \quad\Box</math>
}}
}}
Linia 464: Linia 477:
<math>\displaystyle 1\le i\le m</math>, oraz  
<math>\displaystyle 1\le i\le m</math>, oraz  
<math>\displaystyle c^{(0)}_{m+1,k}(f)=c_{m+1}(b-a)^{2m+2}f^{(2m+2)}(\xi_{m+1,k})</math>.  
<math>\displaystyle c^{(0)}_{m+1,k}(f)=c_{m+1}(b-a)^{2m+2}f^{(2m+2)}(\xi_{m+1,k})</math>.  
Zauważmy przy tym, że jeśli <math>\displaystyle f\in F^{2m+1}_M([a,b])</math> to współczynniki  
Zauważmy przy tym, że jeśli <math>\displaystyle f\in F^{2m+1}_M([a,b])</math>, to współczynniki  
<math>\displaystyle c^{(0)}_{m+1,k}(f)</math> są wspólnie ograniczone przez <math>\displaystyle c_{m+1}(b-a)^{2m+2}M</math>.  
<math>\displaystyle c^{(0)}_{m+1,k}(f)</math> są wspólnie ograniczone przez <math>\displaystyle c_{m+1}(b-a)^{2m+2}M</math>.  


Linia 483: Linia 496:
\endaligned</math></center>
\endaligned</math></center>


gdzie <math>\displaystyle c^{(1)}_{2,k}(f)=(1//12)c^{(0)}_{2,2k}(f)-(1//3)c^{(0)}_{2,k}(f)</math>  
gdzie <math>\displaystyle c^{(1)}_{2,k}(f)=(1/12)c^{(0)}_{2,2k}(f)-(1/3)c^{(0)}_{2,k}(f)</math>  
i jest wspólnie ograniczone dla <math>\displaystyle f\in F^3_M([a,b])</math>. Kwadratura <math>\displaystyle T^1_k</math>  
i jest wspólnie ograniczone dla <math>\displaystyle f\in F^3_M([a,b])</math>. Kwadratura <math>\displaystyle T^1_k</math>  
ma więc optymalny w <math>\displaystyle F^3_M([a,b])</math> rząd zbieżności <math>\displaystyle k^{-4}</math>.  
ma więc optymalny w <math>\displaystyle F^3_M([a,b])</math> rząd zbieżności <math>\displaystyle k^{-4}</math>.  
Linia 498: Linia 511:
kwadratury <math>\displaystyle \bar T^m_k</math> wynosi <math>\displaystyle k^{-(2m+2)}</math>. Rzeczywiście,  
kwadratury <math>\displaystyle \bar T^m_k</math> wynosi <math>\displaystyle k^{-(2m+2)}</math>. Rzeczywiście,  
sprawdziliśmy, że jest to prawdą dla <math>\displaystyle m=0,1</math>. Niech <math>\displaystyle m\ge 2</math>.  
sprawdziliśmy, że jest to prawdą dla <math>\displaystyle m=0,1</math>. Niech <math>\displaystyle m\ge 2</math>.  
Postępując indukcyjnie ze względu na <math>\displaystyle s=1,2,\ldots,m</math> mamy  
Postępując indukcyjnie dla <math>\displaystyle s=1,2,\ldots,m</math> mamy  


<center><math>\displaystyle \aligned \lefteqn{  S(f)\,-\,\bar T^s_k(f) \;=\;  
<center><math>\displaystyle \aligned \lefteqn{  S(f)\,-\,\bar T^s_k(f) \;=\;  
Linia 530: Linia 543:
Zauważmy jeszcze, że <math>\displaystyle \bar T^m_k</math> wykorzystuje  
Zauważmy jeszcze, że <math>\displaystyle \bar T^m_k</math> wykorzystuje  
<math>\displaystyle n=k2^m+1</math> wartości <math>\displaystyle f</math> w punktach równoodległych  
<math>\displaystyle n=k2^m+1</math> wartości <math>\displaystyle f</math> w punktach równoodległych  
na <math>\displaystyle [a,b]</math> co oznacza, że w terminach <math>\displaystyle n</math> rząd  
na <math>\displaystyle [a,b]</math>, co oznacza, że w terminach <math>\displaystyle n</math> rząd  
zbieżności wynosi też <math>\displaystyle n^{-(2m+2)}</math>, a więc jest  
zbieżności wynosi też <math>\displaystyle n^{-(2m+2)}</math>, a więc jest  
optymalny w klasie <math>\displaystyle F^{2m+1}_M([a,b])</math>.
optymalny w klasie <math>\displaystyle F^{2m+1}_M([a,b])</math>.


Kwadratury <math>\displaystyle \bar T^s_k</math> nazywane są <strong>kwadraturami  
Kwadratury <math>\displaystyle \bar T^s_k</math> nazywane są <strong>kwadraturami  
Romberga</strong>. Dla danej funkcji <math>\displaystyle f</math>, można je łatwo  
Romberga</strong>. Dla danej funkcji <math>\displaystyle f</math> można je łatwo  
konstruować budując następującą tablicę trójkątną:  
konstruować, budując następującą tablicę trójkątną:  


<center><math>\displaystyle  
<center><math>\displaystyle  
Linia 555: Linia 568:
zgodnie ze wzorem ([[##indtrap|Uzupelnic: indtrap ]]), a kolejne zgodnie  
zgodnie ze wzorem ([[##indtrap|Uzupelnic: indtrap ]]), a kolejne zgodnie  
z ([[##indRom|Uzupelnic: indRom ]]).  
z ([[##indRom|Uzupelnic: indRom ]]).  
==Kwadratury adaptacyjne==
W rozdziale [[##blad_kwa|Uzupelnic: blad_kwa ]] zauważyliśmy, że błąd kwadratury prostej zależy m.in. od wielkości pochodnej <math>\displaystyle f^{(r+1)}</math> funkcji podcałkowej. Odpowiednia kwadratura złożona wydaje się tego nie zauważać i zagęszcza podział przedziału całkowania jednostajnie, podczas gdy naturalnym i prostym wydaje się pomysł gęstszego podziału tam gdzie <math>\displaystyle |f^{(r+1)}(x)|</math> jest "duża" i rzadszego tam, gdzie <math>\displaystyle f^{(r+1)}(x)|</math> jest "mała". Nasz entuzjazm do tego pomysłu może jednak skutecznie ostudzić uwaga, że  algorytm na wejściu zwykle nie dostaje żadnej informacji o <math>\displaystyle f^{(r+1)}</math>. Okazuje się, że mimo wszystko nie stoimy na straconej pozycji. Algorytm obliczający całkę dysponuje na każdym pewną dodatkową informacją o <math>\displaystyle f</math> w postaci jej wartości w pewnych punktach; następny punkt (podział przedziału całkowania) może więc być wybrany na podstawie tych wartości.
Metody uzależniające swoje działanie od konkretnego zadania, które
rozwiązują (w naszym przypadku od funkcji podcałkowej) nazywamy ogólnie
<strong>metodami adaptacyjnymi</strong>.
Zauważmy, że poznana wcześniej metoda bisekcji przybliżonego znajdowania
zera funkcji jest typową metodą adaptacyjną. Zobaczymy teraz, na przykładzie
adaptacyjnej kwadratury Simpsona, jak można wykorzystać adaptację
w problemie numerycznego całkowania.
Niech, tak jak poprzednio, <math>\displaystyle \bar P_k</math> będzie złożoną kwadraturą Simpsona
z równym podziałem przedziału całkowania na <math>\displaystyle k</math> podprzedziałów, zastosowaną
na odcinku <math>\displaystyle [a,b]</math>.  W szczególności, <math>\displaystyle \bar P_1=P</math> jest prostą kwadraturą
Simpsona. Wtedy
<center><math>\displaystyle
  S(f)-\bar P_2(f)\,=\,-\frac{(b-a)^5}{2280\cdot 2^4}f^{(4)}(\xi_2),
</math></center>
oraz
<center><math>\displaystyle \aligned \bar P_1(f) - \bar P_2(f) &= (S(f)-\bar P_2(f))\,-\,(S(f)-\bar P_1(f)) \\
      &= \frac{(b-a)^5}{2280}\left(f^{(4)}(\xi_1)-\frac 1{16}f^{(4)}(\xi_2)\right),
\endaligned</math></center>
<math>\displaystyle \xi_1,\xi_2\in [a,b]</math>. Załóżmy teraz, że <math>\displaystyle f^{(4)}</math> ma stały znak na <math>\displaystyle [a,b]</math> oraz
przedział ten jest na tyle mały, że <math>\displaystyle f^{(4)}</math> jest "prawie stała". Wtedy
<math>\displaystyle f^{(4)}(\xi_1)-f^{(4)}(\xi_2)/16\approx 15\cdot f^{(4)}(\xi_2)/16</math>, a stąd
i z ([[##doubleq|Uzupelnic: doubleq ]]) otrzymujemy
<center><math>\displaystyle
  \bar P_1(f) -\bar P_2(f) \approx  -15\cdot( S(f) - \bar P_2(f) ).
</math></center>
Ta przybliżona równość jest podstawą adaptacyjnej kwadratury Simpsona, może
bowiem posłużyć do oszacowania błędu na podprzedziałach.
Załóżmy teraz, że chcemy obliczyć wartość całki z dokładnością <math>\displaystyle \varepsilon>0</math>.
Obliczamy <math>\displaystyle \bar P_1(f)</math>, <math>\displaystyle \bar P_2(f)</math> i sprawdzamy, czy
<math>\displaystyle |\bar P_1(f)-\bar P_2(f)|/15\le\varepsilon</math>. Jeśli tak, to <math>\displaystyle \bar P_2(f)</math> jest ostateczną aproksymacją całki na <math>\displaystyle [a,b]</math>, a jeśli nie, to dzielimy przedział na dwa podprzedziały <math>\displaystyle [a,(a+b)/2]</math> i <math>\displaystyle [(a+b)/2,b]</math> i powtarzamy procedurę dla obu podprzedziałów z tolerancją błędu <math>\displaystyle \varepsilon/2</math>.
Cały proces można zgrabnie zapisać za pomocą funkcji rekurencyjnej.
{{algorytm|Adaptacyjna kwadratura Simpsona|Adaptacyjna kwadratura Simpsona|
<pre>adaptiveSimpson(a,b,f,e)
{
P1 = Simpson(a,b,f);
P2 = Simpson(a,(a+b)/2,f) + Simpson((a+b)/2,b,f);
if (\PIPEREAD P1-P2\PIPEREAD  < 15*e)
return( P2 );
else
return( adaptiveSimpson(a,(a+b)/2,f,e/2) + adaptiveSimpson((a+b)/2,b,f,e/2) );
}
</pre>}}
Zauważmy, że funkcja ta zakończy działanie. Rzeczywiście, na podprzedziale
długości <math>\displaystyle h</math> chcemy obliczać całkę z dokładnością <math>\displaystyle \varepsilon h/(b-a)</math>, a ponieważ różnica <math>\displaystyle |P1-P2|</math> jest rzędu <math>\displaystyle h^5</math>, kryterium kończenia procedury będzie spełnione dla każdego <math>\displaystyle h</math> dostatecznie małego. Podziały nie mogą więc następować w nieskończoność.
Trochę gorzej sprawa przedstawia się z błędem. Algorytm bazuje bowiem na
przybliżonej równości ([[##keyapp|Uzupelnic: keyapp ]]). Jeśli po zakończeniu algorytmu mamy podział na podprzedziały <math>\displaystyle a=x_0<x_1<\cdots <x_n=b</math> oraz ([[##keyapp|Uzupelnic: keyapp ]]) jest spełniona na każdym podprzedziale, to błąd można w przybliżeniu oszacować przez
<center><math>\displaystyle \sum_{j=1}^n\varepsilon\cdot\frac{x_j-x_{j-1}}{b-a}\,=\,\varepsilon.
</math></center>
Z drugiej strony, możemy czasem trafić wyjątkowo "złośliwą" funkcję. Np. jeśli <math>\displaystyle f(a+j(b-a)/4)=0</math> dla <math>\displaystyle 0\le j\le 4</math>, to już na początku <math>\displaystyle P1-P2=0</math> i funkcja zwróci zero mimo, że rzeczywista wartość całki może znacznie różnić się od zera. Istnieją pewne techniki, które przynajmniej częściowo zapobiegają tego typu zjawiskom, ale nie będziemy ich tutaj omawiać.
==Uwarunkowanie==


==Biblioteki==
==Biblioteki==
Linia 620: Linia 703:
zerze:
zerze:
<center><math>\displaystyle  
<center><math>\displaystyle  
f(x) = \begincases \frac{1}{x}, \qquad x\neq 0,\\
f(x) = \left\{ \beginmatrix \frac{1}{x} & x\neq 0,\\
10^6, \qquad x=0.
10^6 & x=0.\endmatrix \right.
\endcases
</math></center>
</math></center>


Oczywiście, <math>\displaystyle \int_{-1}^1 f(x)\, dx = 0</math>, tymczasem definiując
Oczywiście <math>\displaystyle \int_{-1}^1 f(x)\, dx = 0</math>, tymczasem definiując
  <div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre>function y = osobliwa(x)
  <div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre>function y = osobliwa(x)
if (x != 0.0)
if (x != 0.0)
Linia 656: Linia 738:


Właściwie jedynym klasycznym pakietem, jaki mamy do dyspozycji jest
Właściwie jedynym klasycznym pakietem, jaki mamy do dyspozycji jest
ponaddwudziestoletni QUADPACK .
ponaddwudziestoletni [http://www.netlib.org/quadpack  QUADPACK].
Jest to zestaw kilkunastu procedur fortranowskich, służących obliczaniu typowych całek
Jest to zestaw kilkunastu procedur fortranowskich, służących obliczaniu typowych całek jednowymiarowych:
jednowymiarowych, w tym kilka ogólnego stosowania:


{| border=1
{| border=1
Linia 665: Linia 746:
| Typ całki  ||  Procedura QUADPACKa
| Typ całki  ||  Procedura QUADPACKa
|-
|-
|  <math>\displaystyle \int_a^b f(x)</math>  ||  DQNG, DQAG, DQAGS, DQAGP  
|  <math>\displaystyle \int_a^b f(x)</math>  ||  <code style="color: #903">DQNG</code>, <code style="color: #903">DQAG</code>, <code style="color: #903">DQAGS</code>, <code style="color: #903">DQAGP</code>
|-
|-
| <math>\displaystyle \int_{-\infty}^{\infty} f(x)</math>  ||  DQAGI  
| <math>\displaystyle \int_{-\infty}^{\infty} f(x)</math>  ||  <code style="color: #903">DQAGI</code>
|-
|-
| <math>\displaystyle \int_a^b f(x)\cos(\omega x)</math>  ||  DQAWO  
| <math>\displaystyle \int_a^b f(x)\cos(\omega x)</math>  ||  <code style="color: #903">DQAWO</code>
|-
|-
| <math>\displaystyle \int_a^b \dfrac{f(x)}{x-c}</math>  ||  DQAWC  
| <math>\displaystyle \int_a^b \dfrac{f(x)}{x-c}</math>  ||  <code style="color: #903">DQAWC</code>
|-
|-
|  
|  
Linia 679: Linia 760:
oraz spora liczba podstawowych kwadratur, na których oparto te ogólne. Nazwy
oraz spora liczba podstawowych kwadratur, na których oparto te ogólne. Nazwy
procedur rozszyfrowuje się podobnie jak nazwy procedur LAPACKa, zatem
procedur rozszyfrowuje się podobnie jak nazwy procedur LAPACKa, zatem
* przedrostek <code style="color: #903">D</code> w nazwie każdej  procedury wymienionej w tabeli (np. <code style="color: #903">DQAGI</code>) oznacza, że będzie działać na liczbach typu <code>double</code> (całkując funkcję <math>\displaystyle f</math> zwracającą wartości tego samego typu). Gdybyśmy chcieli użyć pojedynczej precyzji, użylibyśmy nazwy procedury <strong>bez przedrostka</strong>.  
* przedrostek <code style="color: #903">D</code> w nazwie każdej  procedury wymienionej w tabeli (np. <code style="color: #903">DQAGI</code>) oznacza, że będzie działać na liczbach typu <code>double</code> (całkując funkcję <math>\displaystyle f</math> zwracającą wartości tego samego typu). Gdybyśmy chcieli użyć pojedynczej precyzji, użylibyśmy nazwy procedury ''bez przedrostka''.  
* Kolejna litera, <code style="color: #903">Q</code>, oczywiście oznacza kwadraturę (''Quadrature'').  
* Kolejna litera, <code style="color: #903">Q</code>, oczywiście oznacza kwadraturę (''Quadrature'').  
* Trzecia litera ---  <code style="color: #903">A</code> lub  <code style="color: #903">N</code> oznacza, odpowiednio, kwadraturę adaptacyjną lub nieadaptacyjną. Jak wiadomo, w praktyce lepiej sprawdzają się kwadratury adaptacyjne, potrafiące w jakiejś mierze dostosować się do przebiegu funkcji podcałkowej. Kwadratury nieadaptacyjne nie mają tej własności, natomiast są tańsze, warto więc je stosować w szczególnych przypadkach, gdy wiemy ''a priori'', że adaptacja niewiele pomoże: np. do wolno zmiennych funkcji.
* Trzecia litera ---  <code style="color: #903">A</code> lub  <code style="color: #903">N</code> --- oznacza, odpowiednio, kwadraturę adaptacyjną lub nieadaptacyjną. Jak wiadomo, w praktyce lepiej sprawdzają się kwadratury adaptacyjne, potrafiące w jakiejś mierze dostosować się do przebiegu funkcji podcałkowej. Kwadratury nieadaptacyjne nie mają tej własności. Mogą natomiast, dla pewnych funkcji podcałkowych, okazać się tańsze, warto więc je stosować, gdy wiemy ''a priori'', że adaptacja niewiele pomoże: np. do wolnozmiennych funkcji.
* Pozostałe litery precyzują typ liczonej całki i zakres ingerencji użytkownika; <code style="color: #903">G</code> --- "zwykła" całka, bez wagi, <code style="color: #903">W</code> --- całka z wagą, <code style="color: #903">O</code> --- oscylacyjną, <code style="color: #903">C</code> --- wartość główna całki (tzw. całka Cauchy'ego), <code style="color: #903">I</code> --- przedział nieskończony, <code style="color: #903">S</code> --- możliwe osobliwości, <code style="color: #903">P</code> --- użytkownik poda listę punktów, gdzie są osobliwości.
* Pozostałe litery precyzują typ liczonej całki i zakres ingerencji użytkownika; <code style="color: #903">G</code> --- "zwykła" całka, bez wagi, <code style="color: #903">W</code> --- całka z wagą, <code style="color: #903">O</code> --- dla funkcji silnie oscylujących, <code style="color: #903">C</code> --- wartość główna całki (tzw. całka Cauchy'ego), <code style="color: #903">I</code> --- przedział nieskończony, <code style="color: #903">S</code> --- możliwe osobliwości, <code style="color: #903">P</code> --- użytkownik poda listę punktów, gdzie są osobliwości.
   
   
===GSL===
===GSL===
Linia 746: Linia 827:
Miłym rozszerzeniem funkcjonalności jest możliwość
Miłym rozszerzeniem funkcjonalności jest możliwość
przekazywania parametrów do wnętrza funkcji podcałkowej.  
przekazywania parametrów do wnętrza funkcji podcałkowej.  
=Różniczkowanie=
=Różniczkowanie=


Linia 882: Linia 964:
<blockquote  style="background-color: #fefeee; padding:1em;  margin-left,margin-right:2em;  margin-top,margin-bottom: 1em;">   
<blockquote  style="background-color: #fefeee; padding:1em;  margin-left,margin-right:2em;  margin-top,margin-bottom: 1em;">   
Jeśli chcesz używać różnicy w przód, powinieneś wziąć <math>\displaystyle h</math> równe co najmniej <math>\displaystyle \sqrt{\epsilon_{ \mbox{mach} }}</math>.
Jeśli chcesz używać różnicy w przód, powinieneś wziąć <math>\displaystyle h</math> równe co najmniej <math>\displaystyle \sqrt{\epsilon_{ \mbox{mach} }}</math>.
</blockquote>
</blockquote>  
 
==Literatura==
 
W celu dogłębnego zapoznania się z omawianym na wykładzie materiałem, przeczytaj <b>rozdział 7.2 -- 7.6</b> w
* D. Kincaid, W. Cheney <cite>Analiza numeryczna</cite>, Wydawnictwa Naukowo-Techniczne, Warszawa 2006, ISBN 83-204-3078-X.

Wersja z 21:59, 29 wrz 2006


Całkowanie

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

Zajmiemy się teraz zadaniem całkowania numerycznego. Polega ono na obliczeniu (a raczej przybliżeniu) całki oznaczonej

S(f)=abf(x)dx,

gdzie <a<b<+, a f należy do pewnej klasy F funkcji rzeczywistych określonych i całkowalnych w sensie Riemanna na całym przedziale [a,b].

Każdy, kto przeszedł przez kurs całkowania wie, że obliczanie całek rozumiane jako znalezienie elementarnego wzoru na funkcję pierwotną może być trudne, bardzo trudne, a nawet niewykonalne. Tymczasem zadanie przybliżonego wyznaczenia wartości całki daje się w dużej mierze zautomatyzować z całkiem dobrym skutkiem.

Obliczanie całek jest wymagane w bardzo wielu zadaniach inżynierskich i naukowych. Całki z funkcji (bardzo) wielu zmiennych (które na swój sposób są szczególnie trudne do obliczenia) znajdują ważne zastosowania w bankowości i finansach.

Będziemy zakładać, że mamy możliwość obliczania wartości funkcji f, a w niektórych przypadkach również jej pochodnych, o ile istnieją. Dokładna całka S(f) będzie więc w ogólności przybliżana wartością A(f), która zależy tylko od wartości f i ewentualnie jej pochodnych w skończonej liczbie punktów.

Kwadratury

Kwadraturami nazywamy funkcjonały liniowe Parser nie mógł rozpoznać (nieznana funkcja „\toR”): {\displaystyle \displaystyle Q:F\toR} postaci

Q(f)=i=0naif(xi),

albo ogólniej

Q(f)=i=0kj=0ni1ai,jf(j)(xi),

gdzie xi są punktami z [a,b], a ai (albo ai,j) są pewnymi współczynnikami rzeczywistymi. Zauważmy, że obliczenia kwadratur są dopuszczalne w naszym modelu obliczeniowym, mogą więc służyć jako sposób przybliżania całki.

Jeden z możliwych sposobów konstrukcji kwadratur jest następujący. Najpierw wybieramy węzły xj (pojedyncze lub wielokrotne), budujemy wielomian interpolacyjny odpowiadający tym węzłom, a następnie całkujemy go. Ponieważ postać wielomianu interpolacyjnego zależy tylko od danej informacji o f, otrzymana w ten sposób wartość też będzie zależeć tylko od tej informacji, a w konsekwencji funkcjonał wynikowy będzie takiej postaci, jak wyżej. Są to tzw. kwadratury interpolacyjne.

Definicja

Kwadraturę QI opartą na węzłach o łącznej krotności n+1 nazywamy interpolacyjną, jeśli

QI(f)=abwf(x)dx,

gdzie wf jest wielomianem interpolacyjnym funkcji f stopnia co najwyżej n, opartym na tych węzłach.

Współczynniki kwadratur interpolacyjnych można łatwo wyliczyć. Rozpatrzmy dla uproszczenia przypadek, gdy węzły są jednokrotne. Zapisując wielomian interpolacyjny w postaci jego rozwinięcia w bazie kanonicznej Lagrange'a li (zob. (Uzupelnic: Lagrbaza )), otrzymujemy

QI(f)=abi=0nf(xi)li(x)dx=i=0nf(xi)abli(x)dx,

a stąd i z postaci li,

ai=ab(xx0)(xxi1)(xxi+1)(xxn)(xix0)(xixi1)(xixi+1)(xixn)dx,

0in.

Podamy teraz kilka przykładów.

Kwadratura prostokątów jest oparta na jednym węźle x0=(a+b)/2,

Q0I(f)=(ba)f(a+b2).
Kwadratura prostokątów

Kwadratura trapezów jest oparta na jednokrotnych węzłach x0=a, x1=b i jest równa polu odpowiedniego trapezu,

Q1I(f)=T(f)=ba2(f(a)+f(b)).
Kwadratura trapezów

Kwadratura parabol (Simpsona) jest oparta na jednokrotnych węzłach x0=a, x1=b, x2=(a+b)/2, i jest równa polu pod parabolą interpolującą f w tych węzłach,

Q2I(f)=P(f)=ba6(f(a)+4f(a+b2)+f(b)).

Zauważmy, że kwadratury trapezów i parabol są oparte na węzłach jednokrotnych i równoodległych, przy czym x0=a i xn=b. Ogólnie, kwadratury interpolacyjne oparte na węzłach równoodległych xi=a+(ba)i/n, 0in, nazywamy kwadraturami Newtona--Cotesa.

Błąd kwadratur interpolacyjnych

Zajmiemy się teraz błędem kwadratur interpolacyjnych. Przypomnijmy, że FMr([a,b]) oznacza klasę funkcji (r+1) razy różniczkowalnych w sposób ciągły i takich, że |f(r+1)(x)|M, x.

Twierdzenie O błędzie kwadratur interpolacyjnych

Niech QI będzie kwadraturą interpolacyjną opartą na (jednokrotnych lub wielokrotnych) węzłach xi, 0in. Jeśli fFMn([a,b]), to

|S(f)QI(f)|M(n+1)!(ba)n+2.

W klasie FMn([a,b]) maksymalny błąd kwadratury QI wynosi

supfFMn([a,b])|S(f)QI(f)|=M(n+1)!ab|(xx0)(xx1)(xxn)|dx.

Dowód

Korzystając ze znanego nam już wzoru na błąd interpolacji wielomianowej z Lematu Uzupelnic: leblint , mamy

S(f)QI(f)=ab(xx0)(xx1)(xxn)f(x0,x1,,xn,x)dx.

Stąd, jeśli fFMn([a,b]), to

|S(f)QI(f)|ab(ba)n+1M(n+1)!dx=(ba)n+2M(n+1)!.

Ograniczenie górne w dokładnej formule na błąd w klasie FMn([a,b]) wynika bezpośrednio z oszacowania (Uzupelnic: blkwad ). Aby pokazać ograniczenie dolne zauważmy, że dla funkcji g takiej, że g(n+1) przyjmuje na przedziałach (a,x0), (x0,x1), , (xn,b) naprzemiennie wartości M i M mamy

|S(g)QI(g)|=M(n+1)!ab|(xx0)(xx1)(xxn)|dx.

Co prawda, g nie jest w FMn([a,b]), ale może być dla dowolnego ϵ>0 przybliżana funkcjami fϵFMn([a,b]) w ten sposób, że całka

ab|(xx0)(xxn)(fg)(n+1)(x)|dxϵ(n+1)!.

Zapisując fϵ=g+(fϵg) mamy

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \displaystyle \aligned |S(f_\epsilon)\,-\,Q^I(f_\epsilon)| &\le & |S(g)\,-\,Q^I(g)|\,+\, |S(f_\epsilon-g)-Q^I(f_\epsilon-g)| \\ &\le & \frac M{(n+1)!}\int_a^b |(x-x_0)\cdots(x-x_n)| \,dx\,+\,\epsilon, \endaligned}

co wobec dowolności ϵ daje dowód twierdzenia.

W szczególnych przypadkach kwadratur trapezów T i parabol P możemy otrzymać innego rodzaju formuły na błąd.

Twierdzenie O postaci błędu kwadratury trapezów i Simpsona

Jeśli fC(2)([a,b]), to dla kwadratury trapezów mamy

S(f)T(f)=(ba)312f(2)(ξ1).

Jeśli fC(4)([a,b]), to dla kwadratury parabol mamy

S(f)P(f)=(ba)52280f(4)(ξ2).

(ξ1,ξ2[a,b]).

Dowód

Najpierw udowodnimy część dotyczącą kwadratury trapezów. Ze wzoru na błąd kwadratury,

S(f)T(f)=ab(xa)(xb)f(a,b,x)dx.

Ponieważ funkcja xf(a,b,x) jest ciągła, a wielomian (xa)(xb) przyjmuje jedynie wartości nieujemne, można zastosować twierdzenie o wartości średniej dla całki, aby otrzymać

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \displaystyle \aligned S(f)\,-\,T(f) &= f(a,b,c)\int_a^b (x-a)(x-b)\,dx \\ &= -\frac{f^{(2)}(\xi_1)}{2!}\frac{(b-a)^3}6, \endaligned}

dla pewnych c,ξ1[a,b].

Teraz zajmiemy się kwadraturą parabol. Niech wf,2Π2 i wf,3Π3 będą wielomianami interpolacyjnymi funkcji f odpowiednio dla węzłów a,b,(a+b)//2 oraz a,b,(a+b)//2,(a+b)//2. Wtedy

wf,3(x)=wf,2(x)+f(a,b,a+b2,a+b2)(xa)(xa+b2)(xb).

Wobec

ab(xa)(a+b2)(xb)dx=0

mamy

P(f)=abwf,2(x)dx=abwf,3(x)dx.

Stąd i ze wzoru na błąd interpolacji Hermite'a otrzymujemy

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \displaystyle \aligned \lefteqn{ S(f)\,-\,P(f)\;=\;\int_a^b (f-w_{f,3})(x)\,dx } \\ && =\; \int_a^b (x-a)\Big(x-\frac{a+b}2\Big)^2(x-b) f\Big(a,b,\frac{a+b}2,\frac{a+b}2,x\Big)\,dx. \endaligned}

Ponieważ wielomian (xa)(x(a+b)/2)2(xb) jest niedodatni na [a,b], możemy znów zastosować twierdzenie o wartości średniej. Mamy

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \displaystyle \aligned S(f)\,-\,P(f) &= f\Big(a,b,\frac{a+b}2,\frac{a+b}2,c\Big) \\ && \qquad\qquad\qquad \int_a^b (x-a)\Big(x-\frac{a+b}2\Big)^2(x-b)\,dx \\ &= -\frac{f^{(4)}(\xi_2)}{4!}\frac{(b-a)^5}{120}, \endaligned}

co kończy dowód.

Kwadratury złożone

Chcielibyśmy, aby błąd kwadratur malał do zera, gdy liczba węzłów rośnie do nieskończoności. Można to osiągnąć stosując np. kwadratury złożone. Są to kwadratury, które powstają przez scałkowanie funkcji kawałkami wielomianowej interpolującej f.

Riemann
Zobacz biografię

Prostym przykładem kwadratury złożonej jest suma Riemanna,

Q¯(f)=i=0n(ti+1ti)f(xi),

gdzie a=t0<t1<<tn+1=b oraz xi[ti,ti+1]. Jeśli średnica podziału, max0in(titi1), maleje do zera, to limnQ¯(f)=S(f).

Będziemy rozpatrywać kwadratury złożone postaci

Q¯(f)=abw¯f(x)dx,

gdzie w¯f jest kawałkami wielomianem. Dokładniej, dla danego n kładziemy ti=a+(ba)i/k, 0ik, a następnie dla każdego i wybieramy dowolne węzły xi,j[ti1,ti], 0jr. Wtedy w¯f jest na każdym przedziale wielomianem interpolacyjnym funkcji f stopnia co najwyżej r opartym na węzłach xi,j. Kwadratura Q¯ korzysta z węzłów o łącznej krotności nk(r+1).

Twierdzenie O błędzie kwadratur złożonych

Błąd kwadratury złożonej Q¯(f) w klasie FMr([a,b]) jest ograniczony przez

supfFMr([a,b])|S(f)Q¯(f)|(ba)r+2kr+1M(r+1)!C(1n)r+1,

gdzie

C=M(r+1)r+1(ba)r+2(r+1)!.

Dowód

Twierdzenie to jest bezpośrednim wnioskiem z Twierdzenia Uzupelnic: twblkw . Mamy bowiem

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \displaystyle \aligned |S(f)-\bar Q(f)| &\le & \sum_{i=1}^k \int_{t_{i-1}}^{t_i} |f(x)-\bar w_f(x)|\,dx \\ &\le & \sum_{i=1}^k \Big(\frac{b-a}{k}\Big)^{r+2} \frac M{(r+1)!} \,=\, \frac{(b-a)^{r+2}}{k^{r+1}}\frac M{(r+1)!}, \endaligned}

co kończy dowód.

W klasie FMr([a,b]), błąd kwadratur złożonych jest rzędu n(r+1). Można pokazać, że błąd każdej innej metody całkowania korzystającej jedynie z wartości funkcji w n punktach nie może w klasie FMr([a,b]) maleć szybciej niż n(r+1). Podane kwadratury złożone mają więc optymalny rząd zbieżności.

Zajmiemy się teraz błędem szczególnych kwadratur złożonych, mianowicie złożonych kwadratur trapezów T¯k i parabol P¯k. Powstają one przez zastosowanie na każdym przedziale [ti1,ti] odpowiednio kwadratur trapezów T i parabol P.

Złożona kwadratura trapezów

Jak łatwo się przekonać,

T¯k(f)=bak(f(a)+f(b)2+j=1k1f(jk)),

oraz

P¯k(f)=ba3k(f(a)+f(b)2+j=1k1f(jk)+2j=1kf(2j12k)).

Twierdzenie O postaci błędu złożonych kwadratur trapezów i Simpsona

Jeśli fC(2)([a,b]), to

S(f)T¯k(f)=(ba)312k2f(2)(ξ1).

Jeśli fC(4)([a,b]), to

S(f)P¯k(f)=(ba)52280k4f(4)(ξ2).

Dowód

Dla kwadratury trapezów mamy

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \displaystyle \aligned \lefteqn{ S(f)\,-\,\bar T_k(f) \;=\; -\sum_{i=1}^k \frac{(b-a)^3}{12 k^3}f^{(2)}(\alpha_i) } \\ && =\;-\frac{(b-a)^3}{12 k^2}\frac 1k \sum_{i=1}^k f^{(2)}(\alpha_i) \,=\, -\frac{(b-a)^3}{12 k^2} f^{(2)}(\xi_1), \endaligned}

a dla kwadratury parabol podobnie

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \displaystyle \aligned \lefteqn{ S(f)\,-\,\bar P_k(f) \;=\; -\sum_{i=1}^k \frac{(b-a)^5}{2280 k^5}f^{(4)}(\beta_i) } \\ && =\; -\frac{(b-a)^5}{2280 k^4}\frac 1k \sum_{i=1}^k f^{(4)}(\beta_i) \,=\, -\frac{(b-a)^5}{2280 k^4} f^{(4)}(\xi_2). \endaligned}

Kwadratura parabol ma więc optymalny rząd zbieżności nie tylko w klasie FM2([a,b]), ale też w FM3([a,b]).

Przyspieszanie zbieżności kwadratur

W praktyce często stosuje się obliczanie kwadratur poprzez zagęszczanie podziału przedziału [a,b]. Na przykład, dla złożonej kwadratury trapezów zachodzi następujący wygodny wzór rekurencyjny:

T¯2k=12(T¯k(f)+baki=1kf(2i12k)).

Pozwala on obliczyć T¯2k(f) na podstawie T¯k(f) poprzez "doliczenie" wartości funkcji w punktach "gęstszej" siatki. W ten sposób możemy obserwować zachowanie się kolejnych przybliżeń T¯2s(f) (s0) całki S(f). Jest to szczególnie istotne wtedy, gdy nie mamy żadnej informacji a priori o fC([a,b]), a przez to nie potrafimy oszacować liczby n węzłów, dla której osiągniemy pożądaną dokładność.

Jeśli funkcja jest więcej niż dwa razy różniczkowalna, to użycie złożonych kwadratur trapezów zdaje się tracić sens. Wtedy istnieją przecież kwadratury, których błąd maleje do zera szybciej niż n2. Okazuje się jednak, że kwadratury T¯k mogą być podstawą dla prostej rekurencyjnej konstrukcji innych kwadratur posiadających już optymalną zbieżność. Konstrukcja ta bazuje na następującym ważnym lemacie.

Leonhard Euler
Zobacz biografię
Maclaurin
Zobacz biografię

Lemat Formuła Eulera-Maclaurina

Dla funkcji fC(2m+2)([a,b]), błąd złożonej kwadratury trapezów T¯k wyraża się wzorem

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \displaystyle \aligned S(f)\,-\,\bar T_k(f) &= \sum_{i=1}^{m} c_ih^{2i} \Big(f^{(2i-1)}(b)-f^{(2i-1)}(a)\Big) \\ &&\qquad\qquad\qquad \,+\,c_{m+1}h^{2m+2}(b-a)f^{(2m+2)}(\xi_{m,k}), \endaligned}

gdzie h=(ba)/k, ξm,k[a,b], a ci są pewnymi stałymi liczbowymi. Mamy c1=1/12, c2=1/720 i, ogólnie, ci=Bi/(2i)!, gdzie Bi są tzw. liczbami Bernoulliego.

Dowód tego lematu pominiemy.

Formułę Eulera-Maclaurina można przepisać w postaci

S(f)T¯k(f)=i=1mci(0)(f)k2i+cm+1,k(0)(f)k(2m+2),

gdzie ci(0)(f)=ci(ba)2i(f(2i1)(b)f(2i1)(a)), 1im, oraz cm+1,k(0)(f)=cm+1(ba)2m+2f(2m+2)(ξm+1,k). Zauważmy przy tym, że jeśli fFM2m+1([a,b]), to współczynniki cm+1,k(0)(f) są wspólnie ograniczone przez cm+1(ba)2m+2M.

Definiując teraz kwadraturę

T¯k1(f)=4T¯2k(f)T¯k(f)3,

dla fC(4)([a,b]) mamy

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \displaystyle \aligned S(f)\,-\,\bar T^1_k(f) &= \frac{4\,(S(f)-\bar T_{2k}(f)- (S(f)-\bar T_k(f))}{3} \\ &= \frac 43\left(\frac{c^{(0)}_1(f)}{4k^2}+ \frac{c^{(0)}_{2,2k}(f)}{4^2k^4}\right)\,-\, \frac 13\left(\frac{c^{(0)}_1(f)}{k^2}+ \frac{c^{(0)}_{2,k}(f)}{k^4}\right) \\ &= \frac{c^{(1)}_{2,k}(f)}{k^4}, \endaligned}

gdzie c2,k(1)(f)=(1/12)c2,2k(0)(f)(1/3)c2,k(0)(f) i jest wspólnie ograniczone dla fFM3([a,b]). Kwadratura Tk1 ma więc optymalny w FM3([a,b]) rząd zbieżności k4. Proces ten można kontynuować dalej tworząc kolejne kwadratury o coraz to wyższym rzędzie zbieżności. Dokładniej, połóżmy T¯k0(f)=T¯k(f) oraz, dla s1,

T¯ks(f)=4sT¯2ks1(f)T¯ks1(f)4s1.

Wtedy, dla fFM2m+1([a,b]), rząd zbieżności kwadratury T¯km wynosi k(2m+2). Rzeczywiście, sprawdziliśmy, że jest to prawdą dla m=0,1. Niech m2. Postępując indukcyjnie dla s=1,2,,m mamy

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \displaystyle \aligned \lefteqn{ S(f)\,-\,\bar T^s_k(f) \;=\; \frac{ 4^s(S(f)-\bar T^{s-1}_{2k}(f))- (S(f)-\bar T^{s-1}_k(f)) }{ 4^s\,-\,1 } } \\ &&=\; \left( 4^s\,\left(\sum_{i=s}^{m}c_i^{(s-1)}(f)(2k)^{-2i}+ c_{m+1,2k}^{(s-1)}(f)(2k)^{-(2m+2)}\right)\right. \\ && \left.\quad \,-\,\left( \sum_{i=s}^mc_i^{(s-1)}(f)k^{-2i}+ c_{m+1,k}^{(s-1)}(f)k^{-(2m+2)} \right) \right)\,\frac{1}{4^s\,-\,1}\\ &&=\; \sum_{i=s+1}^m c_i^{(s)}(f)k^{-2i}\,+\, c_{m+1,k}^{(s)}(f)k^{-(2m+2)}, \endaligned}

ponieważ współczynniki przy k2s redukują się. ci(s)(f) są tutaj pewnymi nowymi stałymi, a cm+1,k(s)(f) może być w klasie FM2m+1([a,b]) ograniczona przez stałą niezależną od f. Ostatecznie, dla s=m mamy więc

S(f)T¯km(f)=cm+1,k(m)(f)k(2m+2)

i w klasie FM2m+1([a,b])

|S(f)T¯km(f)|cmk(2m+2)

dla pewnej stałej cm niezależnej od f.

Zauważmy jeszcze, że T¯km wykorzystuje n=k2m+1 wartości f w punktach równoodległych na [a,b], co oznacza, że w terminach n rząd zbieżności wynosi też n(2m+2), a więc jest optymalny w klasie FM2m+1([a,b]).

Kwadratury T¯ks nazywane są kwadraturami Romberga. Dla danej funkcji f można je łatwo konstruować, budując następującą tablicę trójkątną:

T¯10(f)T¯20(f)T¯11(f)T¯40(f)T¯21(f)T¯12(f)T¯80(f)T¯41(f)T¯22(f)T¯13(f)T¯2s0(f)T¯2s11(f)T¯2s22(f)T¯2s33(f)T¯1s(f),

w której pierwsza kolumna jest tworzona indukcyjnie zgodnie ze wzorem (Uzupelnic: indtrap ), a kolejne zgodnie z (Uzupelnic: indRom ).

Kwadratury adaptacyjne

W rozdziale Uzupelnic: blad_kwa zauważyliśmy, że błąd kwadratury prostej zależy m.in. od wielkości pochodnej f(r+1) funkcji podcałkowej. Odpowiednia kwadratura złożona wydaje się tego nie zauważać i zagęszcza podział przedziału całkowania jednostajnie, podczas gdy naturalnym i prostym wydaje się pomysł gęstszego podziału tam gdzie |f(r+1)(x)| jest "duża" i rzadszego tam, gdzie f(r+1)(x)| jest "mała". Nasz entuzjazm do tego pomysłu może jednak skutecznie ostudzić uwaga, że algorytm na wejściu zwykle nie dostaje żadnej informacji o f(r+1). Okazuje się, że mimo wszystko nie stoimy na straconej pozycji. Algorytm obliczający całkę dysponuje na każdym pewną dodatkową informacją o f w postaci jej wartości w pewnych punktach; następny punkt (podział przedziału całkowania) może więc być wybrany na podstawie tych wartości.

Metody uzależniające swoje działanie od konkretnego zadania, które rozwiązują (w naszym przypadku od funkcji podcałkowej) nazywamy ogólnie metodami adaptacyjnymi.

Zauważmy, że poznana wcześniej metoda bisekcji przybliżonego znajdowania zera funkcji jest typową metodą adaptacyjną. Zobaczymy teraz, na przykładzie adaptacyjnej kwadratury Simpsona, jak można wykorzystać adaptację w problemie numerycznego całkowania.

Niech, tak jak poprzednio, P¯k będzie złożoną kwadraturą Simpsona z równym podziałem przedziału całkowania na k podprzedziałów, zastosowaną na odcinku [a,b]. W szczególności, P¯1=P jest prostą kwadraturą Simpsona. Wtedy

S(f)P¯2(f)=(ba)5228024f(4)(ξ2),

oraz

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \displaystyle \aligned \bar P_1(f) - \bar P_2(f) &= (S(f)-\bar P_2(f))\,-\,(S(f)-\bar P_1(f)) \\ &= \frac{(b-a)^5}{2280}\left(f^{(4)}(\xi_1)-\frac 1{16}f^{(4)}(\xi_2)\right), \endaligned}

ξ1,ξ2[a,b]. Załóżmy teraz, że f(4) ma stały znak na [a,b] oraz przedział ten jest na tyle mały, że f(4) jest "prawie stała". Wtedy f(4)(ξ1)f(4)(ξ2)/1615f(4)(ξ2)/16, a stąd i z (Uzupelnic: doubleq ) otrzymujemy

P¯1(f)P¯2(f)15(S(f)P¯2(f)).

Ta przybliżona równość jest podstawą adaptacyjnej kwadratury Simpsona, może bowiem posłużyć do oszacowania błędu na podprzedziałach.

Załóżmy teraz, że chcemy obliczyć wartość całki z dokładnością ε>0. Obliczamy P¯1(f), P¯2(f) i sprawdzamy, czy |P¯1(f)P¯2(f)|/15ε. Jeśli tak, to P¯2(f) jest ostateczną aproksymacją całki na [a,b], a jeśli nie, to dzielimy przedział na dwa podprzedziały [a,(a+b)/2] i [(a+b)/2,b] i powtarzamy procedurę dla obu podprzedziałów z tolerancją błędu ε/2. Cały proces można zgrabnie zapisać za pomocą funkcji rekurencyjnej.

Algorytm Adaptacyjna kwadratura Simpsona


adaptiveSimpson(a,b,f,e) 
{ 
	P1 = Simpson(a,b,f); 
	P2 = Simpson(a,(a+b)/2,f) + Simpson((a+b)/2,b,f);
	if (\PIPEREAD P1-P2\PIPEREAD  < 15*e) 
		return( P2 );
	else 
		return( adaptiveSimpson(a,(a+b)/2,f,e/2) + adaptiveSimpson((a+b)/2,b,f,e/2) );
}

Zauważmy, że funkcja ta zakończy działanie. Rzeczywiście, na podprzedziale długości h chcemy obliczać całkę z dokładnością εh/(ba), a ponieważ różnica |P1P2| jest rzędu h5, kryterium kończenia procedury będzie spełnione dla każdego h dostatecznie małego. Podziały nie mogą więc następować w nieskończoność.

Trochę gorzej sprawa przedstawia się z błędem. Algorytm bazuje bowiem na przybliżonej równości (Uzupelnic: keyapp ). Jeśli po zakończeniu algorytmu mamy podział na podprzedziały a=x0<x1<<xn=b oraz (Uzupelnic: keyapp ) jest spełniona na każdym podprzedziale, to błąd można w przybliżeniu oszacować przez

j=1nεxjxj1ba=ε.

Z drugiej strony, możemy czasem trafić wyjątkowo "złośliwą" funkcję. Np. jeśli f(a+j(ba)/4)=0 dla 0j4, to już na początku P1P2=0 i funkcja zwróci zero mimo, że rzeczywista wartość całki może znacznie różnić się od zera. Istnieją pewne techniki, które przynajmniej częściowo zapobiegają tego typu zjawiskom, ale nie będziemy ich tutaj omawiać.

Uwarunkowanie

Biblioteki

W Octave dostępne są jedynie procedury całkujące funkcje skalarne jednej zmiennej na odcinku:

I=abf(x)dx.

Robi to funkcja DQAGP ze znakomitego pakietu QUADPACK. Najlepiej od razu posłużmy się przykładem.

Przykład: Prosta całka funkcji jednej zmiennej

Przypuśćmy, że chcemy obliczyć całkę I=01F(x)dx, gdzie np. F(x)=sin(23x)+(1x2)1/2. W tym celu najpierw implementujemy F w Octave:

function y = F(x)
	y = sin(23*x)+1/sqrt(1-x^2);
endfunction

Aby teraz obliczyć całkę I=01F(x)dx, wystarczy wywołać

I = quad("F", 0, 1);

W rzeczywistości, podobnie jak w przypadku funkcji fsolve, funkcja quad zwraca więcej informacji, można jej także przekazać dodatkowe parametry. I tak, jeśli chcemy ustawić poziom tolerancji błędu obliczenia całki:

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle |I - \text{\lstoct{quad(...)}}| \leq \max\{\text{ATOL}, \text{RTOL}\cdot |I|\} }

z wartościami ATOL = 1e-3 i RTOL = 1e-6, to wywołamy funkcję przekazując jej te parametry następująco:

quad("F", 0, 1, [1e-3, 1e-6]);

Musimy jednak pamiętać, by pojęcia tolerancji "błędu" nie traktować zbyt dosłownie: tym, co naprawdę kontroluje quad podczas wyznaczania wartości całki, jest jedynie pewien estymator błędu, dlatego wartość tolerancji należy zawsze wybierać w sposób konserwatywny, czyli z pewnym zapasem bezpieczeństwa, np.

Jeśli chcemy wyznaczyć wartość całki z błędem bezwzględnym na

poziomie 106, ustawimy -- na wszelki wypadek -- ATOL = 1e-7, a nie, prostodusznie, ATOL = 1e-6... Musimy także pamiętać, że choć są bardzo mało prawdopodobne do spotkania w praktyce, to jednak istnieją wyuzdane funkcje, dla których estymator błędu może dać całkowicie fałszywe wartości,

przez co i obliczona całka może być obarczona dowolnie wielkim błędem.

Dodajmy, że quad doskonale radzi sobie także z funkcjami z osobliwościami (o ile tylko ją o nich uprzedzimy). Przykładowo, scałkujmy funkcję ze złośliwą nieciągłością w zerze:

Parser nie mógł rozpoznać (nieznana funkcja „\beginmatrix”): {\displaystyle \displaystyle f(x) = \left\{ \beginmatrix \frac{1}{x} & x\neq 0,\\ 10^6 & x=0.\endmatrix \right. }

Oczywiście 11f(x)dx=0, tymczasem definiując

function y = osobliwa(x)
if (x != 0.0)
	y = 1/x;
else
	y = 1e6;
endif
endfunction

quad("osobliwa", -1, 1)

daje w rezultacie

ABNORMAL RETURN FROM DQAGP ans = -81.098

-- błędny wynik i (na szczęście!) także komunikat o jakichś problemach procedury całkującej. Jeśli jednak wspomożemy quad informacją o tym, że w x=0 czai się osobliwość, wszystko przebiegnie już gładko:

quad("osobliwa", -1, 1, [1e-8 1e-8], 0) ans = 0

(1e-8 jest żądaną tolerancją błędu, równą wartości domyślnej).

QUADPACK

Właściwie jedynym klasycznym pakietem, jaki mamy do dyspozycji jest ponaddwudziestoletni QUADPACK. Jest to zestaw kilkunastu procedur fortranowskich, służących obliczaniu typowych całek jednowymiarowych:

Typ całki Procedura QUADPACKa
abf(x) DQNG, DQAG, DQAGS, DQAGP
f(x) DQAGI
abf(x)cos(ωx) DQAWO
abf(x)xc DQAWC

oraz spora liczba podstawowych kwadratur, na których oparto te ogólne. Nazwy procedur rozszyfrowuje się podobnie jak nazwy procedur LAPACKa, zatem

  • przedrostek D w nazwie każdej procedury wymienionej w tabeli (np. DQAGI) oznacza, że będzie działać na liczbach typu double (całkując funkcję f zwracającą wartości tego samego typu). Gdybyśmy chcieli użyć pojedynczej precyzji, użylibyśmy nazwy procedury bez przedrostka.
  • Kolejna litera, Q, oczywiście oznacza kwadraturę (Quadrature).
  • Trzecia litera --- A lub N --- oznacza, odpowiednio, kwadraturę adaptacyjną lub nieadaptacyjną. Jak wiadomo, w praktyce lepiej sprawdzają się kwadratury adaptacyjne, potrafiące w jakiejś mierze dostosować się do przebiegu funkcji podcałkowej. Kwadratury nieadaptacyjne nie mają tej własności. Mogą natomiast, dla pewnych funkcji podcałkowych, okazać się tańsze, warto więc je stosować, gdy wiemy a priori, że adaptacja niewiele pomoże: np. do wolnozmiennych funkcji.
  • Pozostałe litery precyzują typ liczonej całki i zakres ingerencji użytkownika; G --- "zwykła" całka, bez wagi, W --- całka z wagą, O --- dla funkcji silnie oscylujących, C --- wartość główna całki (tzw. całka Cauchy'ego), I --- przedział nieskończony, S --- możliwe osobliwości, P --- użytkownik poda listę punktów, gdzie są osobliwości.

GSL

Biblioteka GSL reimplementuje podstawowe procedury QUADPACKa w języku C, zob. {GSL-reference}, gdzie zostały one bardzo przystępnie i szczegółowo opisane. Procedury GSL mają nazwy analogiczne, jak procedury QUADPACKa, ale z przedrostkiem gsl_integration, jak w poniższym przykładzie, gdzie wywołamy odpowiednik procedury DQAG: funkcję gsl_integration_qag.

#include <stdio.h>
#include <math.h>
#include <gsl/gsl_integration.h>

double F(double X, void * param) /* wrapper dla funkcji sin(x)/x */
{
	return(sin(X)/X);
}

int main(void)
{
	gsl_function f; /* argument z funkcją podcałkową */

	double A,ABSERR,B, EPSABS,EPSREL,RESULT;
	int IER,NEVAL;

	gsl_integration_workspace *workspace;

	int KEY, LIMIT; 

	/* przygotowujemy argument z funkcją podcałkową */
	f.function = &F;
	
	A = 0.0E0; B = 10*M_PI; /* przedział całkowania */
	EPSABS = 0.0E0; EPSREL = 1.0E-3; /* tolerancja błędu */

	/* parametry specyficzne dla QAG */
	KEY = 1; /* tzn. użyj minimalnej liczby punktów kwadratury bazowej */
	LIMIT = 100; /* maksymalny podział przedziału całkowania */
	workspace  = gsl_integration_workspace_alloc(LIMIT);
	
	/* całkujemy: QAG! */

	IER = gsl_integration_qag(&f, A, B, EPSABS, EPSREL, 
					LIMIT, KEY, workspace, &RESULT, &ABSERR);

	if (IER != 0)
		fprintf(stderr,"GSL_QAG: Kłopoty z całkowaniem\n");
	fprintf(stderr,"Całka: %g Est. błąd: %g IER: %d\n", RESULT, ABSERR,  IER);

	gsl_integration_workspace_free(workspace);
	
	return(0);
}

W powyższym przykładzie specjalnie pozostawiliśmy oznaczenia wykorzystywane w poprzednim programie. Jak widać, funkcje całkujące GSL mają bardzo podobną składnię do odpowiadających im funkcji QUADPACKa.

Miłym rozszerzeniem funkcjonalności jest możliwość przekazywania parametrów do wnętrza funkcji podcałkowej.

Różniczkowanie

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

Z zadaniem numerycznego różniczkowania zadanej funkcji spotykamy się często w numeryce. Rzeczywiście, jeśli przypomnimy sobie metodę siecznych, to była to po prostu metoda Newtona, w której pochodną przybliżono pewnym ilorazem różnicowym:

xk+1=xkf(xk)gk,

gdzie

gk=f(xk)f(xk1)xkxk1f(xk).

Zauważmy, że nie jest to jedyny możliwy wzór na przybliżoną metodę Newtona, równie dobrze(? --- to się dopiero okaże!) moglibyśmy wziąć

gk=f(xk+h)f(xk)h
dla dostatecznie małego h. 

Podobne formuły są także konieczne do konstrukcji metod numerycznego rozwiązywania równań różniczkowych, gdzie w naturalny sposób pojawia się konieczność operowania pochodną nieznanej funkcji.

Metody różnicowe

Rozważmy najprostszy sposób aproksymacji pochodnej f(x), oparty na różnicy dzielonej w przód, gdyż ze wzoru Taylora

f(x+h)=f(x)+f(x)h+O(h2),

pomijając człony rzędu h2, dostajemy przybliżenie

f(x)f(x+h)f(x)h,

a dokładniej,

f(x)=f(x+h)f(x)h+O(h).

Podobną dokładność aproksymacji dostaniemy, biorąc różnicę dzieloną w tył,

f(x)=f(x)f(xh)h+O(h).

Nietrudno przekonać się, że wzięcie średniej arytmetycznej tych dwóch aproksymacji daje tzw. różnicę centralną, która ma wyższy rząd aproksymacji, gdyż

f(x)=f(x+h)f(xh)2h+O(h2),

co znaczy, że dwukrotnie zmniejszając h, powinniśmy się spodziewać czterokrotnego zmniejszenia błędu aproksymacji pochodnej!

Metody interpolacyjne

Jeśli chcemy uzyskać jeszcze wyższy rząd aproksymacji pochodnej, często jako wyrażenie aproksymujące przyjmuje się pochodną wielomianu interpolacyjnego.

Rzeczywiście, niech wn będzie wielomianem interpolującym funkcję f w parami różnych węzłach x0<<xn, tzn.

wn(x)=i=0nf(xi)li(x),

gdzie li(x) są \link{sec:interpol}{wielomianami bazowymi Lagrange'a}. Wtedy

f(x)wn(x)=i=0nf(xi)li(x),

przy czym można wykazać, że

Twierdzenie O błędzie aproksymacji pochodnej za pomocą pochodnej wielomianu interpolacyjnego

Niech wn będzie wielomianem interpolującym funkcję fCn+2[a,b] w równoodległych węzłach a,a+h,a+2h,,b, gdzie h=(ba)/n. Wtedy zachodzi

f(x)wn(x)=O(hn)x[a,b]

Wszystkie wprowadzone powyżej metody interpolacji oparte na wielomianie Taylora w rzeczywistości dadzą się sprowadzić do pochodnej wielomianu interpolacyjnego. Rzeczywiście,

  • różnica w przód to aproksymacja f(x) pochodną wielomianu opartego na węzłach x i x+h,
  • różnica w tył to aproksymacja f(x) pochodną wielomianu opartego na węzłach x i xh,
  • różnica centralna to aproksymacja f(x) pochodną wielomianu opartego na węzłach xh i x+h; w tym ostatnim przypadku widzimy także, że powyższe twierdzenie nie zawsze jest ostre, bo dla różnicy centralnej byliśmy w stanie uzyskać wyższy niż minimalny gwarantowany przez twierdzenie rząd aproksymacji.

Łatwo także --- korzystając z powyższego --- wyprowadzić nowe wzory na aproksymację, przykładowo,

f(x)=12h(3f(x)4f(xh)+f(x2h))+O(h2)

korzysta tylko z wartości f na lewo od x (jest to więc różniczkowanie wstecz) i też daje kwadratową aproksymację.

Analogicznie możemy aproksymować pochodne wyższych rzędów, np.

f(x)=f(xh)2f(x)+f(x+h)h2+O(h2).

Tę formułę możemy znów uzyskać na wiele sposobów:

  • wprost ze wzoru Taylora, raz dla f(x+h), a raz dla f(xh),
  • jako drugą pochodną wielomianu interpolacyjnego,
  • jako złożenie różnicy dzielonej w przód z różnicą dzieloną w tył (co ma naśladować matematyczną zależność, że f(x)=(f(x)).

Namawiamy czytelnika do sprawdzenia, że faktycznie powyższy wzór można tak wyprowadzić.


Uwarunkowanie

Kłopoty numeryczne

Rozważmy przykładowo różnicę w przód dla h>0. Gdyby arytmetyka której używamy miała nieskończoną precyzję, to oczywiście zachodzi

f(x+h)f(x)hf(x)=O(h),

i przybliżenie byłoby tym lepsze, im mniejsze byłoby h. Jednak w praktyce tak nie będzie, ze względu na fakt, że działamy w arytmetyce skończonej precyzji:

  • dla małych h, mamy f(x+h)f(x)0, a więc zachodzi duże ryzyko utraty cyfr przy odejmowaniu
  • dla małych h, może zdarzyć się, że numerycznie flν(x+h)=flν(x) i w konsekwencji flν(f(x+h)f(x)h)=0.

Można więc postawić sobie pytanie, jak dobrać h na tyle małe, by mieć możliwie dobrą aproksymację f(x), a jeszcze nie odczuć zgubnych skutków wpływu arytmetyki zmiennoprzecinkowej. Formalnie, możemy pytanie postawić w sposób następujący:

Przypuśćmy, że zamiast

f(x)

wyznaczane jest

f~(x)=f(x)+ϵx

, przy czym

|ϵx|ϵ

. Jak dobrać do

ϵ

parametr

h

w taki sposób, by aproksymacja

f~(x+h)f~(x)hf(x)
była jak najlepsza?

Mamy:

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \displaystyle \aligned \left| \frac{\tilde{f}(x+h)-\tilde{f}(x)}{h} - f'(x) \right| &= \left| \frac{1}{h}( (f(x+h)+\epsilon_{x+h}) - (f(x) + \epsilon_x)) - f'(x) \right| \\ &\leq \left| \frac{ f(x+h) - f(x)}{h} - f'(x)\right| + \frac{2\epsilon}{h} \endaligned}

Ponieważ pierwszy człon wyrażenia daje się oszacować (dla dostatecznie regularnej funkcji f) przez Ch, to ostatecznie dostajemy

|f~(x+h)f~(x)hf(x)|C1(h+1h).

Wyrażenie po prawej stronie jest minimalizowane dla h=ϵ i stąd inżynierska reguła:

Jeśli chcesz używać różnicy w przód, powinieneś wziąć h równe co najmniej ϵmach.

Literatura

W celu dogłębnego zapoznania się z omawianym na wykładzie materiałem, przeczytaj rozdział 7.2 -- 7.6 w

  • D. Kincaid, W. Cheney Analiza numeryczna, Wydawnictwa Naukowo-Techniczne, Warszawa 2006, ISBN 83-204-3078-X.