Strona 1 z 1

Całkowanie numeryczne - metoda trapezów

: 21 lut 2009, 13:18
autor: patryk007@vp.pl
Mam pytanie co do metody trapezów przy liczeniu pola pod wielomianem. Idea jest mi chyba znana. "Chyba", bo nie rozumiem czegoś.

Wg tej strony algorytm jest taki (przy dokładności podziału na tylko 3 części):

Kod: Zaznacz cały

dx * (f( x0 ) / 2 + f( x1 ) + f( x2 ) + f( x3 ) / 2)
Gdzie tu wzór na pole trapezu?!

Spróbowałem to zaimplementować http://wklej.org/id/55427/. Postanowiłem olać wszystkie algorytmy opisane na stronach, liczyłem tylko pola prostokącików pod wielomianem (widocznie tylko tak mi się zdaje) i za każdym razem, gdy porównywałem wynik z KmPlot'em moje liczone całki były zawsze mniejsze od tych poprawnych o połowę! Na jakiejś stronie wyczytałem, że trzeba dodatkowo wziąć skrajne wartości (u mnie w kodzie oznaczone jako a i b) i policzyć z nich

Kod: Zaznacz cały

(b-a)/dx
(20. linia kodu).

Dlaczego?! Dlaczego nie wystarczy zsumować wszystkich trapezów pod wielomianem?! Czegoś tu nie rozumiem. Ktoś wie skąd to (b-a)/dx?

Odp: Całkowanie numeryczne - metoda trapezów

: 21 lut 2009, 17:13
autor: Struchu
Ten wzór jest de facto tzw. złożonym wzorem trapezów (przy podziale wyjściowego przedziału na 3 równe części i zastosowanie do każdej z nich wzoru trapezów, a następnie zsumowaniu wszystkich otrzymanych wyników - czyli tak, tylko sumujemy pola wszystkich trapezów pod wielomianem).

W wersji "podstawowej" ta kwadratura na przedziale <a, b> dla pewnej funkcji f ma postać:

Q(f) = (b-a)*(f(a) + f(b))/2

co jest niczym innym jak wzorem na pole trapezu.

I możesz mi jeszcze wyjaśnić, czemu obliczeń numerycznych dokonujesz na intach? Możliwe, że gdzieś po prostu masz dzielenie całkowite a nie rzeczywiste, i dlatego wychodzi dwa razy mniejsze.

Odp: Całkowanie numeryczne - metoda trapezów

: 22 lut 2009, 13:09
autor: p4wcio

Kod: Zaznacz cały

double dx = 0.01 //dokladnosc
//fcja f1 zwraca wartosc funkcji dla zadanego argumentu

double calka_trapez() {

    double S = 0 ;

    

    for(double i = 0; i <= n-dx; i += dx)

        S += abs((f1(i)+f1(i+dx))/2*dx) ;
    
    return S ;

}
Metoda trapezów u mnie działa bez zarzutu :).