IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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

V minulé lekci, Algoritmus pro numerické integrování - Obdélníková metoda, jsme si popsali algoritmus pro numerický výpočet integrálu, tedy výpočet obsahu pod křivkou.

Přesnost obdélníkové metody 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

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 - Matematické algoritmy
Jednoduchá lichoběžníková formule - Matematické algoritmy

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 - Matematické algoritmy
Složená lichoběžníková formule - Matematické algoritmy

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ů.

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

V další lekci, Největší společný dělitel (Euklidův algoritmus), si ukážeme Euklidův algoritmus, který najde největšího společného dělitele dvou čísel.


 

Předchozí článek
Algoritmus pro numerické integrování - Obdélníková metoda
Všechny články v sekci
Matematické algoritmy
Přeskočit článek
(nedoporučujeme)
Největší společný dělitel (Euklidův algoritmus)
Článek pro vás napsal Gramli
Avatar
Uživatelské hodnocení:
9 hlasů
Autor se věnuje hlavně jazyku C#
Aktivity