Całkowanie numeryczne. Metoda Simpsona

Z Henryk Dąbrowski
Wersja z dnia 19:24, 9 sty 2025 autorstwa HenrykDabrowski (dyskusja | edycje)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacji Przejdź do wyszukiwania
22.07.2022



Funkcje kawałkami klasy Cn

Uwaga F1
Czytelnik może pominąć ten temat przy pierwszym czytaniu i powrócić do niego, gdy uzna, że potrzebuje bardziej precyzyjnego ujęcia omawianych tu problemów. Z pojęcia funkcji kawałkami klasy Cn będziemy korzystali bardzo rzadko i jeśli Czytelnik chciałby jedynie poznać metodę Simpsona przybliżonego obliczania całek, to nie musi tracić czasu na zapoznawanie się z tym tematem.


Definicja F2
Funkcja f(x) jest kawałkami klasy C0 (lub kawałkami ciągła[1]) w przedziale [a,b], jeżeli jest ona zdefiniowana i ciągła wszędzie poza skończoną liczbą punktów xk[a,b]. Przy czym w każdym z punktów xk istnieją skończone granice jednostronne limxxkf(x) oraz limxxk+f(x). W przypadku, gdy xk=a musi istnieć skończona granica prawostronna, a w przypadku, gdy xk=b musi istnieć granica lewostronna.


Zadanie F3
Niech

