Simpsonsreglan

Úr Wikipediu, frjálsa alfræðiritinu
Stökkva á: flakk, leita

Simpsonsaðferðin er töluleg heildunaraðferð sem að er gjarnan notuð í tölvum, en hún er kennd við Thomas Simpson sem fann hana upp og lagði hana fram í bók sinni, The Doctrine and Application of Fluxions. Aðferðin byggir á því að nálga fall við margliðu. Þessi aðferð er í mörgum tilfellum nákvæmari en aðrar sambærilegar tölulegar heildunaraðferðir, en þetta nær að nálga sínus og kósínus án nokkurrar skekkju, sem er ákveðinn kostur við þessa aðferð fram yfir aðrar.


Aðferðin útleggst þannig fyrir \int_a^bf(x)dx:

 S = \frac{h}{3}\cdot(y_0+4y_1+2y_2+4y_3+...+2y_{n-2}+4y_{n-1}+y_n)

Gildin á y eru útgildin á f(x) á skiptipunktunum (sem koma með h millibili)

x_0 = a, x_1 = a+h, x_2 = a+2h ... x_{n-1} = a + (n-1)h, x_n = b

Talan n skal vera slétt, og h = \frac{b - a}{n}.

Skekkja[breyta]

Vegna þess að fallið er töluleg nálgun við fall, þá er ákveðin reikniskekkja, en hægt er að áætla eða nálga reikniskekkjuna.

Villan samsvarar E_s = \int_a^bf(x)dx - S, og stærð skekkjunnar minnkar eftir því sem skiptipunktunum fjölgar.

Skekkjan er um það bil |E_s| \le \frac{b - a}{180} h^4M þar sem að h = \frac{b - a}{n}.

Tölvufræðileg notkun[breyta]

Tölulegar heildunaraðferðir eru fyrst og fremst gagnlegar í forritun, þar sem að engin leið er til þess að hækka veldi eða lækka á óþekktri stærð. Hér er C kóði að falli sem að lýsir aðferð Simpsons:

float simpsons( float (*f)(float x), float a, float b, int n) {
        float h = (b - a) / n;
        float x;
        float r;
        char m = 0;
        float s = 0.0;

        for (x = a; x <= b; x+=h) {
                r = f(x);
                if (x == a || x == b) {
                        s += r;
                } else {
                        m = !m;
                        s += r * (m+1) * 2.0;
                }
        }
        return s * (h/3.0);
}

og til þess að reikna út skekkjuna:

float simpsons_afgangur( float (*f)(float x), float a, float b, int n) {
        float h = (b - a) / n;
        return ((n*powf(h,5))/90) * (f(h),n);
}