Algoritmus pro numerické integrování - Lichoběžníková metoda

Algoritmy Matematické Algoritmus pro numerické integrování - Lichoběžníková metoda

V minulém díle jsme si představili obdélníkovou metodu, která prokládala daný interval obdélníkem. Její přesnost však není ideální a proto si dnes představíme Lichoběžníkovou metodu, která je přesnější. Lichoběžníková metoda patří mezi základní metody pro numerický výpočet integrálu. Princip spočívá v tom, že se daný interval proloží lichoběžníkem a spočítá se jeho obsah. Lichoběžníková formule počítá přesně pro lineární polynomy (např. přímky), ovšem pro kvadratické (např. paraboly) ne.

Základní formule

Vzorec jednoduché lichoběžníkové metody
Jednoduchá lichoběžníková formule

Základní lichoběžníková formule spočívá ve spojení krajních bodů pomocí přímky a následného spočítání obsahu pod touto přímkou(obsah lichoběžníku). Viz obrázek.

Složená formule

h= (b-a)/n ,kde n je počet podintervalů

h - délka intervalu - udává délku křivky, kterou daný interval prokládáme

Vzorec složené lichoběžníkové metody
Složená lichoběžníková formule

Složená lichoběžníková metoda spočívá v tom, že si hlavní interval <a;b> rozdělíme na několik podintervalů. Na obrázku si rozděluji interval <1;4> na 3 podintervaly: <1;2>,<2;3>.<3;4>, ve kterých aplikuji základní lichoběžníkovou metodu. V tomto případě by ovšem stačil jen interval jeden, protože lichoběžník přesně kopíruje zadanou funkci.

Pokud však máme složitější křivku, například graf funkce sinus, použijeme pro přesnější výpočet více podintervalů -> větší n. To znamená, že si vzdálenost mezi body zmenšíme a tím lépe kopírujeme zadanou křivku.

Výpočet matematicky

Př: Spočítejte obsah pod křivkou funkce y(x)=x na intervalu <1;4> pomocí složené lichoběžníkové metody.

Zadaná funkce je y(x) = x, to znamená, že když dosadím za x = 1, pak y = 1 viz tabulka:

iterace 0 1 2 3
x 1 2 3 4
y 1 2 3 4

Dále si funkci rozdělím na 3 podintervaly, tedy n=3. ( <1;2>,<2;3>.<3;4>)

h= (b-a)/n=(4-1)/3= 1 - po 1 se nám zvyšuje interval

S=h[0,5*f(x0 )+f(x1 )+f(x2 )+0,5*f(x3)]

Podle rovnice musíme vypočítat hodnotu y(x) v bodě x

Výpočet y(x0 ) y(x1 ) y(x2 ) y(x3 )
y(x) 1 2 3 4

S=1[0,51+2+3+­0,5*4]=7,5

Výsledek podle lichoběžníkové metody je tedy 7,5. V tomhle případě to vyjde přesně, protože máme lineární funkci.

Funkce je zadána

Pokud máme zadanou funkci, je možné určit na kolik intervalů si je třeba danou křivku rozdělit, abychom dosáhli požadované přesnosti. Pro toto můžeme buď použít vzorec pro výpočet chyby lichoběžníkové metody nebo použít metodu polovičního kroku, která je přesnější.

Metoda v C# - pro zadanou funkci

private double LichobeznikovaMetoda(double a, double b, int n)
{

    double h = (b - a) / n; // spocitam si h

    double[] hodnotyX = new double[n+1]; // tady mam pole x-ovych hodnot

    double vysledek = 0; // deklaruju promenou vysledek

    for(int i=0; i<hodnotyX.Length;i++) // naplnim si pole x-ovyma hodnotama
    {
        hodnotyX[i] = (a + h * i);
    }

    for (int i = 1; i < n; i++)
    {
        vysledek += hodnotyX[i]; // tady je treba zadat tu svou funkci pokud bych mel napriklad funkci y(x) = 2x + 3,
        //tak radek bude vypadat takto: vysledek += (2*hodnotyX[i]+3);
    }

    vysledek = h * (vysledek + (0.5 * hodnotyX[0] + 0.5 * hodnotyX[hodnotyX.Length - 1])); // kdybych mel funkci y(x) = 2x + 3, tak tady taky musim upravit radek
    //h * (vysledek + (0.5 * (2*hodnotyX[0]+3) + 0.5 * (2*hodnotyX[hodnotyX.Length - 1]+3)))
    return vysledek;
}

Zadané body (bez funkce)

Může se stát, že nemáme zadanou funkci, ale jen body x a y. To znamená, že daný bod y je výsledek funkce. Tudíž můžeme jednotlivé body y (výsledky funkce) dosadit do vzorce a spočítat obsah. Docílíme toho, že všechny body, které máme zadány, jsou mezi sebou spojeny přímkami a pod těmito přímkami je spočítán obsah. Pokud máme dostatek bodů, je metoda relativně přesná. Pokud nemáme dostatek bodů a chceme výsledek zpřesnit, je možno si dopočítat body pomocí interpolace. U interpolace si však dávejte pozor jakou metodu interpolace použijete, protože může výsledek obsahu pod křivkou i více znepřesnit.

Metoda v C# - pro zadané body (bez funkce)

private double LichobeznikovaMetoda( double[] HodnotyX, double[] HodnotyY)
{
     int n = HodnotyY.Length-1; //deklaruju si n, ktere rozdelim na tolik intervalu, kolik je bodu v poli -1
     double a = HodnotyX[0]; // pocatek intervalu
     double b = HodnotyX[HodnotyY.Length - 1]; // konec intervalu


     double h = (b - a) / n; // spocitam si h

     double vysledek = 0; // deklaruju promenou vysledek

     for (int i = 1; i < n; i++)
     {
         vysledek += HodnotyY[i];
     }

     vysledek = h * (vysledek + (0.5 * HodnotyY[0] + 0.5 * HodnotyY[HodnotyY.Length - 1]));
     return vysledek;
}

Závěr

Lichoběžníková metoda je přesná pro lineární funkce. Použít se dá na jakoukoliv funkci (křivku), protože pokud použijete dostatečný počet intervalů, tak její přesnost je dostačující. Ovšem vždy je třeba promyslet i to, jestli je nutné mít tak velký počet intervalů.

V dalším díle se podíváme na Simpsonovu metodu, která nahrazuje funkci na daném intervalu polynomem druhého stupně(parabolou).

Zdroj: http://mathonline.fme.vutbr.cz


 

  Aktivity (1)

Článek pro vás napsal Gramli
Avatar
Autor se věnuje hlavně jazyku C#

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 



 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!