f(x)={ax=5x5<x<0bx=0x0<x<5cx=5

Zbadać, dla jakich wartości liczb a,b,c

  • funkcja f(x) jest klasy C0([5,5])
  • funkcja f(x) jest kawałkami klasy C0([5,5])
Rozwiązanie


Zadanie F4
Pokazać, że funkcje 1x oraz sin(1x) nie są kawałkami klasy C0([5,5]).


Definicja F5
Funkcja f(x) jest kawałkami klasy C1[2] w przedziale [a,b], jeżeli jest ona kawałkami ciągła w [a,b], a jej pochodna f(x) istnieje i jest kawałkami ciągła w [a,b].

Oznacza to, że musi istnieć skończona liczba punktów a=x1<x2<<xn=b wyznaczających podział przedziału [a,b] w taki sposób, że

  • funkcja f(x) jest zdefiniowana i ciągła w każdym przedziale (xk,xk+1)
  • pochodna f(x) istnieje i jest ciągła w każdym przedziale (xk,xk+1)
  • istnieją skończone granice jednostronne funkcji f(x) i f(x) na krańcach każdego z przedziałów (xk,xk+1)


Definicja F6
Niech rZ+. Funkcja f(x) jest kawałkami klasy Cr w przedziale [a,b], jeżeli jest ona kawałkami ciągła w [a,b], a jej pochodne f(i)(x), gdzie i=1,,r istnieją i są kawałkami ciągłe w [a,b].

Oznacza to, że musi istnieć skończona liczba punktów a=x1<x2<<xn=b wyznaczających podział przedziału [a,b] w taki sposób, że

  • funkcja f(x) jest zdefiniowana i ciągła w każdym przedziale (xk,xk+1)
  • pochodne f(i)(x), gdzie i=1,,r, istnieją i są ciągłe w każdym przedziale (xk,xk+1)
  • istnieją skończone granice jednostronne funkcji f(i)(x), gdzie i=0,1,,r, na krańcach każdego z przedziałów (xk,xk+1)


Definicja F7
Funkcja f(x) jest kawałkami klasy Cr w R, jeśli jest ona kawałkami klasy Cr w każdym ograniczonym przedziale [a,b]R.


Przykład F8
Rozważmy funkcję

f(x)={05x<010<x5

Celowo nie określiliśmy wartości funkcji f(x) w punkcie x=0. Ponieważ

limx5+f(x)=limx0f(x)=0
limx0+f(x)=limx5f(x)=1

zatem spełnione są warunki definicji F2 i funkcja f(x) jest kawałkami ciągła (kawałkami klasy C0). Zauważmy, że funkcja ta jest funkcją skokową Heaviside'a[3] H(x) obciętą do przedziału [5,5].

H(x)={0x<01x1

Warto zauważyć, że wartość funkcji Heaviside'a w x=0 nie jest ustalona. Niekiedy podaje się H(0)=0, a czasami H(0)=12. Oczywiście funkcja Heaviside'a jest kawałkami klasy C0(R). Przyjmując H(0)=1, policzmy pochodne jednostronne funkcji H(x) w x=0

limh0H(0+h)H(0)h=limh001h=limh01h=+
limh0+H(0+h)H(0)h=limh0+11h=0

Czyli pochodna H(0) nie istnieje, ale granice jednostronne pochodnej w punkcie x=0 istnieją. Istotnie, dla x0 mamy H(x)=0, zatem

limx0H(x)=limx0+H(x)=0

Wynika stąd, że funkcja Heaviside'a jest kawałkami klasy C1(R).


Zadanie F9
Pokazać, że funkcja

f(x)={x2sin(1x)0<|x|50x=0
  • jest klasy C0([5,5])
  • jest różniczkowalna w całym przedziale [5,5]
  • nie jest klasy C1([5,5])
  • nie jest kawałkami klasy C1([5,5])
Rozwiązanie


Zadanie F10
Pokazać, że funkcja

f(x)={x2sin(1x)0<|x|51x=0
  • nie jest klasy C0([5,5])
  • jest kawałkami klasy C0([5,5])
  • nie jest kawałkami klasy C1([5,5])



Metoda Simpsona (parabol)

Twierdzenie F11
Jeżeli punkty (h,y0), (0,y1) oraz (h,y2) leżą na pewnej paraboli g(x), to

hhg(x)dx=h3(y0+4y1+y2)
Dowód


Twierdzenie F12
Jeżeli punkty (a,y0), (c,y1) oraz (b,y2) leżą na pewnej paraboli g(x), gdzie c=a+h, b=a+2h i h>0, to

abg(x)dx=h3(y0+4y1+y2)=ba6(y0+4y1+y2)
Dowód


Twierdzenie F13 (całkowanie przybliżone metodą Simpsona)
Jeżeli funkcja f(x) jest ciągła w przedziale [a,b], to przybliżoną wartość całki abf(x)dx możemy obliczyć ze wzoru

abf(x)dx(ba)3n[f(x0)+4f(x1)+2f(x2)+4f(x3)+2f(x4)++2f(xn2)+4f(xn1)+f(xn)]


Wzór ten możemy zapisać w zwartej postaci

abf(x)dx(ba)3n[f(x0)+4k=1n/2f(x2k1)+2k=1n/21f(x2k)+f(xn)]


gdzie n jest liczbą parzystą, a n+1 punktów xk zostało wybranych w przedziale [a,b] tak, aby

a=x0<x1<x2<<xn2<xn1<xn=b

Punkty te tworzą parzystą liczbę przedziałów [xk,xk+1], gdzie k=0,1,,n1 o takich samych szerokościach h=ban.

Dowód


Twierdzenie F14
Jeżeli funkcja f(x) jest klasy C4([a,b]), a funkcja W(x) jest równa

W(x)={112(xa)3(3xa2b)axc112(xb)3(3x2ab)c<xb

gdzie c=12(a+b), to

abf(x)dx=ba6[f(a)+4f(c)+f(b)]+16abf(4)(x)W(x)dx
Dowód


Twierdzenie F15
Niech f(x) będzie funkcją klasy C4([a,b]) i c=12(a+b). Jeżeli wartość całki abf(x)dx przybliżymy wartością całki abg(x)dx, gdzie g(x) jest parabolą przechodzącą przez punkty Pa=(a,f(a)), Pc=(c,f(c)) oraz Pb=(b,f(b)), to błąd takiego przybliżenia jest nie większy niż M(ba)52880, gdzie Mmaxaxb|f(4)(x)|.

Dowód


Twierdzenie F16 (błąd przybliżonego całkowania metodą Simpsona)
Niech f(x) będzie funkcją klasy C4([a,b]). Jeżeli policzymy przybliżoną wartość całki abf(x)dx metodą Simpsona (twierdzenie F13), to błąd takiego przybliżenia jest nie większy niż M(ba)5180n4, gdzie Mmaxaxb|f(4)(x)|.

Dowód


Uwaga F17
Niech będzie dana funkcja f(x) klasy C4([a,b]). Jeżeli obierzemy pewien stały skok h to, stosując metodę Simpsona, możemy policzyć przybliżenie I całki abf(x)dx. Wiemy, że błąd, z jakim wyliczymy wartość całki nie przekracza liczby

E=M(ba)5180n4=Mh4180(ba)=Mh4180L

gdzie Mmaxaxb|f(4)(x)|, a przez L=ba oznaczyliśmy długość przedziału [a,b].

Co się stanie, jeżeli (zachowując stały skok h) podzielimy przedział [a,b] na dowolną liczbę mniejszych przedziałów, każdy o długości lk, policzymy całki Ik oraz błędy Ek w każdym z tych mniejszych przedziałów, a następnie je zsumujemy?

Całka I będzie oczywiście sumą wyliczonych całek Ik, a całkowity błąd E będący sumą błędów Ek nie wzrośnie!

Istotnie błąd, jaki popełniamy w k-tym przedziale o długości lk, wynosi

Ek=Mkh4180lk

gdzie Mk jest ograniczeniem od góry funkcji |f(4)(x)|k-tym przedziale. Suma tych błędów jest równa

E=kMkh4180lk=h4180kMklkMh4180klk=Mh4180L

gdzie M=max(M1,M2,,Mk,) jest ograniczeniem od góry funkcji f(x) w przedziale [a,b]. Jeśli tylko dokonywaliśmy wyboru liczb Mk ograniczających od góry funkcję |f(4)(x)| na odcinkach o długości lk na tyle starannie, że prawdziwa jest nierówność

M=max(M1,M2,,Mk,)M

(co nie jest trudne, bo wystarczy przyjąć M1=M2==Mk==M), to otrzymujemy

E=Mh4180LMh4180L=E


Powyższe rozważania od razu udzielają odpowiedzi na ważne pytanie:
Co należy zrobić, jeżeli funkcja f(x) nie jest klasy C4, a jedynie jest kawałkami klasy C4? Oczywiście należy całkę zapisać jako sumę całek, z których każda jest obliczana w takim przedziale, że funkcja f(x) jest w nim klasy C4. Stosując metodę Simpsona, obliczyć całki Ik i błędy Ek w tych przedziałach, a następnie zsumować wartości całek i błędów.


Uwaga F18
Podsumowując, metoda parabol prowadzi do natępującego wzoru na przybliżoną wartość całki

abf(x)dx(ba)3n[f(x0)+4k=1n/2f(x2k1)+2k=1n/21f(x2k)+f(xn)]

Przedział całkowania [a,b] dzielimy na parzystą liczbę n przedziałów [xk1,xk] o jednakowej szerokości h=ban.

Wzór można przedstawić w postaci

abf(x)dx(ba)3n[f(a)+4k=1n/2f(a+(2k1)h)+2k=1n/21f(a+2kh)+f(b)]

Jeżeli funkcja f(x) jest klasy C4([a,b]), to błąd wartości liczbowej całki oznaczonej abf(x)dx, jaki popełniamy, stosując metodę Simpsona, nie przekracza

M(ba)5180n4

gdzie Mmaxaxb|f(4)(x)|.


Uwaga F19
Wykorzystując przedstawioną metodę parabol, możemy bez trudu napisać w PARI/GP prosty i zaskakująco dokładny program do liczenia całek oznaczonych. Parametr M jest parametrem opcjonalnym. Jeżeli jest obecny, to zostanie wyliczony błąd M(ba)5180n4, gdzie maxaxb|f(4)(x)|M. Jeżeli zostanie pominięty, to zostanie wyliczona jedynie wartość (ba)5180n4, a w wyniku pojawi się czynnik M, który ma przypominać, że liczba musi zostać pomnożona przez Mmaxaxb|f(4)(x)|, aby uzyskać wartość błędu.

Simpson(a, b, n, M = -1) =
\\ n musi być liczbą parzystą
{
local(err, h, k, S, V);
h = 1.0 * (b - a)/n;
S = f(a) + 4 * sum(k = 1, n/2, f(a + (2*k-1)*h)) + 2 * sum(k = 1, n/2 - 1, f(a + 2*k*h)) + f(b);
S = (b - a)/(3 * n) * S;
err = 1.0 * (b - a)^5 / (180 * n^4) * if( M < 0, 1, M );
V = [ S, if( M < 0, Str( "M * ", err), err ) ];
return(V);
}


Przykład F20
Przedstawimy kilka przykładowych wyników obliczeń całek nieoznaczonych przy pomocy programu Simpson(a, b, n, M)


f(x)=x2, 03f(x)dx=9
Simpson(0, 3, 2^10, 0)
[9.0000000000000000000000000000000000000, 0]


f(x)=sin(x), 0πf(x)dx=2
Simpson(0, Pi, 2^10, 1)
[2.0000000000009843683496726710086289358, 1.5462404552801947792469203606107819849 E-12]


f(x)=41+x2, 01f(x)dx=π, π=3.1415926535897932384626433832795028841971693993751
Simpson(0, 1, 2^15, 96)
[3.1415926535897932384626433832474475839, 4.6259292692714855850984652837117513021 E-19]

Po uwzględnieniu wyliczonego błędu kolorem czerwonym zaznaczono tylko te cyfry, których wartość jest pewna. W rzeczywistości jeszcze kolejnych 10 cyfr jest poprawnych.


f(x)=sin(x)x, 2π104f(x)dx=0.1527399692533334654765895125096821824796221626790438771977250903 (WolframAlpha)
Simpson(2*Pi, 10^4, 2^22, 0.13)
[0.15273996925335764945765416969734658087, 2.3263037652077992736046178707334374747 E-10]


f(x)=sin(x)log(x), 2π104f(x)dx=0.63535086286 (WolframAlpha)
Simpson(2*Pi, 10^4, 2^22, 0.46)
[0.63535086286330151753047973075030359191, 8.2315363999660589681394170810567787567 E-10]


f(x)=P1(x)x, 110f(x)dx=0.072730903361964386963200944934753807929314886310179776161039616

gdzie P1(x) jest okresową funkcją Bernoulliego. Znamy dokładny wynik, bo można pokazać, że (zobacz przykład E61)

1nP1(x)xdx=log(n!)nlogn+n12logn1

Zauważmy, że funkcja P1(x)x nie jest ciągła, ale jest kawałkami klasy C4. Zapiszmy całkę w postaci sumy całek, z których każda jest określona w przedziale [k,k+1]

110f(x)dx=110xx12xdx
=110(1x+12x)dx
=9k=19kk+1k+12xdx
=9k=19(k+12)kk+1dxx

Mamy

f(x) = 1 / x
[9, 0] - sum( k = 1, 9, (k + 1/2) * Simpson(k, k + 1, 2^20, 24/k^5) )
[-0.072730903361964386963200988526802160255, -1.7650768731492669233661475404296456609 E-25]

Zauważmy, że całka i błąd są mnożone przez czynnik (k+12) – tak, jak być powinno! Ujemny znak błędu wynika z odejmowania wyliczonego błędu od zera.


Uwaga F21
Czytelnik zapewne zwrócił uwagę, że we wszystkich przedstawionych przykładach wybieraliśmy liczbę podziałów tak, aby była potęgą liczby 2. Są ku temu dwa dobre powody

  • ułamek 12n ma skończoną reprezentację binarną, co poprawia precyzję obliczeń
  • potrzebujemy dwukrotnego wzrostu liczby podziałów, aby zmniejszyć błąd o rząd wielkości (błąd maleje 16-krotnie)




Całkowanie przybliżone pewnych całek niewłaściwych

Twierdzenie F22
Jeżeli całka af(t)dt jest zbieżna i istnieje funkcja g(t) spełniająca warunki

  • |f(t)|g(t) dla tb
  • istnieje całka nieoznaczona G(t)=g(t)dt+C
  • całka bg(t)dt jest zbieżna
  • limt+G(t)=0

gdzie b>a jest dowolnie wybraną liczbą, to przybliżona wartość całki niewłaściwej af(t)dt jest równa

af(x)dx(ba)3n[f(x0)+4k=1n/2f(x2k1)+2k=1n/21f(x2k)+f(xn)]

z błędem nie większym niż

E=M(ba)5180n4G(b)

Przy czym optymalna liczba podziałów przedziału [a,b] (dla ustalonej wartości b) wynosi

n=(ba)M36g(b)4

Odpowiada jej minimalny błąd równy

(ba)g(b)5G(b)
Dowód


Uwaga F23
Na podstawie twierdzenia F22, możemy napisać w PARI/GP program do przybliżonego liczenia całek niewłaściwych. Jeżeli parametrowi num przypiszemy wartość -1 (wartość domyślna), to zostanie wyliczona optymalna liczba podziałów

n=(ba)M36g(b)4

(czyli taka, aby błąd był najmniejszy). Jeżeli parametr num przyjmie wartość -2, to optymalna liczba podziałów n zostanie zapisana w postaci potęgi liczby 2 (o wartości najbliższej optymalnej liczbie podziałów). W przypadku, gdy parametr num jest liczbą większą od zera, będzie on użyty do obliczeń jako liczba przedziałów n.


Program jest prosty, ale wymaga (zgodnie z twierdzeniem F22) nie tylko definicji funkcji podcałkowej, ale znacznie więcej. Przed uruchomieniem programu musimy

1. zdefiniować funkcję podcałkową f(t)
2. zdefiniować liczbę M będącą oszacowaniem od góry funkcji |f(4)(t)| w przedziale [a,b]
3. zdefiniować funkcję g(t) taką, że |f(t)|g(t) dla tb
4. zdefiniować całkę nieoznaczoną G(t) funkcji g(t)
5. upewnić się, że całka bg(t)dt jest zbieżna
6. sprawdzić, czy limt+G(t)=0, a gdyby tak nie było, to zmienić definicję funkcji G(t)


Dopiero po wykonaniu tych czynności możemy uruchomić program Simproper(a, b, num).

Simproper(a, b, num = -1) =
{
local(err, h, k, n, S);
n = if( num <= 0, floor(  (b - a) * ( M/36/g(b) )^(1/4)  ), num );
n = 2 * floor( (n+1)/2 );
if( num == -2, n = 2^floor( log(n)/log(2) + 1/2 ) );
h = 1.0 * (b - a)/n;
S = f(a) + 4 * sum(k = 1, n/2, f(a + (2*k-1)*h)) + 2 * sum(k = 1, n/2 - 1, f(a + 2*k*h)) + f(b);
S = (b - a)/(3 * n) * S;
err = 1.0 * M * (b - a)^5 / (180 * n^4) - G(b);
return( [S, err] );
}

Jeżeli funkcja g(t) jest szybko zbieżna, to nie należy prowadzić obliczeń w zbyt szerokim przedziale. Program będzie usiłował zapewnić odpowiednio mały błąd wyliczanej całki i liczba podziałów przedziału [a,b] może osiągnąć ogromne wartości, a obliczenia będą bardzo czasochłonne.


Przykład F24
Rozważmy całkę 2πsin(t)t3dt.

2πsin(t)t3dt=0.0032550962148135833916711170162561745391641476739599050514576388 (WolframAlpha)

Tak dokładny rezultat jest możliwy, ponieważ

2πsin(t)t3dt=12Si(2π)π4+14π

gdzie funkcja Si(x)=0xsin(t)tdt (sinus całkowy[5][6][7]) jest funkcją specjalną i wiemy, jak obliczać jej wartości z wysoką dokładnością.


Aby skorzystać z programu Simproper(a, b, num), musimy przygotować

f(t)=sin(t)t3
g(t)=1t3
G(t)=12t2
limt+G(t)=0
Mmaxt2π|f(4)(t)| dla M=0.004


Dla różnych wartości b otrzymujemy

Simproper(2*Pi, 10^5)
[0.0032550962148146005117256508966635416723, 6.9998742421027342073324279855934715203 E-11]
Simproper(2*Pi, 3*10^5)
[0.0032550962148136208735774540186061237864, 7.7777312525236569255722454074806518694 E-12]


Przykład F25
Rozważmy całkę oznaczoną

0dtet+t=0.8063956162073262251 (WolframAlpha)

Aby skorzystać z programu Simproper(a, b, num), musimy przygotować

f(t)=1et+t
g(t)=1et
G(t)=1et
limt+G(t)=0
Mmaxt0|f(4)(t)| dla M=261


Dla różnych wartości b otrzymujemy

Simproper(0, 40)
[0.80639561620732622105189277802198625914, 3.8235099324937067671907345290643700420 E-17]
Simproper(0, 50)
[0.80639561620732622517960851949178238112, 2.1216247131181941474567287282139719553 E-21]


Zadanie F26
Policzyć wartość całki

0dtet+t2=0.818759031812863 (WolframAlpha)


Uwaga F27
Czytelnik zapewne zwrócił uwagę na ograniczony zakres stosowania twierdzenia F22. Nawet prostej całki 2πsin(t)tdt nie jesteśmy w stanie w ten sposób policzyć, bo 2πdtt jest rozbieżna. Poniżej pokażemy, jak można zwiększyć zakres stosowania tego twierdzenia. Rozpoczniemy od udowodnienia analogicznych wzorów do wzoru z twierdzenia E41. Funkcje Bernoulliego zostały zastąpione funkcjami sin(x) i cos(x).


Twierdzenie F28
Jeżeli funkcja f(t) jest klasy Cn, to

f(t)sin(t)dt=k=0n1f(k)(t)cos(t+kπ2)+f(n)(t)cos(t+(n1)π2)dt
f(t)cos(t)dt=k=0n1f(k)(t)sin(t+kπ2)f(n)(t)sin(t+(n1)π2)dt
Dowód


Uwaga F29
Z twierdzenia F28 wynika natychmiast, że prawdziwe są następujące wzory

f(t)sin(t)dt=f(t)cos(t)+f(1)(t)cos(t)dt
f(t)sin(t)dt=f(t)cos(t)+f(1)(t)sin(t)f(2)(t)sin(t)dt
f(t)sin(t)dt=f(t)cos(t)+f(1)(t)sin(t)+f(2)(t)cos(t)f(3)(t)cos(t)dt
f(t)sin(t)dt=f(t)cos(t)+f(1)(t)sin(t)+f(2)(t)cos(t)f(3)(t)sin(t)+f(4)(t)sin(t)dt


Uwaga F30
Z twierdzenia F28 wynika natychmiast, że prawdziwe są następujące wzory

f(t)cos(t)dt=f(t)sin(t)f(1)(t)sin(t)dt
f(t)cos(t)dt=f(t)sin(t)+f(1)(t)cos(t)f(2)(t)cos(t)dt
f(t)cos(t)dt=f(t)sin(t)+f(1)(t)cos(t)f(2)(t)sin(t)+f(3)(t)sin(t)dt
f(t)cos(t)dt=f(t)sin(t)+f(1)(t)cos(t)f(2)(t)sin(t)f(3)(t)cos(t)+f(4)(t)cos(t)dt


Przykład F31
Rozważmy całkę

2πsin(t)tdt=0.152644750662268168985541529340002012956131350392536638644752066 (WolframAlpha)

Nie możemy wprost zastosować twierdzenia F22, ale korzystając ze wzoru podanego w uwadze F29, otrzymujemy

f(t)sin(t)dt=f(t)cos(t)+f(1)(t)sin(t)f(2)(t)sin(t)dt

Zatem

2πsin(t)tdt=cos(t)t|2πsin(t)t2|2π22πsin(t)t3dt
=12π22πsin(t)t3dt


Całkę 2πsin(t)t3dt umiemy już obliczyć (przykład F24), zatem bez trudu policzymy całkę 2πsin(t)tdt. Skoro poszło nam tak dobrze, to spróbujmy wykorzystać wzór

f(t)sin(t)dt=f(t)cos(t)+f(1)(t)sin(t)+f(2)(t)cos(t)f(3)(t)sin(t)+f(4)(t)sin(t)dt

Otrzymujemy

2πsin(t)tdt=cos(t)t|2πsin(t)t2|2π+2cos(t)t3|2π+6sin(t)t4|2π+242πsin(t)t5dt
=12π14π3+242πsin(t)t5dt


Aby policzyć numerycznie całkę po prawej stronie, musimy przygotować:

f(t)=sin(t)t5
g(t)=1t5
G(t)=14t4
limt+G(t)=0
Mmaxt2π|f(4)(x)| dla M=6105


Dla różnych wartości b otrzymujemy

Simproper(2*Pi, 10^3)
[6.4695465777027289767180972728663860875 E-5, 4.4874345453688215509527110951904781824 E-13]
Simproper(2*Pi, 10^4)
[6.4695465778029401532128088001319549975 E-5, 4.4987432411781955704707501103003654673 E-17]


Uzyskaliśmy wynik

2πsin(t)t5dt=6.4695465778029105

Dla porównania

2πsin(t)t5dt=6.46954657780293963651366308178572112473974453729045450304230105 (WolframAlpha)


I ostatecznie dostajemy

2πsin(t)tdt=12π14π3+242πsin(t)t5dt=0.152644750662268169

Korzystając z przykładu F24, uzyskalibyśmy mniej dokładny wynik.


Przykład F32
Pokażemy, że

2πsin(t)log(t)dt=0.5319715471471

W tym przypadku również nie możemy wprost zastosować twierdzenia F22, ale korzystając ze wzoru na całkowanie przez części

f(t)sin(t)dt=f(t)cos(t)+f(1)(t)sin(t)+f(2)(t)cos(t)f(3)(t)sin(t)+f(4)(t)sin(t)dt

dostajemy

2πsin(t)log(t)dt=cos(t)log(t)|2πsin(t)tlog2(t)|2π+(log(t)+2)cos(t)t2log3(t)|2πf(3)(t)sin(t)|2π+2π(6log3(t)+22log2(t)+36log(t)+24)sin(t)t4log5(t)dt
=1log(2π)log(2π)+2(2π)2log3(2π)+2π(6log3(t)+22log2(t)+36log(t)+24)sin(t)t4log5(t)dt


Aby skorzystać z programu Simproper(a, b, num), musimy przygotować

f(t)=(6log3(t)+22log2(t)+36log(t)+24)sin(t)t4log5(t)
g(t)=6log3(t)+22log2(t)+36log(t)+24t4log5(t)
G(t)=2log2(t)+6log(t)+6t3log4(t)
limt+G(t)=0
Mmaxt2π|f(4)(t)| dla M=0.011


Dla różnych wartości b otrzymujemy

Simproper(2*Pi, 10^4)
[0.0035251602572557803759192121691047755503, 5.2926827357763320615993244790723469003 E-14]
Simproper(2*Pi, 2*10^4)
[0.0035251602572557723629683384320660178268, 5.5938553808328833862080836586551636221 E-15]


Uzyskujemy wynik

2π(6log3(t)+22log2(t)+36log(t)+24)sin(t)t4log5(t)dt=0.00352516025725577


I ostatecznie dostajemy

2πsin(t)log(t)dt=1log(2π)log(2π)+2(2π)2log3(2π)+2π(6log3(t)+22log2(t)+36log(t)+24)sin(t)t4log5(t)dt=0.53197154714715371


Zadanie F33
Pokazać, że

2πsin(t)log(log(t))dt=1.56477817589
Rozwiązanie


Przykład F34
Rozważmy całkę (zobacz przykład E61)

1P1(t)tdt=12log(2π)1=0.081061466795327258219670263594382360138602526362216587

Nie możemy wprost zastosować twierdzenia F22, ale korzystając z twierdzenia E41, dostajemy

1P1(t)tdt=41504+161P6(t)t6dt

Funkcja P6(t) jest klasy C4(R), a całka 1B6t6dt jest zbieżna. Teraz już możemy zastosować twierdzenie F22.


Aby skorzystać z programu Simproper(a, b), musimy przygotować

f(t)=P6(t)6t6
g(t)=B66t6=1252t6
G(t)=11260t5
limt+G(t)=0
Mmaxt1|f(4)(t)| dla M=20


Dla różnych wartości b otrzymujemy

Simproper(1, 10^2)
[0.00028773955387901889817011277755076495293, 1.5793583624619615295181246127899383386 E-13]
Simproper(1, 5*10^2)
[0.00028773955387909098236994835644747087376, 5.0742857958929735807438325674790730659 E-17]


Uzyskaliśmy wynik

1P6(t)6t6dt=0.0002877395538790909


Skąd wynika natychmiast wartość obliczanej przez nas całki

1P1(t)tdt=41504+161P6(t)t6dt=0.0810614667953272582




Uzupełnienia

 

Jeszcze o funkcjach kawałkami klasy Cn

Uwaga F35
Niekiedy, dla uproszczenia zapisu, będziemy używali następujących oznaczeń dla wartości granic w wybranym punkcie

f(a+)=limxa+f(x)
f(a)=limxaf(x)

Takie oznaczenie ma nawet pewien sens, ponieważ granice możemy zapisywać w różny sposób, natomiast efekt jest jeden i ujmują go powyższe symbole. Przykładowo

f(a+)=limxa+f(x)=limh0+f(a+h)

Pozwoli to łatwo odróżnić wartości granic od wartości funkcji f(a) i prosto zapisać własności funkcji. Przykładowo funkcja f(x) jest ciągła w punkcie a, gdy

  • istnieją skończone granice f(a) i f(a+)
  • f(a)=f(a+)=f(a)


W przypadku pochodnych wprowadzimy oznaczenie pozwalające odróżnić wartość pochodnej prawostronnej od pochodnej lewostronnej.

+f(a)=limh0+f(a+h)f(a)h
f(a)=limh0f(a+h)f(a)h

Podobnie i w tym przypadku różny zapis granic daje ten sam efekt

+f(a)=limxa+f(x)f(a)xa=limh0+f(a+h)f(a)h

Przykładowo pochodna f(x) istnieje w punkcie a, gdy

  • istnieją skończone granice +f(a) i f(a)
  • +f(a)=f(a)=f(a)

Pochodna f(x) jest ciągła w punkcie a, gdy

  • istnieją skończone granice f(a) i f(a+)
  • f(a)=f(a+)=f(a)


Uwaga F36
Podkreślmy, że granica funkcji w punkcie (powiedzmy x=a) nie jest wartością funkcji w tym punkcie. Jest tak tylko wtedy, gdy funkcja jest ciągła w punkcie x=a. Analogicznie granica pochodnej w punkcie nie jest wartością pochodnej w tym punkcie. Jest tak tylko wtedy, gdy spełnione są pewne warunki. Twierdzenia F37F38 określają te warunki i dlatego są bardzo istotne.

Traktowanie granicy funkcji f(x) w punkcie x=0 jako wartości pochodnej w tym punkcie, bez odwołania się do wspomnianych twierdzeń, jest błędem. Dobrym przykładem jest funkcja

f(x)={x2sin(1x)x00x=0

Funkcja ta ma pochodną w punkcie x=0, ale granice pochodnej w tym punkcie nie istnieją (zobacz zadanie F9).


Twierdzenie F37
Niech ε>0. Jeżeli funkcja f(x) jest ciągła w [a,a+ε) i różniczkowalna[8] w (a,a+ε) oraz istnieje granica (skończona lub nieskończona) limxa+f(x), to pochodna prawostronna w punkcie a jest równa tej granicy: +f(a)=f(a+).

Dowód


Analogiczne twierdzenie można sformułować i udowodnić dla lewostronnego otoczenia punktu a.

Twierdzenie F38
Niech ε>0. Jeżeli funkcja f(x) jest ciągła w [aε,a) i różniczkowalna w (a,a+ε) oraz istnieje granica (skończona lub nieskończona) limxaf(x), to pochodna lewostronna w punkcie a jest równa tej granicy: f(a)=f(a).


Twierdzenie F39
Funkcja ciągła w przedziale (a,b) przyjmuje w tym przedziale jedynie wartości skończone.

Dowód


Wniosek F40
Z twierdzenia F39 wynika natychmiast, że jeżeli funkcja f(x) ma ciągłą pochodną w przedziale (a,b), to funkcja f(x) jest w tym przedziale różniczkowalna.


Zadanie F41
Niech

f(x)={(x)1/3x<0x1/3x0

Korzystając z twierdzeń F37F38 znaleźć wartości pochodnej f(x) w x=0.

Rozwiązanie


Twierdzenie F42
Niech c(a,b). Jeżeli funkcja f(x) jest ciągła w przedziale (a,b) i ma ciągłą pochodną w każdym z przedziałów (a,c) i (c,b) oraz istnieją skończone i równe sobie granice limxcf(x) i limxc+f(x), to pochodna f(x) jest ciągła w punkcie x=c, czyli jest ciągła w (a,b).

Dowód


Z twierdzenia F42 wynika natychmiast

Twierdzenie F43
Niech funkcja f(x) będzie kawałkami klasy C1([a,b]). Funkcja f(x) jest klasy C1([a,b]) wtedy i tylko wtedy, gdy jest ciągła w przedziale [a,b] i w każdym punkcie xk (wyznaczającym podział przedziału [a,b]) granice lewostronna i granica prawostronna pochodnej f(x) są sobie równe.


Zadanie F44
Niech

  • funkcja f(x) będzie klasy C0([a,b])
  • c(a,b)
  • pochodna funkcji f(x) będzie funkcją ciągłą w przedziałach [a,c) i (c,b]

Pokazać, że

  1. jeżeli co najmniej jedna z granic f(c) i f(c+) jest nieskończona, to funkcja f(x) nie jest różniczkowalna w punkcie x=c i oczywiście nie jest nawet kawałkami klasy C1([a,b])
  2. jeżeli istnieją skończone granice f(c) i f(c+) i nie są sobie równe, to f(x) jest kawałkami klasy C1([a,b])
  3. jeżeli istnieją skończone granice f(c) i f(c+) i są sobie równe, to funkcja f(x) jest klasy C1([a,b])
  4. jeżeli funkcja f(x) jest różniczkowalna w punkcie x=c oraz funkcja f(x) jest nieciągła w punkcie x=c, to co najmniej jedna z granic f(c) i f(c+) nie istnieje; w efekcie funkcja f(x) nie jest nawet kawałkami klasy C1([a,b])
Rozwiązanie


Zadanie F45
Zbadać dla jakich wartości parametrów a,b,c funkcja

f(x)={ax2+bx+cx<0cos(x)x0

jest klasy C2(R).

Rozwiązanie


Uwaga F46
Nim przejdziemy do dalszych twierdzeń, zauważmy, że jeżeli f(x) jest funkcją ciągłą w przedziale [a,b], to zmiana wartości funkcji f(x) w pewnym punkcie c[a,b] nie wpływa na wartość lewo- i prawostronnych granic funkcji w tym punkcie. Liczba f(c) to zdefiniowana wartość funkcji f(x) w punkcie c. Granice (lewa i prawa) funkcji f(x) w punkcie x=c nie zależą od wartości funkcji f(c), a jedynie informują nas, jaka powinna być wartość funkcji w punkcie x=c, aby funkcja f(x) była lewostronnie ciągła lub prawostronnie ciągła, lub ciągła (gdy granice te są równe) w punkcie x=c. Ujmując dokładniej: wartość granicy funkcji f(x) w punkcie x=c wynika z przebiegu funkcji w sąsiedztwie punktu c.


Twierdzenie F47
Niech f(x) będzie funkcją ciągłą w przedziale (a,b). Funkcja f(x) może być przedłużona do funkcji ciągłej w przedziale [a,b] wtedy i tylko wtedy, gdy istnieją skończone granice funkcji f(x) na krańcach przedziału (a,b).

Dowód


Twierdzenie F48
Niech f(x) będzie funkcją ciągłą w przedziale [a,b], a jej pochodna będzie ciągła w (a,b). Pochodna funkcji f(x) jest ciągła w przedziale [a,b] wtedy i tylko wtedy, gdy istnieją skończone granice jednostronne pochodnej f(x) na krańcach przedziału (a,b).

Dowód


Twierdzenie F49
Niech f(x) będzie funkcją klasy C0 w przedziale [a,b] i klasy Cr (gdzie r1) w przedziale (a,b). Funkcja f(x) jest klasy Cr w przedziale [a,b] wtedy i tylko wtedy, gdy istnieją skończone granice jednostronne pochodnych f(i)(x), dla i=1,r, na krańcach przedziału (a,b).

Dowód


Twierdzenie F50
Funkcja f(x) jest kawałkami ciągła w przedziale [a,b] wtedy i tylko wtedy, gdy istnieje skończona liczba punktów a=x1<x2<<xn=b takich, że

  • funkcja f(x) jest ciągła w każdym przedziale (xk,xk+1)
  • funkcja f(x) może być przedłużona do funkcji ciągłej w [xk,xk+1].
Dowód


Twierdzenie F51
Niech rN0. Funkcja f(x) jest kawałkami klasy Cr w przedziale [a,b] wtedy i tylko wtedy, gdy istnieje skończona liczba punktów a=x1<x2<<xn=b takich, że

  • funkcja f(x) jest klasy Cr w każdym przedziale (xk,xk+1)
  • funkcja f(x) może być przedłużona do funkcji klasy Cr w każdym przedziale [xk,xk+1].
Dowód





Jeszcze o błędzie metody Simpsona

 

Uwaga F52
Chcemy wyjaśnić, dlaczego dowodząc twierdzenie F14, wybraliśmy funkcję postaci

W(x)={112(xa)3(3xa2b)axc112(xb)3(3x2ab)cxb

gdzie c=12(a+b).

Znając postać funkcji, mogliśmy pozwolić sobie na wykonanie kolejnych kroków przez różniczkowanie. Pozwoliło to skrócić i uprościć cały dowód. Chcąc zrozumieć metodę i zbadać, czy istnieje możliwość uogólnienia, będziemy tym razem postępowali odwrotnie i kolejno wyliczali całki.


Uwaga F53
Dla uproszczenia zapisu parę funkcji: g1(x) określoną w przedziale [a,c] oraz g2(x) określoną w przedziale [c,b], gdzie c=12(a+b), będziemy oznaczali jako f(x)={g1(x)|g2(x)}. Czytelnika nie powinien niepokoić fakt, że funkcja f(x) nie jest określona w punkcie x=c, bo zawsze możemy przyjąć f(c)=12(g1(c)+g2(c)). Lepiej traktować {g1(x)|g2(x)} jako parę funkcji, której ciągłość w punkcie x=c ma dla nas istotne znaczenie, a jedynie dla wygody zapisu oznaczamy ją jako f(x)={g1(x)|g2(x)}.


Twierdzenie F54
Niżej wypisany ciąg funkcji


uzyskaliśmy, stosując następujące zasady:

1) każda kolejna funkcja jest całką poprzedniej, czyli dla n2 jest

Un(x)=Un1(x)dx+K
Vn(x)=Vn1(x)dx+L

2) stałe całkowania K,L zostały wybrane tak, aby dla n2 spełniony był warunek

Un(a)=Vn(b)=0


Twierdzenie F55
Jeżeli funkcja f(x) jest klasy C1([a,b]), to

abf(x)dx=ba6[f(a)+4f(c)+f(b)]16abf(x)W1(x)dx

gdzie c=12(a+b).

Dowód


Uwaga F56
Postać funkcji W1(x)={6x5ab|6xa5b} wynika z nałożenia na postać ogólną

W1(x)={U1(x)|V1(x)}={rx+s|tx+u}

następujących warunków:

  • funkcja W2(x)=W1(x)dx+C ma być równa zero w punktach x=a oraz x=b, skąd otrzymujemy
W2(x)={12(xa)(rx+ar+2s)|12(xb)(tx+bt+2u)}
  • funkcja W2(x) musi być ciągła w punkcie x=c=a+b2, skąd dostajemy równanie U2(c)=V2(c), z którego, po podstawieniu c=a+b2 i łatwym uproszczeniu, mamy
3ra+3tb+rb+ta+4s+4u=0
  • w twierdzeniu F55 musi pojawić się wyraz ba6[f(a)+4f(c)+f(b)], skąd otrzymujemy równania
U1(a)=(ba)
V1(b)=ba
U1(c)V1(c)=4(ba)


Zbierając: liczby r,s,t,u muszą spełniać układ równań

{ra+s=(ba)tb+u=barc+s(tc+u)=4(ba)3ra+3tb+rb+ta+4s+4u=0


Mnożąc pierwsze i drugie równanie przez (4), dodając je do siebie, a następnie dodając sumę do równania czwartego, otrzymujemy

(4ra4s4tb4u)+(3ra+3tb+br+at+4s+4u)=0

czyli

(ba)(rt)=0

Z założenia jest ba, zatem musi być r=t.

Odejmując od drugiego równania pierwsze i dodając różnicę do trzeciego, mamy

(rb+uras)+(su)=6(ba)

Skąd otrzymujemy r=t=6. Teraz już łatwo znajdujemy s=5ab oraz u=a5b.


Widzimy, że przez odpowiedni dobór wartości liczb r,s,t,u mogliśmy zapewnić ciągłość funkcji W2(x). Fakt, że ciągłe są również funkcje W3(x) i W4(x) jest szczęśliwym przypadkiem. Ponieważ funkcja W5(x) nie jest ciągła, to nie mogliśmy jej wykorzystać w twierdzeniu F14. Wybór funkcji

W4(x)={112(xa)3(3xa2b)|112(xb)3(3x2ab)}

zapewnił uzyskanie najdokładniejszego oszacowania błędu.








Przypisy

  1. ang. piecewise continuous function
  2. ang. piecewise C1 function lub piecewise smooth function
  3. Wikipedia, Funkcja skokowa Heaviside’a, (Wiki-pl), (Wiki-en)
  4. E. Talvila and M. Wiersma, Simple Derivation of Basic Quadrature Formulas, Atlantic Electronic Journal of Mathematics, Volume 5, Number 1, Winter 2012, (LINK)
  5. Wikipedia, Sinus i cosinus całkowy, (Wiki-pl), (Wiki-en)
  6. MathWorld, Sine Integral, (MathWorld)
  7. WolframAlpha, Sine integral function, (WolframAlpha)
  8. Wikipedia, Funkcja różniczkowalna, (Wiki-pl), (Wiki-en)
  9. Twierdzenie Weierstrassa: Jeżeli funkcja f(x) określona w przedziale domkniętym jest ciągła, to jest w nim ograniczona. (Wiki-pl), (Wiki-en)