MN14: Różnice pomiędzy wersjami
m →Biblioteki: Niepotrzebny przykład z funkcją osobliwą |
m Zastępowanie tekstu – „,↵</math>” na „</math>,” |
||
(Nie pokazano 13 pośrednich wersji utworzonych przez tego samego użytkownika) | |||
Linia 15: | Linia 15: | ||
całki oznaczonej | całki oznaczonej | ||
<center><math> | <center><math>S(f)\,=\,\int_a^b f(x)\,dx, | ||
</math></center> | </math></center> | ||
gdzie <math> | gdzie <math>-\infty<a<b<+\infty</math>, a <math>f</math> należy do pewnej klasy | ||
<math> | <math>F</math> funkcji rzeczywistych określonych i całkowalnych w | ||
sensie Riemanna na całym przedziale <math> | sensie Riemanna na całym przedziale <math>[a,b]</math>. | ||
Każdy, kto przeszedł przez [[Analiza_matematyczna_1/Wykład_14:_Całka_Riemanna_funkcji_jednej_zmiennej|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 <strong>przybliżonego</strong> wyznaczenia wartości całki daje się w dużej mierze zautomatyzować z całkiem dobrym skutkiem. | Każdy, kto przeszedł przez [[Analiza_matematyczna_1/Wykład_14:_Całka_Riemanna_funkcji_jednej_zmiennej|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 <strong>przybliżonego</strong> wyznaczenia wartości całki daje się w dużej mierze zautomatyzować z całkiem dobrym skutkiem. | ||
Linia 27: | Linia 27: | ||
Będziemy zakładać, że mamy możliwość obliczania | Będziemy zakładać, że mamy możliwość obliczania | ||
wartości funkcji <math> | wartości funkcji <math>f</math>, a w niektórych przypadkach | ||
również jej pochodnych, o ile istnieją. Dokładna | również jej pochodnych, o ile istnieją. Dokładna | ||
całka <math> | całka <math>S(f)</math> będzie więc w ogólności przybliżana | ||
wartością <math> | wartością <math>A(f)</math>, która zależy tylko od wartości <math>f</math> | ||
i ewentualnie jej pochodnych w skończonej liczbie punktów. | i ewentualnie jej pochodnych w skończonej liczbie punktów. | ||
==Kwadratury== | ==Kwadratury== | ||
<strong>Kwadraturami</strong> nazywamy funkcjonały liniowe <math> | <strong>Kwadraturami</strong> nazywamy funkcjonały liniowe <math>Q:F\to R</math> | ||
postaci | postaci | ||
<center><math> | <center><math>Q(f)\,=\,\sum_{i=0}^n a_i f(x_i)</math>,</center> | ||
</math></center> | |||
albo ogólniej | albo ogólniej | ||
<center><math> | <center><math> | ||
Q(f)\,=\,\sum_{i=0}^k\sum_{j=0}^{n_i-1} | Q(f)\,=\,\sum_{i=0}^k\sum_{j=0}^{n_i-1} | ||
a_{i,j}f^{(j)}(x_i), | a_{i,j}f^{(j)}(x_i), | ||
</math></center> | </math></center> | ||
gdzie <math> | gdzie <math>x_i</math> są punktami z <math>[a,b]</math>, a <math>a_i</math> (albo <math>a_{i,j}</math>) | ||
są pewnymi współczynnikami rzeczywistymi. Zauważmy, | są pewnymi współczynnikami rzeczywistymi. Zauważmy, | ||
że obliczenia kwadratur są dopuszczalne w naszym modelu | że obliczenia kwadratur są dopuszczalne w naszym modelu | ||
Linia 55: | Linia 54: | ||
Jeden z możliwych sposobów konstrukcji kwadratur jest | Jeden z możliwych sposobów konstrukcji kwadratur jest | ||
następujący. Najpierw wybieramy węzły <math> | następujący. Najpierw wybieramy węzły <math>x_j</math> (pojedyncze | ||
lub wielokrotne), budujemy wielomian interpolacyjny | lub wielokrotne), budujemy wielomian interpolacyjny | ||
odpowiadający tym węzłom, a następnie całkujemy go. | odpowiadający tym węzłom, a następnie całkujemy go. | ||
Ponieważ postać wielomianu interpolacyjnego zależy tylko | Ponieważ postać wielomianu interpolacyjnego zależy tylko | ||
od danej informacji o <math> | od danej informacji o <math>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 takiej postaci, | konsekwencji funkcjonał wynikowy będzie takiej postaci, | ||
Linia 65: | Linia 64: | ||
{{definicja||| | {{definicja||| | ||
Kwadraturę <math> | Kwadraturę <math>Q^I</math> opartą na węzłach | ||
o łącznej krotności <math> | o łącznej krotności <math>n+1</math> nazywamy interpolacyjną, | ||
jeśli | jeśli | ||
<center><math> | <center><math>Q^{I}(f)\,=\,\int_a^b w_f(x)\,dx, | ||
</math></center> | </math></center> | ||
gdzie <math> | gdzie <math>w_f</math> jest wielomianem interpolacyjnym funkcji <math>f</math> | ||
stopnia co najwyżej <math> | stopnia co najwyżej <math>n</math>, opartym na tych węzłach. | ||
}} | }} | ||
Linia 80: | Linia 79: | ||
węzły są jednokrotne. Zapisując wielomian interpolacyjny | węzły są jednokrotne. Zapisując wielomian interpolacyjny | ||
w postaci jego rozwinięcia w [[MN09#Baza Lagrange'a (kanoniczna)|bazie kanonicznej Lagrange'a]] | w postaci jego rozwinięcia w [[MN09#Baza Lagrange'a (kanoniczna)|bazie kanonicznej Lagrange'a]] | ||
<math> | <math>l_i</math>, otrzymujemy | ||
<center><math> | <center><math>Q^{I}(f) \,=\, \int_a^b \sum_{i=0}^n f(x_i)l_i(x)\,dx | ||
\,=\, \sum_{i=0}^n f(x_i)\int_a^b l_i(x)\,dx, | \,=\, \sum_{i=0}^n f(x_i)\int_a^b l_i(x)\,dx, | ||
</math></center> | </math></center> | ||
a stąd i z postaci <math> | a stąd i z postaci <math>l_i</math>, | ||
<center><math> | <center><math>a_i\,=\,\int_a^b \frac | ||
{(x-x_0)\cdots(x-x_{i-1})(x-x_{i+1})\cdots(x-x_n)} | {(x-x_0)\cdots(x-x_{i-1})(x-x_{i+1})\cdots(x-x_n)} | ||
{(x_i-x_0)\cdots(x_i-x_{i-1})(x_i-x_{i+1})\cdots(x_i-x_n)} | {(x_i-x_0)\cdots(x_i-x_{i-1})(x_i-x_{i+1})\cdots(x_i-x_n)} | ||
\,dx | \,dx</math>,</center> | ||
</math></center> | |||
<math> | <math>0\le i\le n</math>. | ||
Podamy teraz kilka przykładów. | Podamy teraz kilka przykładów. | ||
<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> | <math>x_0=(a+b)/2</math>, | ||
<center><math> | <center><math>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]] | [[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 | ||
węzłach <math> | węzłach <math>x_0=a</math>, <math>x_1=b</math> i jest równa polu odpowiedniego | ||
trapezu, | trapezu, | ||
<center><math> | <center><math>Q^{I}_1(f)\,=\,T(f)\,=\,\frac{b-a}2 \Big(f(a)+f(b)\Big) | ||
</math></center> | </math></center> | ||
Linia 116: | Linia 113: | ||
<strong>Kwadratura parabol (Simpsona)</strong> jest oparta na | <strong>Kwadratura parabol (Simpsona)</strong> jest oparta na | ||
jednokrotnych węzłach <math> | jednokrotnych węzłach <math>x_0=a</math>, <math>x_1=b</math>, <math>x_2=(a+b)/2</math>, | ||
i jest równa polu pod parabolą interpolującą <math> | i jest równa polu pod parabolą interpolującą <math>f</math> | ||
w tych węzłach, | w tych węzłach, | ||
<center><math> | <center><math>Q^I_2(f)\,=\,P(f)\,=\,\frac{b-a}6 | ||
\Big( f(a)+4f\Big(\frac{a+b}2\Big)+f(b) \Big) | \Big( f(a)+4f\Big(\frac{a+b}2\Big)+f(b) \Big) | ||
</math></center> | </math></center> | ||
Zauważmy, że kwadratury trapezów i parabol są oparte | Zauważmy, że kwadratury trapezów i parabol są oparte | ||
na węzłach jednokrotnych i równoodległych, przy czym | na węzłach jednokrotnych i równoodległych, przy czym | ||
<math> | <math>x_0=a</math> i <math>x_n=b</math>. Ogólnie, kwadratury interpolacyjne | ||
oparte na węzłach równoodległych <math> | oparte na węzłach równoodległych <math>x_i=a+(b-a)i/n</math>, | ||
<math> | <math>0\le i\le n</math>, nazywamy <strong>kwadraturami Newtona--Cotesa</strong>. | ||
==Błąd kwadratur interpolacyjnych== | ==Błąd kwadratur interpolacyjnych== | ||
Zajmiemy się teraz błędem kwadratur interpolacyjnych. | Zajmiemy się teraz błędem kwadratur interpolacyjnych. | ||
Przypomnijmy, że <math> | Przypomnijmy, że <math>F^r_M([a,b])</math> oznacza klasę funkcji | ||
<math> | <math>(r+1)</math> razy różniczkowalnych w sposób ciągły | ||
i takich, że <math> | i takich, że <math>|f^{(r+1)}(x)|\le M</math>, <math>\forall x</math>. | ||
{{twierdzenie|O błędzie kwadratur interpolacyjnych|O błędzie kwadratur interpolacyjnych| | {{twierdzenie|O błędzie kwadratur interpolacyjnych|O błędzie kwadratur interpolacyjnych| | ||
Niech <math> | Niech <math>Q^I</math> będzie kwadraturą | ||
interpolacyjną opartą na (jednokrotnych lub wielokrotnych) | interpolacyjną opartą na (jednokrotnych lub wielokrotnych) | ||
węzłach <math> | węzłach <math>x_i</math>, <math>0\le i\le n</math>. Jeśli <math>f\in F^n_M([a,b])</math>, to | ||
<center><math> | <center><math> | ||
|S(f)\,-\,Q^I(f)|\,\le\,\frac M{(n+1)!}(b-a)^{n+2}. | |S(f)\,-\,Q^I(f)|\,\le\,\frac M{(n+1)!}(b-a)^{n+2}. | ||
</math></center> | </math></center> | ||
W klasie <math> | W klasie <math>F^n_M([a,b])</math> maksymalny błąd kwadratury <math>Q^I</math> | ||
wynosi | wynosi | ||
<center><math> | <center><math>\sup_{f\in F_M^n([a,b])} |S(f)-Q^I(f)|\,=\,\frac M{(n+1)!} | ||
\int_a^b |(x-x_0)(x-x_1)\cdots(x-x_n)|\,dx | \int_a^b |(x-x_0)(x-x_1)\cdots(x-x_n)|\,dx</math></center> | ||
</math></center> | |||
}} | }} | ||
Linia 160: | Linia 156: | ||
[[MN09#Postać błędu interpolacji|błąd interpolacji wielomianowej]], mamy | [[MN09#Postać błędu interpolacji|błąd interpolacji wielomianowej]], mamy | ||
<center><math> | <center><math>S(f)\,-\,Q^{I}(f)\,=\,\int_a^b | ||
(x-x_0)(x-x_1)\cdots(x-x_n)f(x_0,x_1,\ldots,x_n,x)\,dx | (x-x_0)(x-x_1)\cdots(x-x_n)f(x_0,x_1,\ldots,x_n,x)\,dx</math></center> | ||
</math></center> | |||
Stąd, jeśli <math> | Stąd, jeśli <math>f\in F^n_M([a,b])</math>, to | ||
<center><math> | <center><math>|S(f)\,-\,Q^I(f)|\,\le\,\int_a^b (b-a)^{n+1}\frac M{(n+1)!}\,dx | ||
\,=\,(b-a)^{n+2}\frac M{(n+1)!} | \,=\,(b-a)^{n+2}\frac M{(n+1)!}</math></center> | ||
</math></center> | |||
Ograniczenie górne w dokładnej formule na błąd w klasie | Ograniczenie górne w dokładnej formule na błąd w klasie | ||
<math> | <math>F^n_M([a,b])</math> wynika bezpośrednio. | ||
Aby pokazać ograniczenie dolne zauważmy, że dla funkcji <math> | Aby pokazać ograniczenie dolne zauważmy, że dla funkcji <math>g</math> | ||
takiej, że <math> | takiej, że <math>g^{(n+1)}</math> przyjmuje na przedziałach <math>(a,x_0)</math>, | ||
<math> | <math>(x_0,x_1)</math>, <math>\ldots</math>, <math>(x_n,b)</math> naprzemiennie wartości | ||
<math> | <math>M</math> i <math>-M</math> mamy | ||
<center><math> | <center><math>|S(g)-Q^I(g)|\,=\,\frac M{(n+1)!} | ||
\int_a^b |(x-x_0)(x-x_1)\cdots(x-x_n)|\,dx | \int_a^b |(x-x_0)(x-x_1)\cdots(x-x_n)|\,dx</math></center> | ||
</math></center> | |||
Co prawda, <math> | Co prawda, <math>g</math> nie jest w <math>F^n_M([a,b])</math>, ale może być | ||
dla dowolnego <math> | dla dowolnego <math>\epsilon>0</math> przybliżana funkcjami | ||
<math> | <math>f_\epsilon\in F^n_M([a,b])</math> w ten sposób, że całka | ||
<center><math> | <center><math>\int_a^b |(x-x_0)\cdots(x-x_n)(f-g)^{(n+1)}(x)|\,dx | ||
\,\le\,\epsilon\,(n+1)! | \,\le\,\epsilon\,(n+1)!</math></center> | ||
</math></center> | |||
Zapisując <math> | Zapisując <math>f_\epsilon=g+(f_\epsilon-g)</math> mamy | ||
<center><math>\ | <center><math>\begin{align} |S(f_\epsilon)\,-\,Q^I(f_\epsilon)| &\le & |S(g)\,-\,Q^I(g)|\,+\, | ||
|S(f_\epsilon-g)-Q^I(f_\epsilon-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)| | &\le & \frac M{(n+1)!}\int_a^b |(x-x_0)\cdots(x-x_n)| | ||
\,dx\,+\,\epsilon, | \,dx\,+\,\epsilon, | ||
\ | \end{align}</math></center> | ||
co wobec dowolności <math> | co wobec dowolności <math>\epsilon</math> daje dowód twierdzenia. | ||
}} | }} | ||
W szczególnych przypadkach kwadratur trapezów <math> | W szczególnych przypadkach kwadratur trapezów <math>T</math> | ||
i parabol <math> | i parabol <math>P</math> możemy otrzymać innego rodzaju formuły | ||
na błąd. | na błąd. | ||
{{twierdzenie|O postaci błędu kwadratury trapezów i Simpsona|O postaci błędu kwadratury trapezów i Simpsona| | {{twierdzenie|O postaci błędu kwadratury trapezów i Simpsona|O postaci błędu kwadratury trapezów i Simpsona| | ||
Jeśli <math> | Jeśli <math>f\in C^{(2)}([a,b])</math>, | ||
to dla kwadratury trapezów mamy | to dla kwadratury trapezów mamy | ||
<center><math> | <center><math>S(f)\,-\,T(f)\,=\,-\frac{(b-a)^3}{12}f^{(2)}(\xi_1)</math></center> | ||
</math></center> | |||
Jeśli <math> | Jeśli <math>f\in C^{(4)}([a,b])</math>, to dla kwadratury | ||
parabol mamy | parabol mamy | ||
<center><math> | <center><math>S(f)\,-\,P(f)\,=\,-\frac{(b-a)^5}{2280}f^{(4)}(\xi_2)</math></center> | ||
</math></center> | |||
(<math> | (<math>\xi_1,\xi_2\in [a,b]</math>). | ||
}} | }} | ||
Linia 225: | Linia 215: | ||
Ze wzoru na błąd kwadratury, | Ze wzoru na błąd kwadratury, | ||
<center><math> | <center><math>S(f)\,-\,T(f)\,=\,\int_a^b (x-a)(x-b)f(a,b,x)\,dx</math></center> | ||
</math></center> | |||
Ponieważ funkcja <math> | Ponieważ funkcja <math>x\mapsto f(a,b,x)</math> jest ciągła, a | ||
wielomian <math> | wielomian <math>(x-a)(x-b)</math> przyjmuje jedynie wartości | ||
nieujemne, można zastosować twierdzenie o wartości | nieujemne, można zastosować twierdzenie o wartości | ||
średniej dla całki, aby otrzymać | średniej dla całki, aby otrzymać | ||
<center><math>\ | <center><math>\begin{align} 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, | &= -\frac{f^{(2)}(\xi_1)}{2!}\frac{(b-a)^3}6, | ||
\ | \end{align}</math></center> | ||
dla pewnych <math> | dla pewnych <math>c,\xi_1\in [a,b]</math>. | ||
Teraz zajmiemy się kwadraturą parabol. | Teraz zajmiemy się kwadraturą parabol. | ||
Niech <math> | Niech <math>w_{f,2}\in\Pi_2</math> i <math>w_{f,3}\in\Pi_3</math> będą | ||
wielomianami interpolacyjnymi funkcji <math> | wielomianami interpolacyjnymi funkcji <math>f</math> odpowiednio dla | ||
węzłów <math> | węzłów <math>a,b,(a+b)//2</math> oraz <math>a,b,(a+b)//2,(a+b)//2</math>. Wtedy | ||
<center><math> | <center><math>w_{f,3}(x)\,=\,w_{f,2}(x)\,+\, | ||
f\Big(a,b,\frac{a+b}2,\frac{a+b}2\Big) | f\Big(a,b,\frac{a+b}2,\frac{a+b}2\Big) | ||
(x-a)\Big(x-\frac{a+b}2\Big)(x-b). | (x-a)\Big(x-\frac{a+b}2\Big)(x-b). | ||
Linia 251: | Linia 240: | ||
Wobec | Wobec | ||
<center><math> | <center><math>\int_a^b (x-a)\Big(\frac{a+b}2\Big)(x-b)\,dx\,=\,0 | ||
</math></center> | </math></center> | ||
mamy | mamy | ||
<center><math> | <center><math>P(f) \,=\, \int_a^b w_{f,2}(x)\,dx\,=\, | ||
\int_a^b w_{f,3}(x)\,dx | \int_a^b w_{f,3}(x)\,dx</math></center> | ||
</math></center> | |||
Stąd i ze wzoru na błąd interpolacji Hermite'a otrzymujemy | Stąd i ze wzoru na błąd interpolacji Hermite'a otrzymujemy | ||
<center><math>\ | <center><math>\begin{align} 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) | && =\; \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. | f\Big(a,b,\frac{a+b}2,\frac{a+b}2,x\Big)\,dx. | ||
\ | \end{align}</math></center> | ||
Ponieważ wielomian <math> | Ponieważ wielomian <math>(x-a)(x-(a+b)/2)^2(x-b)</math> jest | ||
niedodatni na <math> | niedodatni na <math>[a,b]</math>, możemy znów zastosować twierdzenie | ||
o wartości średniej. Mamy | o wartości średniej. Mamy | ||
<center><math>\ | <center><math>\begin{align} S(f)\,-\,P(f) &= f\Big(a,b,\frac{a+b}2,\frac{a+b}2,c\Big) \\ | ||
&& \qquad\qquad\qquad | && \qquad\qquad\qquad | ||
\int_a^b (x-a)\Big(x-\frac{a+b}2\Big)^2(x-b)\,dx \\ | \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}, | &= -\frac{f^{(4)}(\xi_2)}{4!}\frac{(b-a)^5}{120}, | ||
\ | \end{align}</math></center> | ||
co kończy dowód. | co kończy dowód. | ||
Linia 286: | Linia 274: | ||
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> | wielomianowej interpolującej <math>f</math>. | ||
[[grafika:Riemann.jpg|thumb|right||Georg Riemann<br> [[Biografia Riemann|Zobacz biografię]]]] | [[grafika:Riemann.jpg|thumb|right||Georg Riemann<br> [[Biografia Riemann|Zobacz biografię]]]] | ||
Linia 292: | Linia 280: | ||
Prostym przykładem kwadratury złożonej jest ''suma Riemanna'', | Prostym przykładem kwadratury złożonej jest ''suma Riemanna'', | ||
<center><math> | <center><math>\bar Q(f)\,=\,\sum_{i=0}^n (t_{i+1}-t_i)f(x_i), | ||
</math></center> | </math></center> | ||
gdzie <math> | gdzie <math>a=t_0<t_1<\cdots<t_{n+1}=b</math> oraz | ||
<math> | <math>x_i\in [t_i,t_{i+1}]</math>. Jeśli średnica podziału, | ||
<math> | <math>\max_{0\le i\le n}(t_i-t_{i-1})</math>, maleje do zera, to | ||
<math> | <math>\lim_{n\to\infty}\bar Q(f)=S(f)</math>. | ||
Będziemy rozpatrywać kwadratury złożone postaci | Będziemy rozpatrywać kwadratury złożone postaci | ||
<center><math> | <center><math>\bar Q(f)\,=\,\int_a^b \bar w_f(x)\,dx, | ||
</math></center> | </math></center> | ||
gdzie <math> | gdzie <math>\bar w_f</math> jest kawałkami wielomianem. Dokładniej, | ||
dla danego <math> | dla danego <math>n</math> kładziemy <math>t_i=a+(b-a)i/k</math>, <math>0\le i\le k</math>, | ||
a następnie dla każdego <math> | a następnie dla każdego <math>i</math> wybieramy dowolne węzły | ||
<math> | <math>x_{i,j}\in [t_{i-1},t_i]</math>, <math>0\le j\le r</math>. Wtedy <math>\bar w_f</math> | ||
jest na każdym przedziale wielomianem interpolacyjnym | jest na każdym przedziale wielomianem interpolacyjnym | ||
funkcji <math> | funkcji <math>f</math> stopnia co najwyżej <math>r</math> opartym na węzłach | ||
<math> | <math>x_{i,j}</math>. Kwadratura <math>\bar Q</math> korzysta z węzłów | ||
o łącznej krotności <math> | o łącznej krotności <math>n\le k(r+1)</math>. | ||
{{twierdzenie|O błędzie kwadratur złożonych|O błędzie kwadratur złożonych| | {{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> | <math>\bar Q(f)</math> w klasie <math>F^r_M([a,b])</math> jest ograniczony przez | ||
<center><math> | <center><math>\sup_{f\in F^r_M([a,b])} |S(f)-\bar Q(f)|\,\le\, | ||
\frac{(b-a)^{r+2}}{k^{r+1}} | \frac{(b-a)^{r+2}}{k^{r+1}} | ||
\frac{M}{(r+1)!}\,\le\,C\,\Big(\frac 1n\Big)^{r+1}, | \frac{M}{(r+1)!}\,\le\,C\,\Big(\frac 1n\Big)^{r+1}, | ||
Linia 326: | Linia 314: | ||
gdzie | gdzie | ||
<center><math> | <center><math>C\,=\,\frac{M(r+1)^{r+1}(b-a)^{r+2}}{(r+1)!}</math></center> | ||
</math></center> | |||
}} | }} | ||
Linia 334: | Linia 321: | ||
Twierdzenie to jest bezpośrednim wnioskiem z [[#O błędzie kwadratur interpolacyjnych|twierdzenia o błędzie kwadratur interpolacyjnych]]. Mamy bowiem | Twierdzenie to jest bezpośrednim wnioskiem z [[#O błędzie kwadratur interpolacyjnych|twierdzenia o błędzie kwadratur interpolacyjnych]]. Mamy bowiem | ||
<center><math>\ | <center><math>\begin{align} |S(f)-\bar Q(f)| &\le & \sum_{i=1}^k | ||
\int_{t_{i-1}}^{t_i} |f(x)-\bar w_f(x)|\,dx \\ | \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} | &\le & \sum_{i=1}^k \Big(\frac{b-a}{k}\Big)^{r+2} | ||
\frac M{(r+1)!} \,=\, | \frac M{(r+1)!} \,=\, | ||
\frac{(b-a)^{r+2}}{k^{r+1}}\frac M{(r+1)!}, | \frac{(b-a)^{r+2}}{k^{r+1}}\frac M{(r+1)!}, | ||
\ | \end{align}</math></center> | ||
co kończy dowód. | co kończy dowód. | ||
}} | }} | ||
W klasie <math> | W klasie <math>F^r_M([a,b])</math>, błąd kwadratur złożonych | ||
jest rzędu <math> | jest rzędu <math>n^{-(r+1)}</math>. 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> | z wartości funkcji w <math>n</math> punktach nie może w klasie | ||
<math> | <math>F^r_M([a,b])</math> maleć szybciej niż <math>n^{-(r+1)}</math>. | ||
Podane kwadratury złożone mają więc optymalny rząd | Podane kwadratury złożone mają więc optymalny rząd | ||
zbieżności. | zbieżności. | ||
Linia 354: | Linia 341: | ||
Zajmiemy się teraz błędem szczególnych kwadratur | Zajmiemy się teraz błędem szczególnych kwadratur | ||
złożonych, mianowicie złożonych kwadratur trapezów | złożonych, mianowicie złożonych kwadratur trapezów | ||
<math> | <math>\bar T_k</math> i parabol <math>\bar P_k</math>. Powstają one przez | ||
zastosowanie na każdym przedziale <math> | zastosowanie na każdym przedziale <math>[t_{i-1},t_i]</math> | ||
odpowiednio kwadratur trapezów <math> | odpowiednio kwadratur trapezów <math>T</math> i parabol <math>P</math>. | ||
[[Image:MNzlozonetrapezy.png|thumb|550px|center|Złożona kwadratura trapezów]] | [[Image:MNzlozonetrapezy.png|thumb|550px|center|Złożona kwadratura trapezów]] | ||
Linia 362: | Linia 349: | ||
Jak łatwo się przekonać, | Jak łatwo się przekonać, | ||
<center><math> | <center><math>\bar T_k(f)\,=\,\frac{b-a}{k}\left(\frac{f(a)+f(b)}2 | ||
\,+\,\sum_{j=1}^{k-1} f\Big(\frac jk\Big)\right), | \,+\,\sum_{j=1}^{k-1} f\Big(\frac jk\Big)\right), | ||
</math></center> | </math></center> | ||
Linia 368: | Linia 355: | ||
oraz | oraz | ||
<center><math> | <center><math>\bar P_k(f)\,=\,\frac{b-a}{3k}\left(\frac{f(a)+f(b)}2 | ||
\,+\,\sum_{j=1}^{k-1} f\Big(\frac jk\Big)\,+\, | \,+\,\sum_{j=1}^{k-1} f\Big(\frac jk\Big)\,+\, | ||
2\,\sum_{j=1}^k f\Big(\frac{2j-1}{2k}\Big)\right). | 2\,\sum_{j=1}^k f\Big(\frac{2j-1}{2k}\Big)\right). | ||
Linia 375: | Linia 362: | ||
{{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| | {{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> | Jeśli <math>f\in C^{(2)}([a,b])</math>, to | ||
<center><math> | <center><math>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> | Jeśli <math>f\in C^{(4)}([a,b])</math>, to | ||
<center><math> | <center><math>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 392: | Linia 377: | ||
Dla kwadratury trapezów mamy | Dla kwadratury trapezów mamy | ||
<center><math>\ | <center><math>\begin{align} 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)^3}{12 k^2}\frac 1k | && =\;-\frac{(b-a)^3}{12 k^2}\frac 1k | ||
\sum_{i=1}^k f^{(2)}(\alpha_i) \,=\, | \sum_{i=1}^k f^{(2)}(\alpha_i) \,=\, | ||
-\frac{(b-a)^3}{12 k^2} f^{(2)}(\xi_1), | -\frac{(b-a)^3}{12 k^2} f^{(2)}(\xi_1), | ||
\ | \end{align}</math></center> | ||
a dla kwadratury parabol podobnie | a dla kwadratury parabol podobnie | ||
<center><math>\ | <center><math>\begin{align} 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)^5}{2280 k^4}\frac 1k | && =\; -\frac{(b-a)^5}{2280 k^4}\frac 1k | ||
\sum_{i=1}^k f^{(4)}(\beta_i) \,=\, | \sum_{i=1}^k f^{(4)}(\beta_i) \,=\, | ||
-\frac{(b-a)^5}{2280 k^4} f^{(4)}(\xi_2). | -\frac{(b-a)^5}{2280 k^4} f^{(4)}(\xi_2). | ||
\ | \end{align}</math></center> | ||
}} | }} | ||
Kwadratura parabol ma więc optymalny rząd zbieżności | Kwadratura parabol ma więc optymalny rząd zbieżności | ||
nie tylko w klasie <math> | nie tylko w klasie <math>F^2_M([a,b])</math>, ale też w <math>F^3_M([a,b])</math>. | ||
==Przyspieszanie zbieżności kwadratur== | ==Przyspieszanie zbieżności kwadratur== | ||
W praktyce często stosuje się obliczanie kwadratur | W praktyce często stosuje się obliczanie kwadratur | ||
poprzez zagęszczanie podziału przedziału <math> | poprzez zagęszczanie podziału przedziału <math>[a,b]</math>. | ||
Na przykład, dla złożonej kwadratury trapezów zachodzi | Na przykład, dla złożonej kwadratury trapezów zachodzi | ||
następujący wygodny wzór rekurencyjny: | następujący wygodny wzór rekurencyjny: | ||
<center><math> | <center><math> | ||
\bar T_{2k}\,=\,\frac 12\left(\bar T_k(f)\,+\, | \bar T_{2k}\,=\,\frac 12\left(\bar T_k(f)\,+\, | ||
\frac{b-a}k\,\sum_{i=1}^k | \frac{b-a}k\,\sum_{i=1}^k | ||
f\Big(\frac{2i-1}{2k}\Big)\right) | f\Big(\frac{2i-1}{2k}\Big)\right)</math></center> | ||
</math></center> | |||
Pozwala on obliczyć <math> | Pozwala on obliczyć <math>\bar T_{2k}(f)</math> na podstawie | ||
<math> | <math>\bar T_k(f)</math> poprzez "doliczenie" wartości funkcji | ||
w punktach "gęstszej" siatki. W ten sposób możemy | w punktach "gęstszej" siatki. W ten sposób możemy | ||
obserwować zachowanie się kolejnych przybliżeń | obserwować zachowanie się kolejnych przybliżeń | ||
<math> | <math>\bar T_{2^s}(f)</math> (<math>s\ge 0</math>) całki <math>S(f)</math>. Jest to | ||
szczególnie istotne wtedy, gdy nie mamy żadnej informacji | szczególnie istotne wtedy, gdy nie mamy żadnej informacji | ||
a priori o <math> | a priori o <math>\|f''\|_{ C([a,b])}</math>, a przez to nie potrafimy | ||
oszacować liczby <math> | oszacować liczby <math>n</math> węzłów, dla której osiągniemy | ||
pożądaną dokładność. | pożądaną dokładność. | ||
Linia 439: | Linia 423: | ||
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 | ||
maleje do zera szybciej niż <math> | maleje do zera szybciej niż <math>n^{-2}</math>. Okazuje się jednak, | ||
że kwadratury <math> | że kwadratury <math>\bar T_k</math> mogą być podstawą dla prostej | ||
rekurencyjnej konstrukcji innych kwadratur posiadających już | rekurencyjnej konstrukcji innych kwadratur posiadających już | ||
optymalną zbieżność. Konstrukcja ta bazuje na | optymalną zbieżność. Konstrukcja ta bazuje na | ||
Linia 451: | Linia 435: | ||
{{lemat|Formuła Eulera-Maclaurina|Formuła Eulera-Maclaurina| | {{lemat|Formuła Eulera-Maclaurina|Formuła Eulera-Maclaurina| | ||
Dla funkcji <math> | Dla funkcji <math>f\in C^{(2m+2)}([a,b])</math>, błąd złożonej | ||
kwadratury trapezów <math> | kwadratury trapezów <math>\bar T_k</math> wyraża się wzorem | ||
<center><math>\ | <center><math>\begin{align} S(f)\,-\,\bar T_k(f) &= \sum_{i=1}^{m} c_ih^{2i} | ||
\Big(f^{(2i-1)}(b)-f^{(2i-1)}(a)\Big) \\ | \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}), | &&\qquad\qquad\qquad \,+\,c_{m+1}h^{2m+2}(b-a)f^{(2m+2)}(\xi_{m,k}), | ||
\ | \end{align}</math></center> | ||
gdzie <math> | gdzie <math>h=(b-a)/k</math>, <math>\xi_{m,k}\in[a,b]</math>, a <math>c_i</math> są pewnymi stałymi | ||
liczbowymi. Mamy <math> | liczbowymi. Mamy <math>c_1=-1/12</math>, <math>c_2=-1/720</math> i, ogólnie, | ||
<math> | <math>c_i=B_i/(2i)!</math>, gdzie <math>B_i</math> są tzw. liczbami Bernoulliego. | ||
}} | }} | ||
Linia 468: | Linia 452: | ||
Formułę Eulera-Maclaurina można przepisać w postaci | Formułę Eulera-Maclaurina można przepisać w postaci | ||
<center><math> | <center><math>S(f)\,-\,\bar T_k(f)\,=\,\sum_{i=1}^{m} c^{(0)}_i(f)\,k^{-2i} | ||
\,+\,c^{(0)}_{m+1,k}(f)\,k^{-(2m+2)} | \,+\,c^{(0)}_{m+1,k}(f)\,k^{-(2m+2)}</math>,</center> | ||
</math></center> | |||
gdzie <math> | gdzie <math>c^{(0)}_i(f)=c_i(b-a)^{2i}(f^{(2i-1)}(b)-f^{(2i-1)}(a))</math>, | ||
<math> | <math>1\le i\le m</math>, oraz | ||
<math> | <math>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> | Zauważmy przy tym, że jeśli <math>f\in F^{2m+1}_M([a,b])</math>, to współczynniki | ||
<math> | <math>c^{(0)}_{m+1,k}(f)</math> są wspólnie ograniczone przez <math>c_{m+1}(b-a)^{2m+2}M</math>. | ||
Definiując teraz kwadraturę | Definiując teraz kwadraturę | ||
<center><math> | <center><math>\bar T^1_k(f)\,=\,\frac{4\,\bar T_{2k}(f)\,-\,\bar T_k(f)}{3}</math>,</center> | ||
</math></center> | |||
dla <math> | dla <math>f\in C^{(4)}([a,b])</math> mamy | ||
<center><math>\ | <center><math>\begin{align} S(f)\,-\,\bar T^1_k(f) &= \frac{4\,(S(f)-\bar T_{2k}(f)- | ||
(S(f)-\bar T_k(f))}{3} \\ | (S(f)-\bar T_k(f))}{3} \\ | ||
&= \frac 43\left(\frac{c^{(0)}_1(f)}{4k^2}+ | &= \frac 43\left(\frac{c^{(0)}_1(f)}{4k^2}+ | ||
Linia 492: | Linia 474: | ||
\frac{c^{(0)}_{2,k}(f)}{k^4}\right) \\ | \frac{c^{(0)}_{2,k}(f)}{k^4}\right) \\ | ||
&= \frac{c^{(1)}_{2,k}(f)}{k^4}, | &= \frac{c^{(1)}_{2,k}(f)}{k^4}, | ||
\ | \end{align}</math></center> | ||
gdzie <math> | gdzie <math>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> | i jest wspólnie ograniczone dla <math>f\in F^3_M([a,b])</math>. Kwadratura <math>T^1_k</math> | ||
ma więc optymalny w <math> | ma więc optymalny w <math>F^3_M([a,b])</math> rząd zbieżności <math>k^{-4}</math>. | ||
Proces ten można kontynuować dalej tworząc kolejne kwadratury | Proces ten można kontynuować dalej tworząc kolejne kwadratury | ||
o coraz to wyższym rzędzie zbieżności. Dokładniej, połóżmy | o coraz to wyższym rzędzie zbieżności. Dokładniej, połóżmy | ||
<math> | <math>\bar T^0_k(f)=\bar T_k(f)</math> oraz, dla <math>s\ge 1</math>, | ||
<center><math> | <center><math> | ||
\bar T^s_k(f)\,=\,\frac | \bar T^s_k(f)\,=\,\frac | ||
{4^s\,\bar T^{s-1}_{2k}(f)\,-\,\bar T^{s-1}_k(f)}{4^s-1} | {4^s\,\bar T^{s-1}_{2k}(f)\,-\,\bar T^{s-1}_k(f)}{4^s-1}</math></center> | ||
</math></center> | |||
Wtedy, dla <math> | Wtedy, dla <math>f\in F^{2m+1}_M([a,b])</math>, rząd zbieżności | ||
kwadratury <math> | kwadratury <math>\bar T^m_k</math> wynosi <math>k^{-(2m+2)}</math>. Rzeczywiście, | ||
sprawdziliśmy, że jest to prawdą dla <math> | sprawdziliśmy, że jest to prawdą dla <math>m=0,1</math>. Niech <math>m\ge 2</math>. | ||
Postępując indukcyjnie dla <math> | Postępując indukcyjnie dla <math>s=1,2,\ldots,m</math> mamy | ||
<center><math>\ | <center><math>\begin{align} S(f)\,-\,\bar T^s_k(f) \;=\; | ||
\frac{ 4^s(S(f)-\bar T^{s-1}_{2k}(f))- | \frac{ 4^s(S(f)-\bar T^{s-1}_{2k}(f))- | ||
(S(f)-\bar T^{s-1}_k(f)) }{ 4^s\,-\,1 } | (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}+ | &&=\; \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. \\ | c_{m+1,2k}^{(s-1)}(f)(2k)^{-(2m+2)}\right)\right. \\ | ||
Linia 521: | Linia 502: | ||
&&=\; \sum_{i=s+1}^m c_i^{(s)}(f)k^{-2i}\,+\, | &&=\; \sum_{i=s+1}^m c_i^{(s)}(f)k^{-2i}\,+\, | ||
c_{m+1,k}^{(s)}(f)k^{-(2m+2)}, | c_{m+1,k}^{(s)}(f)k^{-(2m+2)}, | ||
\ | \end{align}</math></center> | ||
ponieważ współczynniki przy <math> | ponieważ współczynniki przy <math>k^{-2s}</math> redukują się. | ||
<math> | <math>c_i^{(s)}(f)</math> są tutaj pewnymi nowymi stałymi, a | ||
<math> | <math>c_{m+1,k}^{(s)}(f)</math> może być w klasie <math>F^{2m+1}_M([a,b])</math> | ||
ograniczona przez stałą niezależną od <math> | ograniczona przez stałą niezależną od <math>f</math>. Ostatecznie, dla | ||
<math> | <math>s=m</math> mamy więc | ||
<center><math> | <center><math>S(f)\,-\,\bar T^m_k(f)\,=\,c_{m+1,k}^{(m)}(f)k^{-(2m+2)} | ||
</math></center> | </math></center> | ||
i w klasie <math> | i w klasie <math>F^{2m+1}_M([a,b])</math> | ||
<center><math> | <center><math>|S(f)\,-\,\bar T^m_k(f)|\,\le\,c_m\, k^{-(2m+2)} | ||
</math></center> | </math></center> | ||
dla pewnej stałej <math> | dla pewnej stałej <math>c_m</math> niezależnej od <math>f</math>. | ||
Zauważmy jeszcze, że <math> | Zauważmy jeszcze, że <math>\bar T^m_k</math> wykorzystuje | ||
<math> | <math>n=k2^m+1</math> wartości <math>f</math> w punktach równoodległych | ||
na <math> | na <math>[a,b]</math>, co oznacza, że w terminach <math>n</math> rząd | ||
zbieżności wynosi też <math> | zbieżności wynosi też <math>n^{-(2m+2)}</math>, a więc jest | ||
optymalny w klasie <math> | optymalny w klasie <math>F^{2m+1}_M([a,b])</math>. | ||
Kwadratury <math> | Kwadratury <math>\bar T^s_k</math> nazywane są <strong>kwadraturami | ||
Romberga</strong>. Dla danej funkcji <math> | Romberga</strong>. Dla danej funkcji <math>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> | <center><math> | ||
\begin{array} {cccccc} | \begin{array} {cccccc} | ||
\bar T^0_1(f) \\ | \bar T^0_1(f) \\ | ||
Linia 568: | Linia 549: | ||
==Kwadratury adaptacyjne== | ==Kwadratury adaptacyjne== | ||
jak wcześniej zauważyliśmy, błąd kwadratury prostej zależy m.in. od wielkości pochodnej <math> | jak wcześniej zauważyliśmy, błąd kwadratury prostej zależy m.in. od wielkości pochodnej <math>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>|f^{(r+1)}(x)|</math> jest "duża" i rzadszego tam, gdzie <math>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>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>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 | Metody uzależniające swoje działanie od konkretnego zadania, które | ||
Linia 579: | Linia 560: | ||
w problemie numerycznego całkowania. | w problemie numerycznego całkowania. | ||
Niech, tak jak poprzednio, <math> | Niech, tak jak poprzednio, <math>\bar P_k</math> będzie złożoną kwadraturą Simpsona | ||
z równym podziałem przedziału całkowania na <math> | z równym podziałem przedziału całkowania na <math>k</math> podprzedziałów, zastosowaną | ||
na odcinku <math> | na odcinku <math>[a,b]</math>. W szczególności, <math>\bar P_1=P</math> jest prostą kwadraturą | ||
Simpsona. Wtedy | Simpsona. Wtedy | ||
<center><math> | <center><math> | ||
S(f)-\bar P_2(f)\,=\,-\frac{(b-a)^5}{2280\cdot 2^4}f^{(4)}(\xi_2) | S(f)-\bar P_2(f)\,=\,-\frac{(b-a)^5}{2280\cdot 2^4}f^{(4)}(\xi_2)</math>,</center> | ||
</math></center> | |||
oraz | oraz | ||
<center><math>\ | <center><math>\begin{align} \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), | &= \frac{(b-a)^5}{2280}\left(f^{(4)}(\xi_1)-\frac 1{16}f^{(4)}(\xi_2)\right), | ||
\ | \end{align}</math></center> | ||
<math> | <math>\xi_1,\xi_2\in [a,b]</math>. Załóżmy teraz, że <math>f^{(4)}</math> ma stały znak na <math>[a,b]</math> oraz | ||
przedział ten jest na tyle mały, że <math> | przedział ten jest na tyle mały, że <math>f^{(4)}</math> jest "prawie stała". Wtedy | ||
<math> | <math>f^{(4)}(\xi_1)-f^{(4)}(\xi_2)/16\approx 15\cdot f^{(4)}(\xi_2)/16</math>, a stąd | ||
otrzymujemy <strong>estymator błędu</strong> | otrzymujemy <strong>estymator błędu</strong> | ||
<center><math> | <center><math> | ||
S(f) - \bar P_2(f) \approx -\frac{1}{15}\cdot (\bar P_1(f) -\bar P_2(f)) | S(f) - \bar P_2(f) \approx -\frac{1}{15}\cdot (\bar P_1(f) -\bar P_2(f))</math></center> | ||
</math></center> | |||
Ta przybliżona równość jest podstawą adaptacyjnej kwadratury Simpsona, może | Ta przybliżona równość jest podstawą adaptacyjnej kwadratury Simpsona, może | ||
bowiem posłużyć do oszacowania błędu na podprzedziałach. | 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> | Załóżmy teraz, że chcemy obliczyć wartość całki z dokładnością <math>\varepsilon>0</math>. | ||
Obliczamy <math> | Obliczamy <math>\bar P_1(f)</math>, <math>\bar P_2(f)</math> i sprawdzamy, czy | ||
<math> | <math>|\bar P_1(f)-\bar P_2(f)|/15\le\varepsilon</math>. Jeśli tak, to <math>\bar P_2(f)</math> jest ostateczną aproksymacją całki na <math>[a,b]</math>, a jeśli nie, to dzielimy przedział na dwa podprzedziały <math>[a,(a+b)/2]</math> i <math>[(a+b)/2,b]</math> i powtarzamy procedurę dla obu podprzedziałów z tolerancją błędu <math>\varepsilon/2</math>. | ||
Cały proces można zgrabnie zapisać za pomocą funkcji rekurencyjnej. | Cały proces można zgrabnie zapisać za pomocą funkcji rekurencyjnej. | ||
Linia 624: | Linia 603: | ||
Zauważmy, że funkcja ta zakończy działanie. Rzeczywiście, na podprzedziale | Zauważmy, że funkcja ta zakończy działanie. Rzeczywiście, na podprzedziale | ||
długości <math> | długości <math>h</math> chcemy obliczać całkę z dokładnością <math>\varepsilon h/(b-a)</math>, a ponieważ różnica <math>|P1-P2|</math> jest rzędu <math>h^5</math>, kryterium kończenia procedury będzie spełnione dla każdego <math>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 | Trochę gorzej sprawa przedstawia się z błędem. Algorytm bazuje bowiem na | ||
jego estymatorze. Jeśli po zakończeniu algorytmu mamy podział na podprzedziały <math> | jego estymatorze. Jeśli po zakończeniu algorytmu mamy podział na podprzedziały <math>a=x_0<x_1<\cdots <x_n=b</math> oraz estymator działa poprawnie na każdym podprzedziale, to błąd można w przybliżeniu oszacować przez | ||
<center><math> | <center><math>\sum_{j=1}^n\varepsilon\cdot\frac{x_j-x_{j-1}}{b-a}\,=\,\varepsilon</math></center> | ||
</math></center> | |||
Z drugiej strony, możemy czasem trafić wyjątkowo "złośliwą" funkcję. Np. jeśli <math> | Z drugiej strony, możemy czasem trafić wyjątkowo "złośliwą" funkcję. Np. jeśli <math>f(a+j(b-a)/4)=0</math> dla <math>0\le j\le 4</math>, to już na początku estymator (fałszywie!) twierdzi, że błąd jest zerowy i kwadratura 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 całkowania== | ==Uwarunkowanie całkowania== | ||
Linia 640: | Linia 618: | ||
{{twierdzenie|O uwarunkowaniu zadania całkowania|O uwarunkowaniu zadania całkowania| | {{twierdzenie|O uwarunkowaniu zadania całkowania|O uwarunkowaniu zadania całkowania| | ||
Niech <math> | Niech <math>f</math> będzie funkcją całkowalną. Wtedy | ||
<center><math> | <center><math>\mbox{cond} _{abs}(S,f) = 1 | ||
</math></center> | </math></center> | ||
oraz | oraz | ||
<center><math> | <center><math>\mbox{cond} _{rel}(S,f) = \frac{S(|f|)}{|S(f)|}</math>,</center> | ||
</math></center> | |||
gdzie błąd argumentu liczymy w normie <math> | gdzie błąd argumentu liczymy w normie <math>||f|| = \int_a^b|f(x)|\, dx</math>. | ||
}} | }} | ||
{{dowod||| | {{dowod||| | ||
Biorąc zaburzoną funkcję <math> | Biorąc zaburzoną funkcję <math>\tilde{f}</math> taką, że <math>||\tilde{f} - f||\leq \epsilon</math> mamy | ||
<center><math> | <center><math>|S(\tilde{f}) - S(f)| = |\int_a^b (\tilde{f} - f)(x) \, dx| \leq \epsilon</math>,</center> | ||
</math></center> | |||
skąd wynika teza. | skąd wynika teza. | ||
Linia 668: | Linia 644: | ||
W Octave dostępne są jedynie procedury całkujące funkcje skalarne jednej | W Octave dostępne są jedynie procedury całkujące funkcje skalarne jednej | ||
zmiennej na odcinku: | zmiennej na odcinku: | ||
<center><math> | <center><math> | ||
I = \int_a^b f(x)\, dx | I = \int_a^b f(x)\, dx</math></center> | ||
</math></center> | |||
Robi | Robi | ||
Linia 679: | Linia 654: | ||
<div class="solution" style="margin-left,margin-right:3em;"> | <div class="solution" style="margin-left,margin-right:3em;"> | ||
Przypuśćmy, że chcemy obliczyć całkę <math> | Przypuśćmy, że chcemy obliczyć całkę <math>I = \int_0^1 F(x)\, dx</math>, | ||
gdzie np. <math> | gdzie np. <math>F(x) = \sin(23x) + (1-x^2)^{-1/2}</math>. W tym celu najpierw | ||
implementujemy <math> | implementujemy <math>F</math> w Octave: | ||
<div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre>function y = F(x) | <div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre>function y = F(x) | ||
Linia 688: | Linia 663: | ||
</pre></div> | </pre></div> | ||
Aby teraz obliczyć całkę <math> | Aby teraz obliczyć całkę <math>I = \int_0^1 F(x)\, dx</math>, wystarczy wywołać | ||
<div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre>I = quad("F", 0, 1); | <div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre>I = quad("F", 0, 1); | ||
Linia 700: | Linia 675: | ||
całki: | całki: | ||
<center><math> | <center><math> | ||
|I - | |I - {quad(...)}| \leq max \{\text{ATOL}, \text{RTOL}\cdot I\} | ||
</math></center> | </math></center> | ||
z wartościami <math> | z wartościami <math>\text{ATOL = 1e-3}</math> i <math>\text{RTOL = 1e-6}</math>, to wywołamy funkcję | ||
przekazując jej te parametry następująco: | przekazując jej te parametry następująco: | ||
Linia 717: | Linia 692: | ||
<blockquote style="background-color: #fefeee; padding:1em; margin-left,margin-right:2em; margin-top,margin-bottom: 1em;"> Jeśli chcemy wyznaczyć wartość całki z błędem bezwzględnym na | <blockquote style="background-color: #fefeee; padding:1em; margin-left,margin-right:2em; margin-top,margin-bottom: 1em;"> Jeśli chcemy wyznaczyć wartość całki z błędem bezwzględnym na | ||
poziomie <math> | poziomie <math>10^{-6}</math>, ustawimy -- na wszelki wypadek -- | ||
<code style="color: #006">ATOL = 1e-7</code>, a nie, prostodusznie, | <code style="color: #006">ATOL = 1e-7</code>, a nie, prostodusznie, | ||
<code style="color: #006">ATOL = 1e-6</code>... Musimy także pamiętać, że choć są bardzo mało | <code style="color: #006">ATOL = 1e-6</code>... Musimy także pamiętać, że choć są bardzo mało | ||
Linia 737: | Linia 712: | ||
| Typ całki || Procedura QUADPACKa | | Typ całki || Procedura QUADPACKa | ||
|- | |- | ||
| <math> | | <math>\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> | | <math>\int_{-\infty}^{\infty} f(x)</math> || <code style="color: #903">DQAGI</code> | ||
|- | |- | ||
| <math> | | <math>\int_a^b f(x)\cos(\omega x)</math> || <code style="color: #903">DQAWO</code> | ||
|- | |- | ||
| <math> | | <math>\int_a^b \dfrac{f(x)}{x-c}</math> || <code style="color: #903">DQAWC</code> | ||
|- | |- | ||
| | | | ||
Linia 751: | Linia 726: | ||
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> | * 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>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. 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. | * 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. | ||
Linia 824: | Linia 799: | ||
Z zadaniem numerycznego różniczkowania zadanej funkcji spotykamy się często w numeryce. Rzeczywiście, jeśli przypomnimy sobie [[MN02#Metoda siecznych|metodę siecznych]], była to po prostu metoda Newtona, w której pochodną przybliżono pewnym ilorazem różnicowym: | Z zadaniem numerycznego różniczkowania zadanej funkcji spotykamy się często w numeryce. Rzeczywiście, jeśli przypomnimy sobie [[MN02#Metoda siecznych|metodę siecznych]], była to po prostu metoda Newtona, w której pochodną przybliżono pewnym ilorazem różnicowym: | ||
<center><math> | <center><math>x_{k+1} = x_k - \frac{f(x_k)}{g_k}</math>,</center> | ||
</math></center> | |||
gdzie <center><math> | gdzie <center><math>g_k = \frac{f(x_k)-f(x_{k-1})}{x_k - x_{k-1}} \approx f'(x_k)</math>.</center> | ||
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ąć | 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ąć | ||
<center><math> | <center><math> | ||
g_k = \frac{f(x_k+h)-f(x_k)}{h} | g_k = \frac{f(x_k+h)-f(x_k)}{h} | ||
</math></center> | </math></center> | ||
dla dostatecznie małego <math> | dla dostatecznie małego <math>h</math>. | ||
Podobne formuły są także konieczne do konstrukcji metod numerycznego rozwiązywania [[Analiza matematyczna_2/Wykład 14:_Przegląd_metod_całkowania_równań_różniczkowych_zwyczajnych|równań różniczkowych]], gdzie w naturalny sposób pojawia się konieczność operowania pochodną nieznanej funkcji. | Podobne formuły są także konieczne do konstrukcji metod numerycznego rozwiązywania [[Analiza matematyczna_2/Wykład 14:_Przegląd_metod_całkowania_równań_różniczkowych_zwyczajnych|równań różniczkowych]], gdzie w naturalny sposób pojawia się konieczność operowania pochodną nieznanej funkcji. | ||
Linia 840: | Linia 814: | ||
==Metody różnicowe== | ==Metody różnicowe== | ||
Rozważmy najprostszy sposób aproksymacji pochodnej <math> | Rozważmy najprostszy sposób aproksymacji pochodnej <math>f'(x)</math>, oparty na <strong>różnicy dzielonej w przód</strong>, gdyż ze wzoru Taylora | ||
<center><math> | <center><math>f(x+h) = f(x) + f'(x)h + O(h^2)</math>,</center> | ||
</math></center> | |||
pomijając człony rzędu <math> | pomijając człony rzędu <math>h^2</math>, dostajemy przybliżenie | ||
<center><math> | <center><math>f'(x) \approx \frac{f(x+h)-f(x)}{h}</math>,</center> | ||
</math></center> | |||
a dokładniej, | a dokładniej, | ||
<center><math> | <center><math>f'(x) = \frac{f(x+h)-f(x)}{h} + O(h)</math></center> | ||
</math></center> | |||
Podobną jakość aproksymacji dostaniemy, biorąc <strong>różnicę dzieloną w tył</strong>, | Podobną jakość aproksymacji dostaniemy, biorąc <strong>różnicę dzieloną w tył</strong>, | ||
<center><math> | <center><math>f'(x) = \frac{f(x)-f(x-h)}{h} + O(h)</math></center> | ||
</math></center> | |||
Nietrudno przekonać się, że wzięcie średniej arytmetycznej tych dwóch aproksymacji daje tzw. <strong>różnicę centralną</strong>, która ma wyższy rząd aproksymacji, gdyż | Nietrudno przekonać się, że wzięcie średniej arytmetycznej tych dwóch aproksymacji daje tzw. <strong>różnicę centralną</strong>, która ma wyższy rząd aproksymacji, gdyż | ||
<center><math> | <center><math>f'(x) = \frac{f(x+h)-f(x-h)}{2h} + O(h^2)</math>,</center> | ||
</math></center> | |||
co znaczy, że dwukrotnie zmniejszając <math> | co znaczy, że dwukrotnie zmniejszając <math>h</math>, powinniśmy się spodziewać aż czterokrotnego zmniejszenia błędu aproksymacji pochodnej! | ||
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 <math> | 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 <math>w_n</math> będzie wielomianem interpolującym funkcję <math>f</math> w parami różnych węzłach <math>x_0< \cdots < x_n</math>, tzn. | ||
<center><math> | <center><math> | ||
w_n(x) = \sum_{i=0}^{n}f(x_i) l_i(x) | w_n(x) = \sum_{i=0}^{n}f(x_i) l_i(x)</math>,</center> | ||
</math></center> | |||
gdzie <math> | gdzie <math>l_i(x)</math> są [[MN09#Baza Lagrange'a (kanoniczna)|wielomianami bazowymi Lagrange'a]]. Wtedy | ||
<center><math> | <center><math> | ||
f'(x) \approx w_n'(x) = \sum_{i=0}^{n}f(x_i) l_i'(x) | f'(x) \approx w_n'(x) = \sum_{i=0}^{n}f(x_i) l_i'(x)</math>,</center> | ||
</math></center> | |||
przy czym można wykazać, że zachodzi | przy czym można wykazać, że zachodzi | ||
Linia 883: | Linia 850: | ||
{{twierdzenie|O błędzie aproksymacji pochodnej za pomocą pochodnej wielomianu interpolacyjnego|O błędzie aproksymacji pochodnej za pomocą pochodnej wielomianu interpolacyjnego| | {{twierdzenie|O błędzie aproksymacji pochodnej za pomocą pochodnej wielomianu interpolacyjnego|O błędzie aproksymacji pochodnej za pomocą pochodnej wielomianu interpolacyjnego| | ||
Niech <math> | Niech <math>w_n</math> będzie wielomianem interpolującym funkcję <math>f\in C^{n+2}[a,b]</math> w równoodległych węzłach <math>a, a+h, a+2h, \ldots, b</math>, gdzie <math>h = (b-a)/n</math>. Wtedy zachodzi | ||
<center><math> | <center><math> | ||
f'(x) - w_n'(x) = O(h^n) \quad \forall x\in [a,b] | f'(x) - w_n'(x) = O(h^n) \quad \forall x\in [a,b] | ||
</math></center> | </math></center> | ||
Linia 891: | Linia 858: | ||
Wszystkie wprowadzone powyżej metody interpolacji oparte na wielomianie Taylora w rzeczywistości dadzą się sprowadzić do pochodnej wielomianu interpolacyjnego. Rzeczywiście, | 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 <math> | * różnica w przód to aproksymacja <math>f'(x)</math> pochodną wielomianu opartego na węzłach <math>x</math> i <math>x+h</math>, | ||
* różnica w tył to aproksymacja <math> | * różnica w tył to aproksymacja <math>f'(x)</math> pochodną wielomianu opartego na węzłach <math>x</math> i <math>x-h</math>, | ||
* różnica centralna to aproksymacja <math> | * różnica centralna to aproksymacja <math>f'(x)</math> pochodną wielomianu opartego na węzłach <math>x-h</math> i <math>x+h</math>; 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ę pochodnej, przykładowo, | Łatwo także --- korzystając z powyższego --- wyprowadzić nowe wzory na aproksymację pochodnej, przykładowo, | ||
<center><math> | <center><math>f'(x) = \frac{1}{2h} ( 3f(x) - 4f(x-h) + f(x-2h)) + O(h^2) | ||
</math></center> | </math></center> | ||
korzysta tylko z wartości <math> | korzysta tylko z wartości <math>f</math> na lewo od <math>x</math> (jest to więc ''różniczkowanie wstecz'') i też daje kwadratową aproksymację. | ||
Analogicznie możemy aproksymować pochodne wyższych rzędów, np. | Analogicznie możemy aproksymować pochodne wyższych rzędów, np. | ||
<center><math> | <center><math>f''(x) = \frac{f(x-h) - 2f(x) + f(x+h)}{h^2} + O(h^2)</math></center> | ||
</math></center> | |||
Tę formułę możemy znów uzyskać na wiele sposobów: | Tę formułę możemy znów uzyskać na wiele sposobów: | ||
* wprost ze wzoru Taylora, raz dla <math> | * wprost ze wzoru Taylora, raz dla <math>f(x+h)</math>, a raz dla <math>f(x-h)</math>, | ||
* jako drugą pochodną wielomianu interpolacyjnego, | * 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 <math> | * jako złożenie różnicy dzielonej w przód z różnicą dzieloną w tył (co ma naśladować matematyczną zależność, że <math>f''(x) = (f'(x))'</math>. | ||
Namawiamy czytelnika do sprawdzenia, że faktycznie powyższy wzór można tak wyprowadzić. | Namawiamy czytelnika do sprawdzenia, że faktycznie powyższy wzór można tak wyprowadzić. | ||
Linia 917: | Linia 883: | ||
===Różniczkowanie wielomianu algorytmem Hornera=== | ===Różniczkowanie wielomianu algorytmem Hornera=== | ||
Jak widać z powyższego, warto jest umieć rozwiązać następujące ogólne zagadnienie: mając zadany wielomian interpolacyjny, znaleźć jego pochodną w punkcie <math> | Jak widać z powyższego, warto jest umieć rozwiązać następujące ogólne zagadnienie: mając zadany wielomian interpolacyjny, znaleźć jego pochodną w punkcie <math>x</math>. Okazuje się, że do tego znakomicie nadaje się [[|algorytm Hornera]]. | ||
--> | --> | ||
==Uwarunkowanie różniczkowania== | ==Uwarunkowanie różniczkowania== | ||
W przeciwieństwie do [[#Uwarunkowanie całkowania|całkowania]], zadanie różniczkowania jest <strong>źle postawione</strong> ze względu na zaburzenie funkcji, gdy jako dopuszczalne zaburzenia przyjmiemy dowolne funkcje różniczkowalne bliskie danej funkcji w sensie normy jednostajnej. Rzeczywiście, jeśli <math> | W przeciwieństwie do [[#Uwarunkowanie całkowania|całkowania]], zadanie różniczkowania jest <strong>źle postawione</strong> ze względu na zaburzenie funkcji, gdy jako dopuszczalne zaburzenia przyjmiemy dowolne funkcje różniczkowalne bliskie danej funkcji w sensie normy jednostajnej. Rzeczywiście, jeśli <math>\tilde{f}</math> jest różniczkowalna, to mimo, że <math>||\tilde{f} -f||_{C(a,b)} \leq \epsilon</math>, wyrażenie | ||
<math> | <math>||\tilde{f}' -f'||_{C(a,b)}</math> nie jest ograniczone. Ten fakt jest źródłem praktycznych kłopotów z numerycznym przybliżaniem pochodnej, gdy np. próbujemy numerycznie różniczkować dane empiryczne: ich błąd często jest funkcją szybkozmienną. | ||
==Kłopoty numeryczne z różniczkowaniem== | ==Kłopoty numeryczne z różniczkowaniem== | ||
Rozważmy przykładowo różnicę w przód dla <math> | Rozważmy przykładowo różnicę w przód dla <math>h>0</math>. Gdyby arytmetyka której używamy miała nieskończoną precyzję, to oczywiście zachodzi | ||
<center><math> | <center><math>\frac{f(x+h)-f(x)}{h} - f'(x) = O(h)</math>,</center> | ||
</math></center> | |||
i przybliżenie byłoby tym lepsze, im mniejsze byłoby <math> | i przybliżenie byłoby tym lepsze, im mniejsze byłoby <math>h</math>. Jednak w praktyce tak nie będzie, ze względu na fakt, że działamy w arytmetyce skończonej precyzji: | ||
* dla małych <math> | * dla małych <math>h</math>, mamy <math>f(x+h) -f(x) \approx 0</math>, a więc zachodzi duże ryzyko utraty cyfr przy odejmowaniu | ||
* dla małych <math> | * dla małych <math>h</math>, może zdarzyć się, że numerycznie <math>fl_\nu(x+h) = fl_\nu(x)</math> i w konsekwencji <math>fl_\nu(\frac{f(x+h)-f(x)}{h}) = 0</math>. | ||
Można więc postawić sobie pytanie, jak dobrać <math> | Można więc postawić sobie pytanie, jak dobrać <math>h</math> na tyle małe, by mieć możliwie dobrą aproksymację <math>f'(x)</math>, 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 <math> | Przypuśćmy, że zamiast <math>f(x)</math> wyznaczane jest <math>\tilde{f}(x) = f(x)+\epsilon_x</math>, przy czym <math>|\epsilon_x| \leq \epsilon</math>. Jak dobrać do <math>\epsilon</math> parametr <math>h</math> w taki sposób, by aproksymacja <center><math>\frac{\tilde{f}(x+h)-\tilde{f}(x)}{h} \approx f'(x)</math></center> | ||
była jak najlepsza? | była jak najlepsza? | ||
Mamy: | Mamy: | ||
<center><math>\ | <center><math>\begin{align} \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 | &\leq | ||
\left| \frac{ f(x+h) - f(x)}{h} - f'(x)\right| + \frac{2\epsilon}{h} | \left| \frac{ f(x+h) - f(x)}{h} - f'(x)\right| + \frac{2\epsilon}{h} | ||
\ | \end{align}</math></center> | ||
Ponieważ pierwszy człon wyrażenia daje się oszacować (dla dostatecznie regularnej funkcji <math> | Ponieważ pierwszy człon wyrażenia daje się oszacować (dla dostatecznie regularnej funkcji <math>f</math>) przez <math>C\cdot h</math>, to ostatecznie dostajemy | ||
<center><math> | <center><math>\left| \frac{\tilde{f}(x+h)-\tilde{f}(x)}{h} - f'(x) \right| \leq C_1(h + \frac{1}{h})</math></center> | ||
</math></center> | |||
Wyrażenie po prawej stronie jest minimalizowane dla <math> | Wyrażenie po prawej stronie jest minimalizowane dla <math>h = \sqrt{\epsilon}</math> i stąd inżynierska reguła: | ||
<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> | Jeśli chcesz używać różnicy w przód, powinieneś wziąć <math>h</math> równe co najmniej <math>\sqrt{\epsilon_{ \mbox{mach} }}</math>. | ||
</blockquote> | </blockquote> | ||
==Literatura== | ==Literatura== |
Aktualna wersja na dzień 21:44, 11 wrz 2023
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
gdzie , a należy do pewnej klasy funkcji rzeczywistych określonych i całkowalnych w sensie Riemanna na całym przedziale .
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 , a w niektórych przypadkach również jej pochodnych, o ile istnieją. Dokładna całka będzie więc w ogólności przybliżana wartością , która zależy tylko od wartości i ewentualnie jej pochodnych w skończonej liczbie punktów.
Kwadratury
Kwadraturami nazywamy funkcjonały liniowe postaci
albo ogólniej
gdzie są punktami z , a (albo ) 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 (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 , 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ę opartą na węzłach o łącznej krotności nazywamy interpolacyjną, jeśli
gdzie jest wielomianem interpolacyjnym funkcji stopnia co najwyżej , 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 , otrzymujemy
a stąd i z postaci ,
.
Podamy teraz kilka przykładów.
Kwadratura prostokątów jest oparta na jednym węźle ,

Kwadratura trapezów jest oparta na jednokrotnych węzłach , i jest równa polu odpowiedniego trapezu,

Kwadratura parabol (Simpsona) jest oparta na jednokrotnych węzłach , , , i jest równa polu pod parabolą interpolującą w tych węzłach,
Zauważmy, że kwadratury trapezów i parabol są oparte na węzłach jednokrotnych i równoodległych, przy czym i . Ogólnie, kwadratury interpolacyjne oparte na węzłach równoodległych , , nazywamy kwadraturami Newtona--Cotesa.
Błąd kwadratur interpolacyjnych
Zajmiemy się teraz błędem kwadratur interpolacyjnych. Przypomnijmy, że oznacza klasę funkcji razy różniczkowalnych w sposób ciągły i takich, że , .
Twierdzenie O błędzie kwadratur interpolacyjnych
Niech będzie kwadraturą interpolacyjną opartą na (jednokrotnych lub wielokrotnych) węzłach , . Jeśli , to
W klasie maksymalny błąd kwadratury wynosi
Dowód
Korzystając ze znanego nam już wzoru na błąd interpolacji wielomianowej, mamy
Stąd, jeśli , to
Ograniczenie górne w dokładnej formule na błąd w klasie wynika bezpośrednio. Aby pokazać ograniczenie dolne zauważmy, że dla funkcji takiej, że przyjmuje na przedziałach , , , naprzemiennie wartości i mamy
Co prawda, nie jest w , ale może być dla dowolnego przybliżana funkcjami w ten sposób, że całka
Zapisując mamy
co wobec dowolności daje dowód twierdzenia.

W szczególnych przypadkach kwadratur trapezów i parabol możemy otrzymać innego rodzaju formuły na błąd.
Twierdzenie O postaci błędu kwadratury trapezów i Simpsona
Jeśli , to dla kwadratury trapezów mamy
Jeśli , to dla kwadratury parabol mamy
().
Dowód
Najpierw udowodnimy część dotyczącą kwadratury trapezów. Ze wzoru na błąd kwadratury,
Ponieważ funkcja jest ciągła, a wielomian przyjmuje jedynie wartości nieujemne, można zastosować twierdzenie o wartości średniej dla całki, aby otrzymać
dla pewnych .
Teraz zajmiemy się kwadraturą parabol. Niech i będą wielomianami interpolacyjnymi funkcji odpowiednio dla węzłów oraz . Wtedy
Wobec
mamy
Stąd i ze wzoru na błąd interpolacji Hermite'a otrzymujemy
Ponieważ wielomian jest niedodatni na , możemy znów zastosować twierdzenie o wartości średniej. Mamy
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 .

Zobacz biografię
Prostym przykładem kwadratury złożonej jest suma Riemanna,
gdzie oraz . Jeśli średnica podziału, , maleje do zera, to .
Będziemy rozpatrywać kwadratury złożone postaci
gdzie jest kawałkami wielomianem. Dokładniej, dla danego kładziemy , , a następnie dla każdego wybieramy dowolne węzły , . Wtedy jest na każdym przedziale wielomianem interpolacyjnym funkcji stopnia co najwyżej opartym na węzłach . Kwadratura korzysta z węzłów o łącznej krotności .
Twierdzenie O błędzie kwadratur złożonych
Błąd kwadratury złożonej w klasie jest ograniczony przez
gdzie
Dowód
Twierdzenie to jest bezpośrednim wnioskiem z twierdzenia o błędzie kwadratur interpolacyjnych. Mamy bowiem
co kończy dowód.

W klasie , błąd kwadratur złożonych jest rzędu . Można pokazać, że błąd każdej innej metody całkowania korzystającej jedynie z wartości funkcji w punktach nie może w klasie maleć szybciej niż . 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 i parabol . Powstają one przez zastosowanie na każdym przedziale odpowiednio kwadratur trapezów i parabol .

Jak łatwo się przekonać,
oraz
Twierdzenie O postaci błędu złożonych kwadratur trapezów i Simpsona
Jeśli , to
Jeśli , to
Dowód
Kwadratura parabol ma więc optymalny rząd zbieżności nie tylko w klasie , ale też w .
Przyspieszanie zbieżności kwadratur
W praktyce często stosuje się obliczanie kwadratur poprzez zagęszczanie podziału przedziału . Na przykład, dla złożonej kwadratury trapezów zachodzi następujący wygodny wzór rekurencyjny:
Pozwala on obliczyć na podstawie poprzez "doliczenie" wartości funkcji w punktach "gęstszej" siatki. W ten sposób możemy obserwować zachowanie się kolejnych przybliżeń () całki . Jest to szczególnie istotne wtedy, gdy nie mamy żadnej informacji a priori o , a przez to nie potrafimy oszacować liczby 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ż . Okazuje się jednak, że kwadratury 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.

Zobacz biografię

Zobacz biografię
Lemat Formuła Eulera-Maclaurina
Dla funkcji , błąd złożonej kwadratury trapezów wyraża się wzorem
gdzie , , a są pewnymi stałymi liczbowymi. Mamy , i, ogólnie, , gdzie są tzw. liczbami Bernoulliego.
Dowód tego lematu pominiemy.
Formułę Eulera-Maclaurina można przepisać w postaci
gdzie , , oraz . Zauważmy przy tym, że jeśli , to współczynniki są wspólnie ograniczone przez .
Definiując teraz kwadraturę
dla mamy
gdzie i jest wspólnie ograniczone dla . Kwadratura ma więc optymalny w rząd zbieżności . Proces ten można kontynuować dalej tworząc kolejne kwadratury o coraz to wyższym rzędzie zbieżności. Dokładniej, połóżmy oraz, dla ,
Wtedy, dla , rząd zbieżności kwadratury wynosi . Rzeczywiście, sprawdziliśmy, że jest to prawdą dla . Niech . Postępując indukcyjnie dla mamy
ponieważ współczynniki przy redukują się. są tutaj pewnymi nowymi stałymi, a może być w klasie ograniczona przez stałą niezależną od . Ostatecznie, dla mamy więc
i w klasie
dla pewnej stałej niezależnej od .
Zauważmy jeszcze, że wykorzystuje wartości w punktach równoodległych na , co oznacza, że w terminach rząd zbieżności wynosi też , a więc jest optymalny w klasie .
Kwadratury nazywane są kwadraturami Romberga. Dla danej funkcji można je łatwo konstruować, budując następującą tablicę trójkątną:
której kolumny tworzone są zgodnie z powyższymi wzorami.
Kwadratury adaptacyjne
jak wcześniej zauważyliśmy, błąd kwadratury prostej zależy m.in. od wielkości pochodnej 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 jest "duża" i rzadszego tam, gdzie 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 . Okazuje się, że mimo wszystko nie stoimy na straconej pozycji. Algorytm obliczający całkę dysponuje na każdym pewną dodatkową informacją o 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, będzie złożoną kwadraturą Simpsona z równym podziałem przedziału całkowania na podprzedziałów, zastosowaną na odcinku . W szczególności, jest prostą kwadraturą Simpsona. Wtedy
oraz
. Załóżmy teraz, że ma stały znak na oraz przedział ten jest na tyle mały, że jest "prawie stała". Wtedy , a stąd otrzymujemy estymator błędu
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ą . Obliczamy , i sprawdzamy, czy . Jeśli tak, to jest ostateczną aproksymacją całki na , a jeśli nie, to dzielimy przedział na dwa podprzedziały i i powtarzamy procedurę dla obu podprzedziałów z tolerancją błędu . 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 ( abs(P1-P2) < 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 chcemy obliczać całkę z dokładnością , a ponieważ różnica jest rzędu , kryterium kończenia procedury będzie spełnione dla każdego 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 jego estymatorze. Jeśli po zakończeniu algorytmu mamy podział na podprzedziały oraz estymator działa poprawnie na każdym podprzedziale, to błąd można w przybliżeniu oszacować przez
Z drugiej strony, możemy czasem trafić wyjątkowo "złośliwą" funkcję. Np. jeśli dla , to już na początku estymator (fałszywie!) twierdzi, że błąd jest zerowy i kwadratura 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 całkowania
Zadanie całkowania zadanej funkcji jest, podobnie jak zadanie sumy dwóch liczb (w końcu całkowanie ma wiele wspólnego z sumowaniem!), bardzo dobrze bezwględnie uwarunkowane, natomiast uwarunkowanie względne może być nawet patologicznie duże. Dokładniej,
Twierdzenie O uwarunkowaniu zadania całkowania
Niech będzie funkcją całkowalną. Wtedy
oraz
gdzie błąd argumentu liczymy w normie .
Dowód
W szczególności zadanie całkowania będzie źle uwarunkowane względnie, gdy wartość całki jest bliska zeru, ale sama funkcja przyjmuje duże co do modułu wartości.
Biblioteki
W Octave dostępne są jedynie procedury całkujące funkcje skalarne jednej zmiennej na odcinku:
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ę , gdzie np. . W tym celu najpierw implementujemy w Octave:
function y = F(x) y = sin(23*x)+1/sqrt(1-x^2); endfunction
Aby teraz obliczyć całkę , 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:
z wartościami i , 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 , 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.
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 |
DQNG , DQAG , DQAGS , DQAGP
| |
DQAGI
| |
DQAWO
| |
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 typudouble
(całkując funkcję 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
lubN
--- 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. 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, była to po prostu metoda Newtona, w której pochodną przybliżono pewnym ilorazem różnicowym:
gdzie
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ąć
dla dostatecznie małego .
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 , oparty na różnicy dzielonej w przód, gdyż ze wzoru Taylora
pomijając człony rzędu , dostajemy przybliżenie
a dokładniej,
Podobną jakość aproksymacji dostaniemy, biorąc różnicę dzieloną w tył,
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ż
co znaczy, że dwukrotnie zmniejszając , powinniśmy się spodziewać aż czterokrotnego zmniejszenia błędu aproksymacji pochodnej!
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 będzie wielomianem interpolującym funkcję w parami różnych węzłach , tzn.
gdzie są wielomianami bazowymi Lagrange'a. Wtedy
przy czym można wykazać, że zachodzi
Twierdzenie O błędzie aproksymacji pochodnej za pomocą pochodnej wielomianu interpolacyjnego
Niech będzie wielomianem interpolującym funkcję w równoodległych węzłach , gdzie . Wtedy zachodzi
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 pochodną wielomianu opartego na węzłach i ,
- różnica w tył to aproksymacja pochodną wielomianu opartego na węzłach i ,
- różnica centralna to aproksymacja pochodną wielomianu opartego na węzłach i ; 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ę pochodnej, przykładowo,
korzysta tylko z wartości na lewo od (jest to więc różniczkowanie wstecz) i też daje kwadratową aproksymację.
Analogicznie możemy aproksymować pochodne wyższych rzędów, np.
Tę formułę możemy znów uzyskać na wiele sposobów:
- wprost ze wzoru Taylora, raz dla , a raz dla ,
- 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 .
Namawiamy czytelnika do sprawdzenia, że faktycznie powyższy wzór można tak wyprowadzić.
Uwarunkowanie różniczkowania
W przeciwieństwie do całkowania, zadanie różniczkowania jest źle postawione ze względu na zaburzenie funkcji, gdy jako dopuszczalne zaburzenia przyjmiemy dowolne funkcje różniczkowalne bliskie danej funkcji w sensie normy jednostajnej. Rzeczywiście, jeśli jest różniczkowalna, to mimo, że , wyrażenie nie jest ograniczone. Ten fakt jest źródłem praktycznych kłopotów z numerycznym przybliżaniem pochodnej, gdy np. próbujemy numerycznie różniczkować dane empiryczne: ich błąd często jest funkcją szybkozmienną.
Kłopoty numeryczne z różniczkowaniem
Rozważmy przykładowo różnicę w przód dla . Gdyby arytmetyka której używamy miała nieskończoną precyzję, to oczywiście zachodzi
i przybliżenie byłoby tym lepsze, im mniejsze byłoby . Jednak w praktyce tak nie będzie, ze względu na fakt, że działamy w arytmetyce skończonej precyzji:
- dla małych , mamy , a więc zachodzi duże ryzyko utraty cyfr przy odejmowaniu
- dla małych , może zdarzyć się, że numerycznie i w konsekwencji .
Można więc postawić sobie pytanie, jak dobrać na tyle małe, by mieć możliwie dobrą aproksymację , 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
wyznaczane jest
, przy czym
. Jak dobrać do
parametr
w taki sposób, by aproksymacja
była jak najlepsza? Mamy:
Ponieważ pierwszy człon wyrażenia daje się oszacować (dla dostatecznie regularnej funkcji ) przez , to ostatecznie dostajemy
Wyrażenie po prawej stronie jest minimalizowane dla i stąd inżynierska reguła:
Jeśli chcesz używać różnicy w przód, powinieneś wziąć równe co najmniej .
Literatura
W celu dogłębnego zapoznania się z omawianym na wykładzie materiałem, przeczytaj rozdział 7.1 -- 7.6 w
- D. Kincaid, W. Cheney Analiza numeryczna, Wydawnictwa Naukowo-Techniczne, Warszawa 2006, ISBN 83-204-3078-X.