Numerické algoritmy KAPITOLA 11. Vyhledávání nulových bodů funkcí



Podobné dokumenty
Polynomy a interpolace text neobsahuje přesné matematické definice, pouze jejich vysvětlení

úloh pro ODR jednokrokové metody

Integrace. Numerické metody 7. května FJFI ČVUT v Praze


4 Numerické derivování a integrace

Numerická matematika 1

VYUŽITÍ MATLABU PRO VÝUKU NUMERICKÉ MATEMATIKY Josef Daněk Centrum aplikované matematiky, Západočeská univerzita v Plzni. Abstrakt

Aproximace funkcí. x je systém m 1 jednoduchých, LN a dostatečně hladkých funkcí. x c m. g 1. g m. a 1. x a 2. x 2 a k. x k b 1. x b 2.

9.3. Úplná lineární rovnice s konstantními koeficienty

1 Mnohočleny a algebraické rovnice

Nyní využijeme slovník Laplaceovy transformace pro derivaci a přímé hodnoty a dostaneme běžnou algebraickou rovnici. ! 2 "

Numerické řešení diferenciálních rovnic

Kombinatorická minimalizace

řešeny numericky 6 Obyčejné diferenciální rovnice řešeny numericky

Diferenciální rovnice

Numerická integrace a derivace

pouze u některých typů rovnic a v tomto textu se jím nebudeme až na

INTERPOLAČNÍ POLYNOM. F (x)... hledaná funkce (polynom nebo funkce vytvořená z polynomů), pro kterou platí

MATURITNÍ TÉMATA Z MATEMATIKY

2D transformací. červen Odvození transformačního klíče vybraných 2D transformací Metody vyrovnání... 2

Příklad 1. Řešení 1a Máme určit obsah rovinné plochy ohraničené křivkami: ŘEŠENÉ PŘÍKLADY Z M1A ČÁST 14. a) =0, = 1, = b) =4, =0

Diferenciální rovnice 1

Nalezněte obecné řešení diferenciální rovnice (pomocí separace proměnných) a řešení Cauchyho úlohy: =, 0 = 1 = 1. ln = +,

Soustavy nelineárních rovnic pomocí systému Maple. Newtonova metoda.

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Čebyševovy aproximace

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

VYBRANÉ PARTIE Z NUMERICKÉ MATEMATIKY

Soustavy linea rnı ch rovnic

INTERPOLAČNÍ POLYNOM.... hledaná funkce (polynom nebo funkce vytvořená z polynomů), pro kterou platí

16. Goniometrické rovnice

1 Mnohočleny a algebraické rovnice

8.3). S ohledem na jednoduchost a názornost je výhodné seznámit se s touto Základní pojmy a vztahy. Definice

M - Kvadratické rovnice a kvadratické nerovnice

Digitální učební materiál

Obyčejnými diferenciálními rovnicemi (ODR) budeme nazývat rovnice, ve kterých

10. cvičení - LS 2017

FP - SEMINÁŘ Z NUMERICKÉ MATEMATIKY. Katedra matematiky a didaktiky matematiky Technická univerzita v Liberci

CZ 1.07/1.1.32/

Interpolace, aproximace

Příklad 1/23. Pro rostoucí spojité fukce f(x), g(x) platí f(x) Ω(g(x)). Z toho plyne, že: a) f(x) Ο(g(x)) b) f(x) Θ(g(x)) d) g(x) Ω(f(x))

Hledáme lokální extrémy funkce vzhledem k množině, která je popsána jednou či několika rovnicemi, vazebními podmínkami. Pokud jsou podmínky

Změna koeficientů PDR při změně proměnných

5. Lokální, vázané a globální extrémy

5.3. Implicitní funkce a její derivace

MATEMATIKA II V PŘÍKLADECH

Interpolace, ortogonální polynomy, Gaussova kvadratura

9.5. Soustavy diferenciálních rovnic

MATLAB a numerické metody

- funkce, které integrujete aproximujte jejich Taylorovými řadami a ty následně zintegrujte. V obou případech vyzkoušejte Taylorovy řady

9. přednáška 26. listopadu f(a)h < 0 a pro h (0, δ) máme f(a 1 + h, a 2,..., a m ) f(a) > 1 2 x 1

Řešení nelineárních rovnic

Obyčejné diferenciální rovnice počáteční úloha. KMA / NGM F. Ježek

IB112 Základy matematiky

Důvodů proč se zabývat numerickou matematikou je více. Ze základní školy si odnášíme znalost, že číslo

Matematika I. dvouletý volitelný předmět

M - Kvadratické rovnice

Přednáška 3: Limita a spojitost

Soustavy. Terminologie. Dva pohledy na soustavu lin. rovnic. Definice: Necht A = (a i,j ) R m,n je matice, b R m,1 je jednosloupcová.

Zpracoval: 7. Matematická indukce a rekurse. Řešení rekurentních (diferenčních) rovnic s konstantními koeficienty.

8.4. Shrnutí ke kapitolám 7 a 8

Budeme hledat řešení y(x) okrajové úlohy pro diferenciální rovnici druhého řádu v samoadjungovaném tvaru na intervalu a, b : 2 ) y i p i+ 1

Gymnázium Jiřího Ortena, Kutná Hora

Aplikovaná numerická matematika

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

GEODETICKÉ VÝPOČTY I.

Numerická matematika. Zadání 25. Řešení diferenciální rovnice Rungovou Kuttovou metodou

Kreslení elipsy Andrej Podzimek 22. prosince 2005

B) výchovné a vzdělávací strategie jsou totožné se strategiemi vyučovacího předmětu Matematika.

1. Náhodný vektor (X, Y ) má diskrétní rozdělení s pravděpodobnostní funkcí p, kde. p(x, y) = a(x + y + 1), x, y {0, 1, 2}.

APROXIMACE KŘIVEK V MATLABU NEWTONŮV INTERPOLAČNÍ POLYNOM CURVE FITTING IN MATLAB NEWTON INTERPOLATION POLYNOMIAL

Rekurze. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

metody jsou proto často jedinou možností jak danou diferenciální rovnicivyřešit.

Q(y) dy = P(x) dx + C.

Polynomy. Mgr. Veronika Švandová a Mgr. Zdeněk Kříž, Ph. D. 1.1 Teorie Zavedení polynomů Operace s polynomy...

Matematický seminář. OVO ŠVP Tématický celek Učivo ŠVP Integrace Mezipředmětové vztahy. jejich soustavy. Spojitost funkce v bodě. Limita funkce v bodě

25. KONFERENCE O GEOMETRII A POČÍTAČOVÉ GRAFICE

Numerická matematika Písemky

Jan Kotůlek. verze 3 ze dne 25. února 2011

ÚSTAV MATEMATIKY A DESKRIPTIVNÍ GEOMETRIE. Matematika 0A1. Cvičení, zimní semestr. Samostatné výstupy. Jan Šafařík

2.6. VLASTNÍ ČÍSLA A VEKTORY MATIC

Státní závěrečná zkouška z oboru Matematika a její použití v přírodních vědách

Libovolnou z probraných metod najděte s přesností na 3 desetinná místa kladný kořen rovnice. sin x + x 2 2 = 0.

S funkcemi můžeme počítat podobně jako s čísly, sčítat je, odečítat, násobit a dělit případně i umocňovat.

Digitální učební materiál

Postup při řešení matematicko-fyzikálně-technické úlohy

Extrémy funkce dvou proměnných

ALGEBRA. 1. Pomocí Eukleidova algoritmu najděte největší společný dělitel čísel a a b. a) a = 204, b = 54, b) a = , b =

12. Automatické vyhodnocení derivací. jaro 2012

Test M1-ZS12-2 M1-ZS12-2/1. Příklad 1 Najděte tečnu grafu funkce f x 2 x 6 3 x 2, která je kolmá na přímku p :2x y 3 0.

Příklad 1 ŘEŠENÉ PŘÍKLADY Z M1A ČÁST 12. a) 3 +1)d. Vypočítejte určité integrály: b) 5sin 4 ) d. c) d. g) 3 d. h) tg d. k) 4 arctg 2 ) d.

Základy programování (IZP)

5. Interpolace a aproximace funkcí

Matematika I A ukázkový test 1 pro 2014/2015

Numerické řešení nelineárních rovnic

Maturitní otázky z předmětu MATEMATIKA

Mgr. Karel Pazourek. online prostředí, Operační program Praha Adaptabilita, registrační číslo CZ.2.17/3.1.00/31165.

PRIMITIVNÍ FUNKCE. Primitivní funkce primitivní funkce. geometrický popis integrály 1 integrály 2 spojité funkce konstrukce prim.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Matematická analýza III.

Transkript:

Numerické algoritmy KAPITOLA 11 V této kapitole: Vyhledávání nulových bodů funkcí Iterativní výpočet hodnot funkce Interpolace funkcí Lagrangeovou metodou Derivování funkcí Integrování funkcí Simpsonovou metodou Řešení soustav lineárních rovnic Gaussovou metodou Závěrečné poznámky Desítky let se počítače používaly primárně a hlavně k urychlení výpočtů (mnoho lidí dodnes počítač považuje za výkonnější kalkulačku ). Oblast těchto aplikací je stále aktuální. Měli bychom si však uvědomit, že opakované vymýšlení stejných řešení má jen minimální praktický význam. V uplynulých letech se objevila celá řada hotových programů, které dokáží řešit typické matematické problémy (např. hledat řešení soustav rovnic, interpolovat a aproximovat, integrovat a derivovat, provádět symbolické úpravy atd.). Těm, kdo potřebují používat pokročilé matematické funkce, lze tedy doporučit nákup vhodného nástroje, k nimž patří mj. Matlab (http://www. mathworks.com), Mathcad (http://www.mathsoft.com) nebo Mathematica (http://www.wolfram. com). Tyto softwarové balíky, které občas mívají i bezplatné verze, se neomezují jen na automatizaci výpočtů, ale navíc spolupracují s jinými programovacími jazyky a poskytují grafickou prezentaci výsledků. V této kapitole představíme několik užitečných metod z oblasti numerických algoritmů, které lze potenciálně uplatnit v rámci větších programátorských projektů. Nebudeme příliš zabíhat do matematických důkazů uvedených poznatků, ale pokusíme se ukázat, jakým způsobem je možné numerický algoritmus převést na spustitelný kód jazyka C++. Podoba algoritmů popsaných v této kapitole vychází hlavně z těchto prací: skripta [Kla87] dostupného v Polsku a klasického díla [Knu10]. Čtenářům by však neměly činit potíže ani jiné příručky, které pojednávají o tématu numerických algoritmů, protože jich v posledních letech vyšlo poměrně hodně. Všechny programy přetištěné v této kapitole je nutné brát jako výukové implementace, které poskytují představu o využití jazyka C++ při řešení výpočetních úloh. Méně nároční uživatelé je však mohou převzít jako hotové kuchařské recepty. Vyhledávání nulových bodů funkcí Matematici dosti často stojí před úkolem vyhledat nulové body funkce. Existuje mnoho numerických metod, které umožňují tento úkol vyřešit pomocí počítače. V této kapitole se omezíme na jednu z jednodušších tzv. Newtonovu metodu. Princip této metody zjednodušeně spočívá v systematickém přibližování k nulového bodu pomocí tečen ke křivce, jak je patrné na obrázku 11.1. 259

KAPITOLA 11 Numerické algoritmy Newtonova metoda klade na zkoumanou funkci y = f(x) řadu omezení. V analyzovaném intervalu [a, b] se například nachází právě jeden kořen, funkce na okrajích intervalu nabývá hodnot lišících se znaménkem a její první a druhá derivace v tomto intervalu nemění své znaménko. Obrázek 11.1: Newtonův algoritmus vyhledávání nulových bodů Z hlediska programátora lze Newtonův algoritmus vyjádřit jako iterativní opakování následujících operací (i označuje fázi iterace): stop, jestliže f(z i ) < ε Symbol ε označuje určitou kladnou konstantu (např. 0,00001), která zajišťuje, že se algoritmus zastaví. Úplně na začátku samozřejmě inicializujeme proměnnou z 0 jistou počáteční hodnotou. Navíc potřebujeme znát explicitní rovnice f a f (funkci a její první derivaci) 1. Navrhněme rekurzivní 2 verzi algoritmu, která jako parametry přijímá mj. ukazatele na funkce reprezentující f a f. Podívejme se na příklad, jak lze pomocí Newtonovy metody vypočítat nulové body funkce f(x) = 3x 2 2. Procedura nula přesně odráží schéma, které jsme uvedli na začátku: newton.cpp const double epsilon=0.0001; double f(double x) // funkce f(x)=3x^2-2 return 3*x*x-2; double fp(double x) // derivace f (x)=(3x^2-2) =6x return 6*x; 1 Musíme je do kódu programu v C++ zapsat natvrdo. 2 Všimněme si, že se jedná o příklad tzv. koncové rekurze, kterou lze přirozeným způsobem převést na algoritmicky rovnocennou iterativní verzi. 260

Iterativní výpočet hodnot funkce double nula(double x0, double(*f)(double), double(*fp)(double) ) if(fabs( f(x0) ) <epsilon) return x0; else return nula(x0-f(x0)/fp(x0),f,fp); cout << Nulový bod funkce 3x*x-2 se rovná <<nula(1,f,fp)<<endl; // výsledek 0,816497 Díky ukazatelům na funkci je procedura nula univerzálnější, ale samozřejmě nic nebrání tomu, abychom tyto funkce používali přímo. Iterativní výpočet hodnot funkce S efektivním postupem výpočtu hodnoty mnohočlenů se seznámíme v kapitole 13, kde popíšeme tzv. Hornerovo schéma. Nyní se budeme zabývat algoritmem na iterativní výpočet hodnoty funkce, který se sice v praxi nepoužívá příliš často, ale občas může být užitečný. Předpokládejme, že nás zajímá jistá funkce y = f(x). Převeďme ji do tzv. implicitní formy: F(x, y) = 0. Označme parciální derivaci, která se počítá podle proměnné y, jako F y (x, y), kde F y (x, y) 0 v každé iteraci. S jistým zjednodušením můžeme pomocí Newtonovy metody vypočítat hodnotu pro určité x iterativním způsobem: stop, jestliže y n+1 y n < ε Počáteční hodnota y 0 by měla být co nejbližší hledané hodnotě y. Problém výpočtu hodnoty funkce f(x) jsme v popsané metodě převedli na hledání nulového bodu funkce F(x, y). Výhody Newtonovy metody se projevují zvláště u některých funkcí, jejichž kvocient se může (ale nemusí) značně zjednodušit. Příklad: Pro y = 1/x máme F(x, y) = x 1/y a F y (x, y) = 1/y 2. Z podmínky F(x, y) = 0 dostáváme iterativní vzorec y n+1 = 2y n x(y n ) 2. Výše uvedené vzorce lze vyjádřit následujícím programem v jazyce C++: wartf.cpp const double epsilon=0.00000001; double hodn(double x, double yn) double yn1=2*yn-x*yn*yn; if(fabs(yn-yn1)<epsilon) // fabs = absolutní hodnota return yn1; 261

KAPITOLA 11 Numerické algoritmy else return hodn(x,yn1); cout << Funkce y=1/x má pro x=7 hodnotu <<hodn(7,0.1); // výsledek: 14,2857 Interpolace funkcí Lagrangeovou metodou V předchozích částech této kapitoly jsme často využívali explicitní vzorce funkce a její derivace. Jak ovšem postupovat, disponujeme-li částí grafu funkce (tzn. známe její hodnoty pro konečnou množinu argumentů), případě by výpočet funkce podle vzorce byl vzhledem k jeho složitosti velmi časově náročný? V obou případech si můžeme pomoci metodami tzv. interpolace funkce. Přitom se k funkci přibližujeme pomocí jednodušší funkce (např. mnohočlenu určeného stupně) tak, aby interpolační funkce procházela známými body grafu původní funkce (viz obrázek 11.2). y legenda: F(x) f(x) y 0 y 6 x 0 x 1 x 2 x 3 x 4 x 5 x 6 Obrázek 11.2: Interpolace funkce f(x) pomocí mnohočlenu F(x) x V příkladu znázorněném na obrázku máme k dispozici 7 dvojic (x 0, y 0 ) (x 6, y 6 ) a na jejich základě dokážeme vypočítat mnohočlen F(x), díky němuž lze hodnoty f(x) určovat mnohem snáze (ačkoli občas mohou být výsledky daleko od pravdy). Interpolační mnohočlen lze konstruovat pomocí výpočetně náročného Vandermondova determinantu, který umožňuje najít koeficienty hledaného mnohočlenu 3. Pokud nás ovšem zajímá pouze hodnota funkce v určitém bodě z, existuje prostší a efektivnější Lagrangeova metoda: Navzdory dosti odstrašující formě lze výše uvedený vzorec snadno převést na kód jazyka C++, který obsahuje dva vnořené cykly for. 3 Viz např. https://cs.wikipedia.org/wiki/vandermondova_matice. 262

Derivování funkcí U následujícího výpisu však hrozí riziko dělení nulou (pokud se hodnota z rovná některému z uzlů). Na procvičení můžete uvedenou funkci vylepšit a rozšířit ji o kontrolu vypočítaných hodnot a příslušnou signalizaci chyb. interpol.cpp const int n=3; // stupeň interpolačního mnohočlenu // pole hodnot funkce (y[i]=f(x[i])) double x[n+1]=3.0, 5.0, 6.0, 7.0; double y[n+1]=1.732, 2.236, 2.449, 2.646; // (ve skutečnosti funkce na výpočet kořene z hodnoty x double interpol(double z, double x[n], double y[n]) // vrácení hodnoty funkce v bodě z double wnz=0, om=1, w; for(int i=0; i<=n; i++) om=om*(z-x[i]); w=1.0; for(int j=0; j<=n; j++) if(i!=j) w=w*(x[i]-x[j]); wnz=wnz+y[i]/(w*(z-x[i])); return wnz=wnz*om; double z=4.5; cout << Funkce sqrt(x) má v bodě << z << hodnotu << interpol(z,x,y) <<endl; Derivování funkcí V předchozích částech této kapitoly jsme často využívali vzorce funkce a její derivace, které byly přímo zapsány do kódu C++. Výpočet derivace však občas bývá náročný a pracný. Hodí se proto metody, které tento problém dokáží vyřešit a obejdou se přitom bez explicitního vzoru funkce. Mezi oblíbené metody numerického derivování patří tzv. Stirlingův vzorec. Popis jeho odvození přesahuje rámec této publikace. Předvedeme proto pouze praktické výsledky a do matematických důkazů se nebudeme pouštět. Stirlingův vzorec umožňuje jednoduše vypočítat derivace f a f v bodě x 0 pro jistou funkci f(x), jejíž hodnoty známe v tabulkové formě: (x 0 2h, f(x 0 2h)), (x 0 h, f(x 0 h)), (x 0, f(x 0 )), (x 0 +h, f(x 0 +h)), (x 0 +2h,,0f(x 0 +2h)) Parametr h je jistý stálý krok v oboru hodnot x. Stirlingova metoda využívá tzv. pole centrálních rozdílů, jehož konstrukce je znázorněna na obrázku 11.3. Rozdíly δ se počítají shodným způsobem v celém poli, např.: δ f(x 0 3/2 h) = f(x 0 h) f(x 0 2h) atd. 263

KAPITOLA 11 Numerické algoritmy Přijmeme-li zjednodušený předpoklad, že budeme vždy počítat derivace pro centrální bod x = x 0, nabývají Stirlingovy vzorce následující podoby: x f(x) δ f(x) δ 2 f(x) δ 3 f(x) δ 4 f(x) x 0 2h f(x 0 2h) δ f = (x 0 3/2 h) x 0 h f(x 0 h) δ 2 f(x 0 h) δ f = (x 0 1/2 h) δ 3 f = (x 0 1/2 h) x 0 f(x 0 ) δ 2 f(x 0 ) δ 4 f(x 0 ) δ f = (x 0 + 1/2 h) δ 3 f = (x 0 + 1/2 h) x 0 + h f(x 0 + h) δ 2 f(x 0 + h) δ f = (x 0 + 3/2 h) x 0 + 2h f(x0 + 2h) Obrázek 11.3: Pole centrálních rozdílů v Stirlingově metodě Kontrolních bodů funkce může být samozřejmě mnohem více než 5. Zde se zaměříme na velmi jednoduchý příklad s pěti hodnotami funkce, který vede k poli centrálních rozdílů nízkého řádu. Vzorový program v C++, který počítá derivace určité funkce f(x), může vypadat takto: pochodna.cpp const int n=5; // řád počítaných centrálních rozdílů činí n-1 double t[n][n+1]= 0.8, 4.80, // dvojice (x[i], y[i]) pro y=5x*x+2*x 0.9, 5.85, // (zapsané jsou dva první sloupce, a nikoli řádky) 1, 7.00, 1.1, 8.25, 1.2, 9.60 ; struct DERIVACEdouble f1,f2;; DERIVACE stirling(double t[n][n+1]) // funkce vrací hodnoty f (z) a f (z), kde z je centrálním // prvkem: zde t[2][0]; pole t je nutné předtím centrálně 264

Integrování funkcí Simpsonovou metodou // inicializovat, jeho správnost se nekontroluje DERIVACE res; double h=(t[4][0]-t[0][0])/(double)(n-1); // krok argumentu x for(int j=2;j<=n;j++) for(int i=0;i<=n-j;i++) t[i][j]=t[i+1][j-1]-t[i][j-1]; res.f1=((t[1][2]+t[2][2])/2.0-(t[0][4]+t[1][4])/12.0)/h; res.f2=(t[1][3]-t[0][5]/12.0)/(h*h); return res; DERIVACE res=stirling(t); cout << f = << res.f1 <<, f = << res.f2 <<endl; Když se už zabýváme numerickým derivováním, měli bychom zdůraznit, že je poměrně nepřesné. Čím je hodnota parametru h menší, tím větší vliv na výsledek mají chyby zaokrouhlení. Zvětšování parametru h však odporuje ideji Stirlingovy metody (která má přece napodobovat skutečné derivování!). Stirlingova metoda se nehodí k derivování na okrajích intervalů proměnlivosti argumentu funkce. Pokud vás toto téma zajímá, můžete najít další informace v příslušné literatuře. Téma je totiž širší, než se může zdát. Integrování funkcí Simpsonovou metodou Některé funkce se těžko integrují, protože výpočet jejich integrálu je dosti symbolicky náročný. Abychom dostali požadovaný výsledek, musíme občas provést hodně obtížných transformací (např. substituce, rozklady na posloupnosti atp.). Můžeme si však pomoci interpolačními metodami (které komplikovanou funkci nahradí přibližnou a výpočetně jednodušší formou). Princip numerického integrování je znázorněn na obrázku 11.4. Legenda: interpolační parabola křivka integrandu Obrázek 11.4: Přibližné integrování funkce 265