Numerická integrace (historický název: (numerická) kvadratura ) je výpočet hodnoty určitého integrálu (obvykle přibližného). Numerická integrace je chápána jako soubor numerických metod pro zjištění hodnoty určitého integrálu.
Numerická integrace se používá, když:
V těchto dvou případech je nemožné vypočítat integrál pomocí Newton-Leibnizova vzorce . Je také možné, že tvar primitivní funkce je tak složitý, že je rychlejší vypočítat hodnotu integrálu numericky.
Hlavní myšlenkou většiny metod numerické integrace je nahradit integrand jednodušším, jehož integrál lze snadno analyticky vypočítat. V tomto případě, pro odhad hodnoty integrálu, vzorce formuláře
kde je počet bodů, ve kterých se vypočítá hodnota integrandu. Body se nazývají uzly metody, čísla jsou váhy uzlů. Když je integrand nahrazen polynomem nula, prvního a druhého stupně, získají se metody obdélníků , lichoběžníků a parabol (Simpson). Často se vzorce pro odhad hodnoty integrálu nazývají kvadraturní vzorce.
Speciálním případem je metoda pro konstrukci integrálních kvadraturních vzorců pro jednotné mřížky, známá jako Cotesovy vzorce . Metoda je pojmenována po Rogeru Coatesovi . Hlavní myšlenkou metody je nahradit integrand nějakým druhem interpolačního polynomu . Po převzetí integrálu můžeme psát
kde se čísla nazývají Cotesovy koeficienty a jsou vypočteny jako integrály odpovídajících polynomů v původním interpolačním polynomu pro integrand na hodnotě funkce v uzlu ( je krok mřížky; je počet uzlů mřížky a index uzlu je ). Termín je chyba metody, kterou lze nalézt různými způsoby. Pro liché lze chybu najít integrací chyby interpolačního polynomu integrandu.
Speciální případy Cotesových vzorců jsou: obdélníkové vzorce ( ), lichoběžníkové vzorce ( ), Simpsonův vzorec ( ), Newtonův vzorec ( ) atd.
Nechť je požadováno určit hodnotu integrálu funkce na intervalu . Tento segment je rozdělen body na stejné segmenty délky Označte hodnotou funkce v bodech Dále tvoříme součty Každý ze součtů je integrálním součtem pro on a tedy přibližně vyjadřuje integrál
Pokud je daná funkce kladná a rostoucí, pak tento vzorec vyjadřuje plochu stupňovitého obrazce složeného z „příchozích“ obdélníků, nazývaných také vzorec levých obdélníků, a vzorce
vyjadřuje plochu stupňovitého obrazce skládajícího se z „odchozích“ obdélníků, nazývaných také vzorec pravých obdélníků. Čím kratší je délka segmentů, na které je segment rozdělen , tím přesnější je hodnota vypočítaná tímto vzorcem požadovaného integrálu.
Je zřejmé, že byste měli počítat s větší přesností, pokud jako referenční bod pro zjištění výšky vezmete bod uprostřed intervalu. V důsledku toho získáme vzorec pro střední obdélníky:
kde
Vzhledem k a priori větší přesnosti posledního vzorce se stejným objemem a povahou výpočtů se nazývá vzorec obdélníků
Pokud je funkce na každém z dílčích segmentů aproximována přímkou procházející konečnými hodnotami, dostáváme metodu lichoběžníku.
Plocha lichoběžníku na každém segmentu:
Chyba přiblížení na každém segmentu:
kdeÚplný vzorec pro lichoběžníky v případě rozdělení celého integračního intervalu na segmenty stejné délky :
kdeChyba lichoběžníkového vzorce:
kdePomocí tří bodů integračního segmentu můžeme nahradit integrand parabolou. Obvykle se jako takové body používají konce segmentu a jeho střed. V tomto případě je vzorec velmi jednoduchý
.Pokud rozdělíme integrační interval na stejné části, pak máme
kde .
Aproximace funkce jedním polynomem přes celý interval integrace zpravidla vede k velké chybě v odhadu hodnoty integrálu.
Pro snížení chyby je integrační segment rozdělen na části a k vyhodnocení integrálu na každé z nich je použita numerická metoda.
Vzhledem k tomu, že počet oddílů má tendenci k nekonečnu, odhad integrálu směřuje ke své skutečné hodnotě pro analytické funkce pro jakoukoli numerickou metodu.
Výše uvedené metody umožňují jednoduchý postup rozpůlení kroku, přičemž v každém kroku je nutné počítat funkční hodnoty pouze u nově přidaných uzlů. K odhadu chyby výpočtu se používá pravidlo Runge .
Výše popsané metody využívají pevné body segmentu (konce a střed) a mají nízký řád přesnosti (0 - metoda pravého a levého obdélníku, 1 - metoda středního obdélníku a lichoběžníku, 3 - parabolová (Simpsonova) metoda). Pokud si můžeme vybrat body, ve kterých počítáme hodnoty funkce , pak můžeme získat metody vyššího řádu přesnosti se stejným počtem výpočtů integrandu. Takže pro dva (jako v lichoběžníkové metodě) výpočty hodnot integrandu můžete získat metodu ne druhého, ale třetího řádu přesnosti:
.V obecném případě pomocí bodů lze vzorec použít k získání metody s řádem přesnosti , tj. přesné hodnoty se získají pro polynomy stupně ne vyššího než .
Hodnoty uzlů Gaussovy metody podle bodů jsou kořeny Legendreho polynomu stupně . Hodnoty vah se počítají podle vzorce , kde je první derivace Legendreho polynomu .
Pro uzly a váhy mají následující význam: váhy:
(polynom je definován na segmentu ).
Nejznámější je Gaussova pětibodová metoda.
Nevýhodou Gaussovy metody je, že nemá jednoduchý (z výpočetního hlediska) způsob, jak odhadnout chybu získané hodnoty integrálu. Použití Rungeova pravidla vyžaduje výpočet integrandu při přibližně stejném počtu bodů, přičemž prakticky nezískává přesnost, na rozdíl od jednoduchých metod, kde se přesnost několikrát zvyšuje s každým novým oddílem. Kronrod navrhl následující metodu pro odhad hodnoty integrálu
,kde jsou uzly Gaussovy metody podle bodů a parametry , , jsou zvoleny tak, že řád přesnosti metody je roven .
K odhadu chyby pak můžete použít empirický vzorec :
,kde je přibližná hodnota integrálu získaného Gaussovou metodou nad body. Knihovny gsl a SLATEC pro výpočet určitých integrálů obsahují rutiny využívající Gauss-Kronrodovu metodu pro 15, 21, 31, 41, 51 a 61 bodů. Knihovna ALGLIB používá metodu Gauss-Kronrod pro 15 bodů.
Čebyševova metoda (nebo jak se jí někdy říká Gauss-Čebyševova) je jednou z představitelů Gaussových metod s nejvyšší algebraickou přesností. Jeho charakteristickým znakem je, že integrand má multiplikátor , tj. podstata je toto:
,kde , , je počet uzlů metody.
Chcete-li integrovat přes nekonečné limity, musíte zavést nejednotnou mřížku, jejíž kroky se zvyšují, jak jdete do nekonečna, nebo můžete provést takovou změnu proměnných v integrálu, po které budou limity konečné. Podobně lze postupovat, pokud je funkce na koncích integračního intervalu singulární.
Viz také Samokish Method .
Chcete-li určit oblast pod grafem funkcí, můžete použít následující stochastický algoritmus:
Tento algoritmus vyžaduje určení extrémů funkce na intervalu a kromě srovnání nepoužívá vypočítanou přesnou hodnotu funkce , a proto je pro praxi nevhodný. Verze metody Monte Carlo uvedené v hlavním článku tyto nedostatky neobsahují.
Pro malý počet dimenzí integrovatelné funkce je výkon integrace Monte Carlo mnohem nižší než výkon deterministických metod. V některých případech, kdy je funkce specifikována implicitně, ale je nutné určit oblast zadanou ve formě komplexních nerovností, může být výhodnější stochastická metoda.
Metody Runge-Kutta - důležitá rodina numerických algoritmů pro řešení obyčejných diferenciálních rovnic a jejich systémů - iterační metody pro explicitní a implicitní přibližný výpočet, vyvinuté kolem roku 1900 německými matematiky K. Rungem a M. V. Kuttou .
V malých rozměrech lze také aplikovat kvadraturní vzorce založené na interpolačních polynomech . Integrace se provádí podobně jako jednorozměrná integrace. Pro velké rozměry se tyto metody stávají nepřijatelnými kvůli rychlému nárůstu počtu bodů mřížky a/nebo komplexní hranici regionu. V tomto případě je použita metoda Monte Carlo . Náhodné body jsou generovány v naší oblasti a funkční hodnoty v nich jsou zprůměrovány. Můžete také použít smíšený přístup - rozdělte oblast na několik částí, z nichž v každé (nebo pouze v těch, kde nelze integrál vypočítat kvůli složité hranici) aplikujte metodu Monte Carlo .
Níže je uvedena implementace metody středního obdélníku, středního lichoběžníku, Simpsonovy metody a metody Monte Carlo v Pythonu 3.
import math , náhodný z numpy import arange def get_i (): return math . e ** 1 - matematika . e ** 0 def method_of_rectangles ( func , min_lim , max_lim , delta ): def integrate ( func , min_lim , max_lim , n ): integrál = 0,0 krok = ( max_lim - min_lim ) / n pro x v rozsahu ( min_lim , max step_lim - krok ) : integrál += krok * func ( x + krok / 2 ) návrat integrálu d , n = 1 , 1 zatímco abs ( d ) > delta : d = ( integrovat ( func , min_lim , max_lim , n * 2 ) - integrovat ( func , min_lim , max_lim , n )) / 3 n * = 2 a = abs ( integrovat ( func , min_lim , max_lim , n )) b = abs ( integrovat ( func , min_lim , max_lim , n )) + d pokud a > b : a , b = b , tisk ( ' Obdélníky :' ) tisk ( ' \t %s \t %s \t %s ' % ( n , a , b )) def trapezium_method ( func , min_lim , max_lim , delta ): def integrate ( func , min_lim , max_lim , n ) : integrál = 0,0 krok = ( max_lim - min_lim ) / n pro x v rozsahu ( min_lim , max_lim - krok ) : integrál += krok * ( func ( x ) + func ( x + krok )) / 2 návratový integrál d , n = 1 , 1 zatímco abs ( d ) > delta : d = ( integrovat ( func , min_lim , max_lim , n * 2 ) - integrovat ( func , min_lim , max_lim , n )) / 3 n * = 2 a = abs ( integrovat ( func , min_lim , max_lim , n )) b = abs ( integrovat ( func , min_lim , max_lim , n )) + d pokud a > b : a , b = b , a print ( 'Trapezium:' ) tisk ( ' \t %s \t %s \t %s ' % ( n , a , b )) def simpson_method ( func , min_lim , max_lim , delta ): def integrate ( func , min_lim , max_lim , n ): integrál = 0,0 krok = ( max_lim - min_lim ) / n pro x v rozsahu ( min_lim + krok / 2 - krok , max_li / 2 , krok ): integrál += krok / 6 * ( func ( x - krok / 2 ) + 4 * func ( x ) + func ( x + krok / 2 )) návratový integrál d , n = 1 , 1 zatímco abs ( d ) > delta : d = ( integrovat ( func , min_lim , max_lim , n * 2 ) - integrovat ( func , min_lim , max_lim , n )) / 15 n * = 2 a = abs ( integrovat ( func , min_lim , max_lim , n )) b = abs ( integrovat ( func , min_lim , max_lim , n )) + d pokud a > b : a , b = b , a print ( 'Simpson:' ) tisk ( ' \t %s \t %s \t %s ' % ( n , a , b )) def monte_karlo_method ( func , n ): in_d , out_d = 0. , 0. for i in arange ( n ): x , y = náhodné . jednotný ( 0 , 1 ), náhodný . uniformní ( 0 , 3 ) , pokud y < func ( x ): in_d += 1 tisknout ( 'MK:' ) tisknout ( ' \t %s \t %s ' % ( n , abs ( in_d / n * 3 ))) method_of_rectangles ( lambda x : math . e ** x , 0,0 , 1,0 , 0,001 ) trapezium_method ( lambda x : math . e ** x , 0,0 , 1,0 , 0,001 ) lambda ** x 0,001 ( lambda ** x , 0,001 ) simpson_method . 1,0 , 0,001 ) monte_karlo_method ( lambda x : math . e ** x , 100 ) tisk ( 'Skutečná hodnota: \n\t %s ' % get_i ())Integrální počet | ||
---|---|---|
Hlavní | ||
Zobecnění Riemannova integrálu | ||
Integrální transformace |
| |
Numerická integrace | ||
teorie míry | ||
související témata | ||
Seznamy integrálů |