algorytm.org

Całkowanie numeryczne - metoda trapezów

Praca
Interesuje Cię praca przy weryfikacji oprogramowania do samolotów?
Sprawdź to!
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 trapezów
Ocena użytkowników:***** / 41
SłabyŚwietny 
Wpisany przez Tomasz Lubiński, 27 maja 2007 19:48

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. Dla każdej takiej części możemy wyznaczyć trapez, który w przybliżeniu będzie odpowiadał polu obszaru pod wykresem krzywej.
Całkowanie numeryczne - metoda trapezów

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}
Taka też będzie wysokość każdego z trapezów. Podstawy i-tego trapezu będą wynosić odpowiednio:
f(x_{i-1}) \text{ oraz } f(x_i)
dla i = 1, 2, ..., n, gdzie xi = xp + i*dx.
Pole i-tego trapezu zgodnie ze wzorem wynosić będzie:
P_i = \frac{f(x_{i-1}) + f(x_i)}{2} * dx
Całkę w zadanym przedziale uzyskamy dodając do siebie pola wszystkich wyznaczonych trapezów, wynosić będzie ona zatem:
\frac{f(x_0) + f(x_1)}{2} * dx + \frac{f(x_1) + f(x_2)}{2} * dx + ... + \frac{f(x_{n-1}) + f(x_n)}{2} * dx =\\\\ = \frac{dx}{2} * (f(x_0) + 2f(x_1) + 2f(x_2) + ... + 2f(x_{n-1}) + f(x_n)) =\\\\ = dx * \left(\frac{f(x_0)}{2} + f(x_1) + f(x_2) + ... + f(x_{n-1}) + \frac{f(x_n)}{2}\right)
W praktyce w pętli dodajemy do siebie wszystkie wartości funkcji od 1 do n-1, a potem dwie wartości brzegowe podzielone przez dwa. Całość mnożymy przez dx i otrzymujemy w ten sposób wynik.

Takie postępowanie daje wyniki lepsze niż całkowanie metodą prostokątów, ale i tutaj otrzymany wynik nie będzie zawsze idealny - zakładamy przecież, że funkcja w obrębie przedziałów jest liniowa, co w ogólności nie musi być prawdą. Na schemacie powyżej widać, że metoda dość dobrze (ale nie idealnie) odwzorowywuje naszą przykładową funkcję w dwóch pierwszych przedziałach, natomiast w ostatnim przedziale widać wyraźnie różnicę pomiędzy polem pod wykresem a wyznaczonym trapezem. Warto zauważyć, iż im większa liczba przedziałów n z tym większą dokładnością wyznaczymy interesującą nas całkę.

Przykład:
Obliczymy przybliżoną wartość całki dla funkcji f(x) = x2 + 3 w przedziale <2, 5> z dokładnością n = 3.
Obliczmy najpierw szerokość przedziału dx = ( xk - xp ) / n = (5 - 2) / 3 = 3 / 3 = 1.
Teraz obliczymy całkę.
dx * (f( x0 ) / 2 + f( x1 ) + f( x2 ) + f( x3 ) / 2) = dx * (f(2 + 0*1)/2 + f(2 + 1*1) + f(2 + 2*1) + f(2 + 3*1)/2) = dx * (f(2)/2 + f(3) + f(4) + f(5)/2) = 1 * (3.5 + 12 + 19 + 14) = 48.5.
Zatem przybliżona wartość całki wynosi 48.5

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
***** / 3
Tomasz LubińskiC/C++
.cpp
.cpp
***** / 5
Tomasz LubińskiDelphi/Pascal
.pas
.pas
***** / 2
Tomasz LubińskiJava
.java
.java
***** / 5
Tomasz LubińskiJavaScript
.js
.js
***** / 0
Jakub KoniecznyJava_Block
.jbf
.jbf
***** / 1
Jakub KoniecznyPythonPython 2.6
.py
.py
***** / 2
 
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:55
Komentarze
photo
+3 # PaulinaSEr 2013-06-20 18:55
nie rozumiem dlaczego (f(2 + 0*1)/2 + f(2 + 1*1) + f(2 + 2*1) + f(2 + 3*1)/2) ?
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
0 # Paweł9876543210 2015-04-30 08:51
Bo f(xp+i*dx), a wartości brzegowe dzieli się przez 2.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
0 # Kamil11 2015-11-18 01:40
Dlaczego wartości brzegowe dzieli się przez 2 ?
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz