algorytm.org

Całkowanie numeryczne - metoda Simpsona

Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Całkowanie numeryczne - metoda Simpsona
Ocena użytkowników:***** / 34
SłabyŚwietny 
Wpisany przez Tomasz Lubiński, 18 października 2009 15:16

Załóżmy, że chcemy obliczyć całkę z funkcji f(x) w przedziale <xp; xk>. Definicja całki oznaczonej Riemana, mówi nam, że wartość całki równa jest sumie pól obszarów pod wykresem krzywej w zadanym przedziale całkowania. Sumę taką możemy obliczyć w przybliżeniu dzieląc obszar całkowania na n równych części. W metodach prostokątów i trapezów zakładaliśmy, że przybliżenie funkcji w przedziale jest funkcją liniową (przybliżenie odwzorowywało funkcję na odcinek w obrębie przedziału). W metodzie Simpsona w każdym takim przedziale będziemy przybliżać funkcję dla, której obliczamy całkę przy pomocy paraboli.
Metoda Simpsona - całkowanie numeryczne


Jak już wspomnieliśmy przedział całkowania <xp; xk> podzielimy na n równych części. Szerokość każdej z nich wynosić będzie zatem:
dx = \frac{x_k - x_p}{n}
Na końcach każdego przedziału funkcja będzie przyjmowała wartości f( xi-1 ) oraz f( xi ) dla i = 1, 2, ..., n, gdzie xi = xp + i*dx.
W każdym przedziale <xi-1; xi> funkcję f(x) będziemy przybliżać przy pomocy paraboli g(x) = aix2 + bix + ci
By jednoznacznie określić parabolę, potrzebujemy danych trzech punktów, przez które ma ona przechodzić. Dla każdego przedziału mamy dane już dwa (na końcu i początku przedziału), brakuje nam zatem jeszcze jednego. Dlatego teżdla każdego takiego przedziału wprowadzimy punkt środkowy ti = (xi-1 + xi) / 2

Pole pod parabolą obliczmy z definicji całki Newtona-Leibniza, która mówi, że całka oznaczona z funkcji w przedziale zamkniętym określona jest jako różnica wartości funkcji pierwotnej na końcu tego przedziału i wartości funkcji pierwotnej na początku tego przedziału. Funkcja pierwotna dla funkcji f(x), to taka funkcja F(x), że jej pochodna równa jest funkcji f(x), czyli F'(x) = f(x). Zatem Stosując podane twierdzenie do naszego przybliżenia g(x) otrzymamy:
\int_{x_{i-1}}^{x_{i}}{g_{i}(x)dx}=G_{i}(x_{i})-G_{i}(x_{i-1})
Podstawiając funkcję pierwotną:
\int_{x_{i-1}}^{x_{i}}{g_{i}(x)dx}=\frac{a_{i}}{3}x_{i}^{3}+\frac{b_{i}}{2}x_{i}^{2}+c_{i}x_{i}-\frac{a_{i}}{3}x_{i-1}^{3}-\frac{b_{i}}{2}x_{i-1}^{2}-c_{i}x_{i-1}
Po pogrupowaniu:
\int_{x_{i-1}}^{x_{i}}{g_{i}(x)dx}=\frac{a_{i}}{3}(x_{i}^{3}-x_{i-1}^{3})+\frac{b_{i}}{2}(x_{i}^{2}-x_{i-1}^{2})+c_{i}(x_{i}-x_{i-1})
Po wyciągnięciu części wspólnej przed nawias:
\int_{x_{i-1}}^{x_{i}}{g_{i}(x)dx}=\frac{(x_{i}-x_{i-1})}{6}(2a_{i}(x_{i}^{2}+x_{i}x_{i-1}+x_{i-1}^{2})+3b_{i}(x_{i}+x_{i-1})+6c_{i})
Co po odpowiednich przekształceniach możemy sprowadzić do postaci:
\int_{x_{i-1}}^{x_{i}}{g_{i}(x)dx}=\\\frac{(x_{i}-x_{i-1})}{6}((a_{i}x_{i-1}^2+b_{i}x_{i-1}+c_{i})+(a_{i}x_{i}^2+b_{i}x_{i}+c_{i})+4(a_{i}t_{i}^2+b_{i}t_{i}+c_{i}))
Można zauważyć, że odpowiednie części równania są wartościami funkcji f:
\int_{x_{i-1}}^{x_{i}}{g_{i}(x)dx}=\frac{(x_{i}-x_{i-1})}{6}(f(x_{i-1})+f(x_{i})+4f(t_{i}))
Powyższy wzór podaje nam wartość przybliżonej całki w przedziale. Teraz trzeba dodać do siebie wartości, wszystkich przedziałów i tym sposobem otrzymamy wzór na obliczenie przybliżonej całki metodą Simpsona:
\int_{x_{p}}^{x_{k}}{f(x)dx}\approx\frac{(x_{k}-x_{p})}{6n}(f(x_{0})+f(x_{n})+2\sum_{i=1}^{n-1}{f(x_{i})}+4\sum_{i=1}^{n}{f(t_{i})})
Przykład:
Obliczymy przybliżoną wartość całki dla funkcji f(x) = x2 + 3 w przedziale <2, 5> z dokładnością n = 3.
((xk-xp)/6n) * (f(x0) + f(xn) + 2*(f(x1) + f(x2)) + 4*(f(t1) + f(t2) + f(t3))) = ((5-2)/(6*3)) * (f(2) + f(5) + 2*(f(3) + f(4)) + 4*(f(2.5) + f(3.5) + f(4.5))) = 3/18 * (7 + 28 + 2*(12+19) + 4*(9.25+15.25+23.25)) = 3/18 * (7 + 28 + 62 + 191) = 3/18 * 288 = 48
Zatem przybliżona wartość całki wynosi 48. Co więcej w tym wypadku możemy powiedzieć nawet, że jest to wartość dokładna ponieważ obliczaliśmy całkę dla funkcji kwadratowej (algorytm przybliżał parabolę za pomocą paraboli, a więc zrobił to dokładnie).

Przykład w JavaScript:
Funkcja f(x):
Początek przedziału całkowania:
Koniec przedziału całkowania:
Dokładność całkowania:

Implementacje
AutorJęzyk
programowania
KomentarzOtwórzPobierzOcena
Tomasz LubińskiC#MS Visual Studio .net
.cs
.cs
***** / 4
Tomasz LubińskiC/C++
.cpp
.cpp
***** / 10
Tomasz LubińskiDelphi/Pascal
.pas
.pas
***** / 3
Tomasz LubińskiJava
.java
.java
***** / 4
Tomasz LubińskiJavaScript
.js
.js
***** / 0
 
Dodaj własną implementację tego algorytmu
  • Zaloguj się na stronie
Plik:
Język
programowania:
Komentarz:
  By móc dodać implementacje zaloguj się na stronie

Poprawiony: 04 października 2012 15:53
Komentarze
photo
+6 # Informator 2016-01-15 23:10
Metoda jest opisana błędnie.
Nie wiem z jakich źródeł korzystałeś, ale ja przejrzałem już wiele książek i nigdzie nie znalazłem wzmianki nt całki Newtona-Leibniza, do obliczenia całki metodą Simpsona.

Dodam, że korzystają tam ze wzoru:

1/3*h * ( f(i−1) + 4f(i) + f(i+1) )

gdzie h jest połową długości pojedynczego pododcinja, h = (b-a)/2*n
f(i-1) jest to wartość funkcji dla punktu w "początku" pododcinka
f(i) jest to wartość funkcji dla punktu w środku pododcinka
f(i+1) jest to wartość funkcji dla punktu w końcu pododcinka

Ten wzór jest wykorzystywany gdy dzielimy przedział całkowania, dla prostszych całek dzielenie nie jest niezbędne, wtedy można skorzystać ze wzory, który swoją drogą jest przetransponowa niem poprzedniego (n=1):

(b - a)/6 * ( f( a ) + 4*f( (a+b)/2 ) + f( b )
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz