Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

Algoritmus pre numerické integrovanie - Lichobežníková metóda

V minulej lekcii, Gaussova eliminácia a Gauss-Jordanova eliminácia , sme sa zaoberali elimináciou Gaussova a Gauss-Jordanov.

V minulom dieli sme si predstavili obdĺžnikovú metódu, ktorá prekladali daný interval obdĺžnikom. Jej presnosť však nie je ideálne a preto si dnes predstavíme lichobežníková metódu, ktorá je presnejšia. Lichobežníková metóda patrí medzi základné metódy pre numerický výpočet integrálu. Princíp spočíva v tom, že sa daný interval preloží lichobežníkom a spočíta sa jeho obsah. Lichobežníková formula počíta presne pre lineárne polynómy (napr. Priamky), avšak pre kvadratické (napr. Paraboly) nie.

Základná formula

Vzorec jednoduché lichobežníkové metódy - Matematické algoritmy
Jednoduchá lichobežníková formula - Matematické algoritmy

Základné lichobežníková formula spočíva v spojení krajných bodov pomocou priamky a následného spočítanie obsahu pod touto priamkou (obsah lichobežníka). Viď obrázok.

Zložená formula

h = (ba) / n, pričom n je počet podintervalů

h - dĺžka intervalu - udáva dĺžku krivky, ktorú daný interval prekladáme

Vzorec zložené lichobežníkové metódy - Matematické algoritmy
Zložená lichobežníková formula - Matematické algoritmy

Zložená lichobežníková metóda spočíva v tom, že si hlavnú interval <a, b> rozdelíme na niekoľko podintervalů. Na obrázku si rozdeľujem interval <1; 4> na 3 podintervaly: <1; 2>, <2; 3>. <3; 4>, v ktorých aplikujem základný lichobežníkovou metódu. V tomto prípade by však stačil len interval jeden, pretože lichobežník presne kopíruje zadanú funkciu.

Ak však máme zložitejšie krivku, napríklad graf funkcie sínus, použijeme pre presnejší výpočet viac podintervalů -> väčší n. To znamená, že si vzdialenosť medzi bodmi zmenšíme a tým lepšie kopírujeme zadanú krivku.

Výpočet matematicky

Pr: Spočítajte obsah pod krivkou funkcie y (x) = x na intervale <1; 4> pomocou zložené lichobežníkové metódy.

Zadaná funkcia je y (x) = x, to znamená, že keď posadím za x = 1, potom y = 1 viď tabuľka:

iterácie 0 1 2 3
x 1 2 3 4
y 1 2 3 4
Ďalej si funkciu rozdelím na 3 podintervaly, teda n = 3. (<1; 2>, <2; 3>. <3; 4>)

h = (ba) / n = (4-1) / 3 = 1 - po 1 sa nám zvyšuje interval

S = h [0,5 * f (x 0) + f (x 1) + f (x 2) + 0,5 * f (x 3)]

Podľa rovnice musíme vypočítať hodnotu y (x) v bode x

výpočet y (x 0) y (x 1) y (x 2) y (x 3)
y (x) 1 2 3 4
S = 1 [0,5 1 + 2 + 3 + 0,5 * 4] = 7,5

Výsledok podľa lichobežníkové metódy je teda 7,5. V tomto prípade to vyjde presne, pretože máme lineárne funkciu.

Funkcia je zadaná

Ak máme zadanú funkciu, je možné určiť na koľko intervalov si treba danú krivku rozdeliť, aby sme dosiahli požadovanej presnosti. Pre toto môžeme buď použiť vzorec pre výpočet chyby lichobežníkové metódy alebo použiť metódu polovičného kroku, ktorá je presnejšia.

Metóda v C# - pre zadanú funkciu

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 funkcie)

Môže sa stať, že nemáme zadanú funkciu, ale len body xa y. To znamená, že daný bod y je výsledok funkcie. Teda môžeme jednotlivé body y (výsledky funkcia) dosadiť do vzorca a spočítať obsah. Docielime toho, že všetky body, ktoré máme zadané, sú medzi sebou spojené priamkami a pod týmito priamkami je spočítaný obsah. Ak máme dostatok bodov, je metóda relatívne presná. Ak nemáme dostatok bodov a chceme výsledok spresniť, je možné si dopočítať body pomocou interpolácie. U interpolácia si však dávajte pozor akú metódu interpolácie použijete, pretože môže výsledok obsahu pod krivkou i viac znepřesnit.

Metóda v C# - pre zadané body (bez funkcie)

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áver

Lichobežníková metóda je presná pre lineárne funkcie. Použiť sa dá na akúkoľvek funkciu (krivku), pretože ak použijete dostatočný počet intervalov, tak jej presnosť je dostačujúca. Avšak vždy treba premyslieť aj to, či je nutné mať tak veľký počet intervalov.

V ďalšom diele sa pozrieme na Simpsonovej metódu, ktorá nahrádza funkciu na danom intervale polynómom druhého stupňa (parabolou).

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

V ďalšej lekcii, LU rozklad, vlastné čísla a definitnost matíc , sa pozrieme na LU rozklad vrátane jeho aplikácií napríklad pri výpočte determinantu a povieme si niečo málo o vlastných číslach a definitnost matíc.


 

Predchádzajúci článok
Gaussova eliminácia a Gauss-Jordanova eliminácia
Všetky články v sekcii
Matematické algoritmy
Preskočiť článok
(neodporúčame)
LU rozklad, vlastné čísla a definitnost matíc
Článok pre vás napísal Gramli
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje hlavně jazyku C#
Aktivity