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.

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:
Pole i-tego trapezu zgodnie ze wzorem wynosić będzie:
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ę.
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

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:
Implementacje
Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
Tomasz Lubiński | C# | MS Visual Studio .net | .cs | .cs | ***** / 5 |
Tomasz Lubiński | C/C++ | .cpp | .cpp | ***** / 8 | |
Tomasz Lubiński | Delphi/Pascal | .pas | .pas | ***** / 3 | |
Tomasz Lubiński | Java | .java | .java | ***** / 8 | |
Tomasz Lubiński | JavaScript | .js | .js | ***** / 1 | |
Jakub Konieczny | Java_Block | .jbf | .jbf | ***** / 1 | |
Jakub Konieczny | Python | Python 2.6 | .py | .py | ***** / 3 |
Poprawiony: 04 października 2012 15:55
Komentarze

+4
#
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ć

+1
#
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ć

0
#
Kamil11
2015-11-18 01:40
Dlaczego wartości brzegowe dzieli się przez 2 ?
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz