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