Úvod do vyšší matematiky pro nematematiky Stručně a srozumitelně Michal Šitina Ústav patologické fyziologie Lékařská fakulta Masarykova univerzita Brno Obsah 1. Stavební kameny matematiky 6 1.1. Množina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.2. Relace, zobrazení, funkce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.3. Komplexní čísla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.4. Umění zanedbat nepodstatné . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2. Úvod do matematické analýzy 12 2.1. Funkce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.1.1. Inverzní funkce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.1.2. Transformace funkcí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.2. Přehled základních funkcí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.2.1. Polynomické funkce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.2.2. Exponenciální a logaritmické funkce . . . . . . . . . . . . . . . . . . . . . 16 2.2.3. Goniometrické funkce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.3. Limita funkce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.4. Derivace funkce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.4.1. Intuitivní představa derivace . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.4.2. Exaktní definice derivace . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.4.3. Derivace elementárních funkcí . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.4.4. Derivace součtu, rozdílu, součinu a podílu . . . . . . . . . . . . . . . . . . 23 2.4.5. Derivace složených funkcí . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.4.6. Derivace inverzních funkcí . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.4.7. Derivace vyššího řádu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.4.8. Geometrický a fyzikální význam derivace . . . . . . . . . . . . . . . . . . 26 2.4.9. Vyšetřování průběhu funkce . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.4.10. Taylorovy řady . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.5. Funkce více proměnných . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.5.1. Parciální derivace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 2.5.2. Vyšší a smíšené parciální derivace . . . . . . . . . . . . . . . . . . . . . . . 37 2.5.3. Vyšetřování průběhu funkce více proměnných . . . . . . . . . . . . . . . . 38 2.5.4. Aplikace funkcí více proměnných a parciálních derivací v biologii . . . . . 40 2.6. Integrální počet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 2.6.1. Idea integrálního počtu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 2.6.2. Neurčitý integrál . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 2.6.3. Metody integrace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 2.6.4. Určitý integrál . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 2.7. Obyčejné diferenciální rovnice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 2.7.1. Idea diferenciální rovnice . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 2.7.2. Základní pojmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 2.7.3. Formulace diferenciální rovnice . . . . . . . . . . . . . . . . . . . . . . . . 55 2.7.4. Homogenní lineární diferenciální rovnice prvního řádu, metoda separace proměnných . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 2 Obsah 2.7.5. Nehomogenní lineární diferenciální rovnice prvního řádu, metoda variace konstant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 2.7.6. Soustavy obyčejných diferenciálních rovnic prvního řádu . . . . . . . . . . 60 2.7.7. Lineární diferenciální rovnice druhého řádu . . . . . . . . . . . . . . . . . 62 3. Poznámky k numerické matematice 68 3.1. Numerické řešení algebraických rovnic . . . . . . . . . . . . . . . . . . . . . . . . 68 3.1.1. Metoda půlení intervalů . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 3.1.2. Metoda prosté iterace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 3.1.3. Newtonova metoda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 3.2. Numerické řešení diferenciálních rovnic . . . . . . . . . . . . . . . . . . . . . . . . 72 3.2.1. Eulerova metoda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 3.2.2. Metoda Rungeho a Kutty . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 3.3. Numerické řešení soustav diferenciálních rovnic . . . . . . . . . . . . . . . . . . . 78 3.3.1. Eulerova metoda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 3.3.2. Runge-Kuttova metoda . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 4. Poznámky k lineární algebře 84 4.1. Vektory a vektorové prostory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 4.1.1. Operace s vektory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 4.2. Matice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 4.2.1. Typy matic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 4.2.2. Operace s maticemi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 4.2.3. Geometrická interpretace násobení vektoru maticí . . . . . . . . . . . . . 92 4.2.4. Příklady aplikací matic . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 4.3. Soustavy lineárních algebraických rovnic . . . . . . . . . . . . . . . . . . . . . . . 94 4.3.1. Gaussova eliminační metoda . . . . . . . . . . . . . . . . . . . . . . . . . . 95 4.3.2. Inverzní matice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 A. Základní programové konstrukty jazyka Python 98 A.1. Obecné poznámky k Pythonu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 A.2. Datové typy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 A.2.1. integer a float . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 A.2.2. string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 A.2.3. boolean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 A.2.4. list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 A.2.5. tuple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 A.2.6. dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 A.3. Importování knihoven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 A.4. Podmínka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 A.5. Cykly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 A.5.1. Cyklus for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 A.5.2. Cyklus while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 A.6. Funkce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 A.7. "Komplexní"příklad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 B. Grafy funkcí v Pythonu 107 B.1. Funkce jedné proměnné . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 B.1.1. Definice zobrazované funkce . . . . . . . . . . . . . . . . . . . . . . . . . . 107 B.1.2. Vytvoření plátna a základního grafu . . . . . . . . . . . . . . . . . . . . . 107 B.1.3. Uložení grafu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 B.1.4. Specifikace podoby grafu funkce . . . . . . . . . . . . . . . . . . . . . . . 110 3 Obsah B.1.5. Více grafů na plátně . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 B.1.6. Nastavení os . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 B.1.7. Formátování grafu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 B.1.8. Styly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 B.2. Funkce dvou proměnných . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 4 Úvod Předkládaný učební text slouží jako skriptum k předmětu „Úvod do vyšší matematiky pro nematematiky - Stručně a srozumitelně“. Budu rád, když text pomůže komukoli, kdo chce poměrně rychle porozumět základům vyšší matematiky. Pojem „vyšší matematika“ je vágní, většinou se jím myslí matematika přesahující středoškolské znalosti. Skriptum tyto znalosti předpokládá, přesto jsou některé důležité jednotlivosti stručně zopakovány. Matematika je dnes široce užívána v mnoha vědních disciplínách, ať už v podobně analýzy dat či v podobě matematického modelování. Mimo klasických oblastí jako jsou fyzika nebo chemie je dnes matematika rozsáhle užívána i v biologii a medicíně, ale i ve společenských vědách jako např. v ekonomii či sociologii. A jistě i v mnoha dalších. Sám se zabývám matematickým modelováním v medicíně. Řada příkladů je proto volena právě z oblasti biologie a medicíny. Základní moto textu je „stručně a srozumitelně“. Učebnice vyšší matematiky bývají psány precizním jazykem pro matematicky vzdělané čtenáře, poněkud rozvlekle, doplněny řadou složitých a málo srozumitelných důkazů. To řadu zájemců o vyšší matematiku po několika stranách zbytečně odradí. Vyšší matematiku lze přitom vcelku do hloubky, přinejmenším pro potřeby aplikovaného matematického modelování, chápat intuitivně, i bez exaktních formulací a formálních důkazů. V našem kurzu budeme postupovat touto méně precizní, intuitivní cestou, přitom ale vždy se snahou o skutečné porozumění. Objasňovat, ilustrovat a procvičovat budeme na mnoha příkladech. Nejprve popíšeme některé základní pojmy matematiky jako jsou množina či zobrazení. Poté se budeme věnovat vybraným oblastem matematické analýzy, zejména problematice funkcí, limit, derivací, integrálů a diferenciálních rovnic. Dále se budeme zabývat vybranými tématy numerické matematiky a na závěr úvodem do lineární algebry. Zejména v kapitolách o numerické matematice zmíníme i implementaci numerických algoritmů v jazyce Python. V dodatku proto budou potřebné konstrukty tohoto jazyka stručně nastíněny. Ve žlutých polích budeme definovat nové pojmy. V modrých polích budeme řešit příklady. Velice děkuji kolegovi Martinu Dvouletému, studentu Lékařské fakulty Masarykovy univerzity v Brně a VUT v Brně, za podrobné pročtení textu a cenné kritické připomínky. Michal Šitina Brno, 2023 5 1. Stavební kameny matematiky V této úvodní kapitole velmi stručně popíšeme některé základní matematické pojmy a představy, které se vyskytují ve všech speciálních oblastech matematiky. Těmto pojmům je nutné dobře rozumět. Učebnice vyšší matematiky bývají psány precizní formou „Definice – Věta – Důkaz“. My budeme postupovat méně precizně, tyto základní pojmy si však přesto krátce objasníme. Definice je přiřazení názvu jisté přesněji vymezené entitě. Definice sama o sobě neobsahuje žádnou novou informaci, žádný poznatek. Definice bývají často psány nepřesně formou implikací, tedy „Pokud platí to a ono, označujeme cosi jako ABC“. Vždy je ve skutečnosti rozuměna ekvivalence, tedy „Právě když platí to a ono, označujeme cosi jako ABC“. Reálná funkce jedné reálné proměnné je každé zobrazení z množiny R do množiny R. V tomto případě jsme entitě „zobrazení z množiny R do množiny R“ přiřadili název „reálná funkce jedné reálné proměnné“. Věta je tvrzení o vlastnostech či vztazích definovaných pojmů. Za každou větou následuje Důkaz, který „krok za krokem“ převádí dříve definované pojmy a již dokázané věty na novou, právě dokazovanou větu. Musíme však „někde začít“. Proto některé věty akceptujeme a priori bez důkazu jako pravdivé. Označujeme je jako axiomy, nebo jako implicitní definice či jako odvozovací pravidla. Pojďme si vše demonstrovat na příkladu Pythagorovy věty. Pythagorova věta Obsah čtverce sestrojeného nad přeponou libovolného pravoúhlého trojúhelníku je roven součtu obsahů čtverců nad oběma jeho odvěsnami. Takto je Pythagorova věta sice formulována „prostým“ jazykem, ale není možná na první pohled zřejmé, že jde o implikaci. Větu můžeme přesněji reformulovat například takto: Pokud je trojúhelník s odvěsnami délek a a b a přeponou délky c pravoúhlý, pak platí a2 + b2 = c2. I kdybychom nyní platnost této věty dokázali, stále nám zbývá možnost, že existují trojúhelníky, pro které sice platí a2 + b2 = c2, ale nejsou pravoúhlé. To však odporuje našim „znalostem a zkušenostem“ s pravoúhlými trojúhelníky. V „plné verzi“ je totiž Pythagorova věta skutečně formulována jako ekvivalence. Právě když je trojúhelník s odvěsnami délek a a b a přeponou délky c pravoúhlý, platí a2 + b2 = c2. Obsahuje tak v sobě vlastně dvě věty: 6 1.1. Množina 1. Pokud je trojúhelník s odvěsnami délek a a b a přeponou délky c pravoúhlý, pak platí a2 + b2 = c2. 2. Pokud pro trojúhelník s odvěsnami délek a a b a přeponou délky c platí a2 + b2 = c2, pak je daný trojúhelník pravoúhlý. Abychom dokázali Pythagorovu větu, musíme dokázat obě věty 1 a 2. Důkazů první části věty „zleva doprava“ je např. na Wikipedii uvedena řada. Ukažme si proto důkaz druhé části „zprava doleva“. Mějme tedy nějaký trojúhelník T s odvěsnami délek a a b a přeponou délky c, pro nějž platí a2 + b2 = c2. Zkonstruujme nyní pomocný pravoúhlý trojúhelník, který má odvěsny délek a a b. Pak je podle 1. části Pythagorovy věty (kterou již berme jako dokázanou) délka jeho přepony c = √ a2 + b2. Oba trojúhelníky, T i pomocný pravoúhlý, tedy mají stejně dlouhé všechny tři strany a jsou tedy shodné. Mají proto shodné i všechny úhly. Proto je dokazovaný trojúhelník T též pravoúhlý. Důkaz je zjevný, přesto však „někde začal“, něco předpokládal. Předem jsme definovali, co znamená pravoúhlý trojúhelník. Použili jsme první část Pythagorovy věty, která musela být předem dokázána. Dále jsme použili tvrzení, že dva trojúhelníky se všemi stejnými stranami jsou shodné. To lze vnímat i jako definici shodnosti. Pak bychom ovšem potřebovali větu, že dva shodné trojúhelníky mají stejné všechny tři úhly. Konečně jsme předpokládali, že délka strany nemůže být záporná, což lze brát jako axiom. 1.1. Množina Množinou rozumíme souhrn jakýchkoli (myšlených či reálných) vzájemně odlišitelných objektů seskupených do jednoho celku. Jednotlivé objekty označujeme jako prvky mno- žiny. Představu množin prvně zformuloval německý matematik Georg Cantor1. Založil oblast matematiky dnes označovanou jako Teorie množin. V originále definuje Cantor množinu takto: Unter einer Menge verstehen wir jede Zusammenfassung M von bestimmten wohlunterschiedenen Objekten m unserer Anschauung oder unseres Denkens (welche die Elemente von M genannt werden) zu einem Ganzen. Původní Cantorovu verzi označujeme jako Naivní teorii množin. Její nedostatky byly odhaleny počátkem 20. století a byla zprecizována v tzv. Axiomatické teorii množin, spojené se jmény Zermelo a Fraenkel. Teorie množin je hlubokým základem matematiky. Tvrdí se, že vše v matematice lze převést na operace s množinami. 1.2. Relace, zobrazení, funkce Často nás zajímá vztah dvou množin A a B, tedy souvislost mezi jednotlivými prvky. Taková souvislost se velmi obecně označuje jako relace. Vztah množin popíšeme tak, že každému prvku 1 Georg Cantor, 1845-1918, německý matematik, založil Teorii množin 7 1. Stavební kameny matematiky jedné množiny přiřadíme některé prvky druhé množiny. Případně nemusí být některému prvku přiřazen žádný prvek. Velmi speciální, ale nejdůležitější relace, kdy každému prvku množiny A přiřadíme právě jeden prvek množiny B, se označuje jako zobrazení nebo jako funkce. Funkce a zobrazení jsou obvykle vnímány jako synonyma. Pokud prvky množiny A označíme x a množiny B y, pak zápis f : A → B; x → y = f(x) znamená zobrazení f z množiny A do množiny B, které každému x ∈ A přiřazuje právě jedno y ∈ B. Množinou A mohou být např. všichni občané České republiky, množinou B reálná čísla (B = R). Zobrazení „měření výšky“ zapíšeme jako měření výšky : občané ČR → R; občan → výška. Jak záhy uvidíme, důležité jsou vlastnosti zobrazení (obr. 1.1 ). Prosté neboli injektivní zobrazení přiřazuje každému x ∈ A odlišné y ∈ B. „Zobrazení na“ neboli surjektivní zobrazení vyčerpává všechny y ∈ B, tedy pro každé y ∈ B existuje prvek x ∈ A, který je na toto y zobrazován. Vzájemně jednoznačné neboli bijektivní zobrazení je současně injektivní i surjektivní. Je tedy každému x ∈ A přiřazeno odlišné y ∈ B, přičemž žádné y ∈ B „nezbyde volné“. Množiny A tak můžeme B spárovat. Pokud je zobrazení f : A → B; x → y = f(x) bijektivní, pak samozřejmě vždy víme, kterému y ∈ B odpovídá které x ∈ A, a můžeme definovat inverzní zobrazení f−1 : B → A; y → x = f−1(y), pro něž platí f−1(f(x)) = x. A B f (a) obecné A B f (b) injektivní A B f (c) surjektivní A B f f−1 (d) bijektivní Obrázek 1.1.: Typy zobrazení z množiny A do množiny B. V centrálním dogmatu molekulární biologie DNA → RNA → proteiny by matematik viděl zobrazení. Definujme množinu E = {A, T, C, G} jako 4 báze DNA a množinu F = {A, U, C, G} jako 8 1.3. Komplexní čísla 4 báze RNA. Zobrazení f : E → F definované předpisem f :    A → U T → A C → G G → C označují biologové jako transkripci. Zobrazení je prosté, a dokonce vzájemně jednoznačné. Proto je možné i inverzní zobrazení, známé jako reverzní transkripce. Translace je zobrazení z množiny všech 64 uspořádaných trojic bází A,U,C,G do množiny 20 aminokyselin. Vlastní přiřazení aminokyseliny trojici určuje genetický kód. translace : množina všech uspořádaných trojic A, U, C, G → 20 aminokyselin Zobrazení není prosté, protože zobrazuje z větší množiny do menší množiny. Biologové tuto vlastnost označují jako degeneraci genetického kódu. Protože zobrazení není prosté, není ani vzájemně jednoznačné a neexistuje reverzní translace. 1.3. Komplexní čísla Známe několik nekonečných množin čísel, např. přirozená čísla N, celá čísla Z, racionální čísla Q nebo reálná čísla R. Nad těmito množinami jsou definované jisté operace, t.j. co můžeme s čísly dělat. Přirozená čísla můžeme sčítat a násobit, přičemž výsledek je opět přirozené číslo, ale nemůžeme např. odečíst větší číslo od menšího. To můžeme provádět s celými čísly, ta ale např. nemůžeme libovolně dělit. K tomu už potřebujeme ještě větší množinu čísel, totiž racionální čísla, která jsou vyjádřitelná zlomkem. Racionální čísla jsou první nekonečnou množinou čísel, s nimiž můžeme provádět všechny běžné operace s čísly a výsledek je vždy racionální číslo. Jak už ale zjistili v antickém Řecku, některá čísla, např. √ 2, mezi racionální nepatří. Pokud racionální čísla obohatíme o tato tzv. iracionální čísla, dostaneme reálná čísla. Na okraj poznamenejme, že iracionálních čísel je mnohem více než čísel racionálních. Kromě reálných čísel ale existuje ještě jedna (a už žádná další!) nekonečná množina poněkud zvláštních čísel, označovaných jako komplexní čísla, s nimiž lze počítat jako s „normálními“ čísly. Neexistuje žádné reálné číslo, které umocněno na druhou dá −1. Definujme proto nějaké nové číslo i, které není reálné, říkejme mu imaginární, pro nějž bude platit i2 = −1. Vezměme dvě reálná čísla a, b ∈ R a definujme nové číslo z jako z = a + bi. Množinu všech takových čísel označme jako komplexní čísla C. Pokud budeme s komplexními čísly „normálně“ počítat, zjistíme, že vše bez problémů funguje. Dvě komplexní čísla vynásobíme např. takto (3 + 2i) . (4 − 3i) = 12 − 9i + 8i − 6i2 = 12 − i − 6.(−1) = 18 − i. Komplexní číslo obsahuje dvě „proměnné“ a a b, dá se proto zobrazit jako bod v plošném grafu, 9 1. Stavební kameny matematiky v tzv. Gaussově2 rovině (obr. 1.2), kdy reálnou část a vynášíme na osu x a imaginární část b na osu y. Velikost neboli absolutní hodnota komplexního čísla ∥z∥ je vzdálenost bodu od počátku, platí ∥z∥ = a2 + b2. Spojnice bodu a počátku svírá s osou x úhel φ, označovaný jako fáze komplexního čísla. Platí proto a = ∥z∥. cos φ a b = ∥z∥. sin φ. Komplexní číslo tedy můžeme vyjádřit pomocí goniometrických funkcí jako z = a + bi = ∥z∥ cos φ + i∥z∥ sin φ = ∥z∥ (cos φ + i sin φ) . Absolutní hodnota ∥z∥ bývá též označována jako amplituda komplexního čísla A. Leonhard Euler3 zjistil mimořádnou souvislost mezi komplexní exponenciální funkcí, kdy exponentem je imaginární číslo, a goniometrickým vyjádřením komplexního čísla. Eulerův vztah, někdy popisovaný jako nejkrásnější vztah matematiky, zní cos φ + i sin φ = eiφ . Poněvadž je, jak uvidíme později, derivování exponenciálních funkcí velmi snadné, usnadní zavedení Eulerova vyjádření některé složitější výpočty, například při řešení diferenciálních rovnic. Odvoďme pomocí Eulerova vyjádření známý vztah cos(a + b) = cos a cos b − sin a sin b. Všimneme si, že cos (a + b) je vlastně reálná část komplexního čísla cos (a + b) + i sin (a + b). Reálnou část označme Re. Pak už je vše snadné. cos (a + b) = Re cos (a + b) + i sin (a + b) = Re ei(a+b) = Re eia .eib = Re (cos a + i sin a).(cos b + i sin b) = Re cos a cos b + i cos a sin b + i sin a cos b + i2 sin a sin b = cos a cos b − sin a sin b 1.4. Umění zanedbat nepodstatné Umění rozpoznat a zanedbat nepodstatné je cenná dovednost v životě i v matematice. V matematice vhodné zanedbání vede ke zjednodušení výrazu bez podstatného nárůstu chyby výsledku. Zanedbat můžeme v součtu, je-li jeden ze sčítanců podstatně menší. V součinu pochopitelně zanedbávat nelze. Pokud je tedy d ≪ x, platí x + d ≈ x. Zanedbat můžeme zejména mocniny malých hodnot. Pokud je totiž d ≈ 0, pak d ≫ d2 ≫ d3 ≫ . . . . Ilustrujme si zanedbávání na následujícím příkladu. 2 Carl Friedrich Gauss, 1777-1855, německý matematik a fyzik 3 Leonhard Euler, 1707-1783, švýcarský matematik a fyzik 10 1.4. Umění zanedbat nepodstatné −1 1 2 −1 1 2 1 + 2i φ ∥z∥ a = 1 b = 2 Re(z) Im(z) Obrázek 1.2.: Komplexní číslo v Gaussově rovině Chceme určit hodnotu výrazu y = x (x + d)2 . Nechť je d ≪ x, např. x = 1 a d = 0, 01. Pak y = 1 (1+0,01)2 = 0, 980296. Pokud bychom zanedbali přímo d, bude výsledek y = 1, vznikne tedy chyba asi 2 %. Úpravou vztahu a zanedbáním druhé mocniny d2 dostaneme y = x (x + d)2 = x x2 + 2dx + d2 ≈ x x2 + 2dx = 1 x + 2d . Po dosazení zjistíme, že y ≈ 1 1+0,02 = 0, 980392. Chyba je zhruba 0, 1 ‰, ale výraz je podstatně jednodušší. Pokud nás snad ještě obtěžuje součet ve jmenovateli, pak výraz rozšíříme a znovu zanedbáme druhé mocniny. y ≈ 1 x + 2d = 1 x + 2d . x − 2d x − 2d = x − 2d x2 − 4d2 ≈ x − 2d x2 Po dosazení máme nyní y ≈ 1−0,02 1 = 0, 98. Už nepotřebujeme ani kalkulačku, a přesto je chyba stále pod 1 ‰. 11 2. Úvod do matematické analýzy 2.1. Funkce Jak už jsme uvedli, jsou pojmy zobrazení a funkce většinou chápány jako synonyma. V užším smyslu rozumíme pod reálnou funkcí jedné reálné proměnné zobrazení f : R → R : x → y = f(x). Některé funkce jsou definované na podmnožině R, např. logaritmická funkce na kladných reálných číslech R+. x a y se označují jako argument a hodnota (či obraz) funkce. Argument pochází z definičního oboru funkce D, x ∈ D, obraz z oboru hodnot H, y ∈ H. Pro uvedenou funkci f tedy platí D(f) = Hf() = R. 2.1.1. Inverzní funkce Funkce f přiřazuje jistému x hodnotu y, y = f (x). Mohla by nás však zajímat i opačná otázka, totiž kterému x byla přiřazena hodnota y (obr. 2.1). Hledáme tedy vlastně funkci, která dělá opak než funkce f. Označujeme ji jako inverzní a značíme f−1. Platí y = f (x) ⇔ x = f−1 (y) . Ne vždy lze inverzní funkci vytvořit. Pokud existuje více hodnot x, jimž funkce f přiřazuje stejné y, pak nemůžeme určit, které x by měla inverzní funkce tomuto y přiřadit. Jak už jsme uvedli v kapitole 1.2, pro invertabilitu musí být funkce f prostá a musí pokrývat celý obor hodnot, x a y tedy musí být vzájemně jednoznačné. Např. funkce y = x2 není prostá v celém definičním oboru D = R. Pokud ji však omezíme na R+, prostá již je a jí odpovídající inverzní funkce je f−1 (x) = √ y. Poznamenejme, že je lhostejné, jakými písmeny označíme argument a obraz, určující pro funkci √ y je √ . Protože je zvykem používat x pro argument a y pro obraz, píšeme obvykle y = f−1 (x) = √ x, a nikoli x = f−1 (y) = √ y. Pokud takto zakreslíme f i f−1 do společného grafu, jsou oba grafy symetrické podle osy prvního a třetího kvadrantu (y = x), poněvadž jsme tak zaměnili x a y. Nakresleme do společného grafu funkci sin x v intervalu [−π/2, π/2] a funkci k ní inverzní, arcussinus (arcsin x). 12 2.1. Funkce -0.5 0.5 1 π/2 0.5 1 f f−1 x y Obrázek 2.1.: Idea inverzní funkce −π/2 -1 -0.5 0.5 1 π/2 −π/2 -1 -0.5 0.5 1 π/2 sin x arcsin x x y Vidíme, že obě funkce jsou skutečně symetrické podle osy prvního a třetího kvadrantu. 2.1.2. Transformace funkcí Drobnou úpravou funkce můžeme dosáhnout úpravy jejího „tvaru“, např. posunout na osách x a y nebo roztáhnout či zúžit. Mějme funkci y = f (x). Novou, transformovanou funkci označme jako g (x). 1. Posunutí na ose y o konstantu c nahoru dosáhneme přičtením c, g (x) = f (x) + c 2. Posunutí na ose x o konstantu c doleva dosáhneme přičtením c v argumentu funkce, g (x) = f (x + c) 3. Zvětšení na ose y k-krát dosáhneme vynásobením funkce konstantou k, g (x) = kf (x) 4. Zkrácení na ose x k-krát dosáhneme vynásobením argumentu funkce konstantou k, g (x) = f (kx) 13 2. Úvod do matematické analýzy Kombinací všech úprav získáme funkci g (x) = af (bx + c) + d, která je oproti původní funkci f posunuta o d nahoru, a-krát roztažena na ose y, b-krát užší na ose x a posunuta na ose x o c/b doleva. Z funkce f(x) = ex vytvořme funkci g(x), která je oproti f(x) posunuta o 1 nahoru, o 1 doleva, dvakrát užší na ose x a třikrát „roztažena“ na ose y. Řešením je funkce g(x) = 3e2(x+1) + 1 = 3e2x+2 + 1. −3 −1 1 2 4 ex 3e2(x+1) + 1 x y 2.2. Přehled základních funkcí Známe řadu tzv. elementární funkcí, z nichž jsou „sestaveny“ ostatní funkce. Funkce x2 + sin x je například „sestavena“ z funkcí x2 a sin x. Existují však i funkce, které nelze takovou kombinací vyjádřit. Např. primitivní funkce (neurčitý integrál) ke Gaussově „zvonové“ funkci, kterou známe ze statistiky, není vyjádřitelná pomocí elementárních funkcí, ačkoli existuje. Jiné funkce, např. exponenciální nebo goniometrické, mohou být formálně definovány pomocí nekonečné řady mocninných funkcí, jak zmíníme později. Dále je uveden krátký přehled vybraných elementárních funkcí, s nimiž se běžně setkáváme. 2.2.1. Polynomické funkce Příklady polynomických funkcí 1.-3. řádu ukazuje obr. 2.2. Nejjednodušší polynomickou funkcí je konstantní funkce y = c. Další v řadě je lineární funkce y = ax + b. Protíná osu y v hodnotě b, kdy platí f(0) = a.0+b = b, a osu x v bodě −b/a, kdy platí 0 = ax+b. a označujeme jako směrnici přímky, platí a = tan φ, značí rychlost růstu přímky. Lineární funkce je prvního řádu, t.j. nejvyšší exponent u x je 1, a funkce protíná osu x v právě 1 bodě. Kvadratická funkce y = ax2 + bx + c je druhého řádu a protíná osu x nejvýše ve 2 bodech, 14 2.2. Přehled základních funkcí −4 −2 2 4 −4 −2 2 4 6 8 0, 3x + 1 0, 6x2 + x − 1 0, 4x3 − x2 − 3x + 4 x y Obrázek 2.2.: Polynomické funkce 1.-3. řádu tzv. kořenech kvadratické rovnice ax2 + bx + c = 0. Jsou jimi x1,2 = −b ± √ b2 − 4ac 2a . V oboru komplexních čísel má kvadratická rovnice vždy 2 řešení. Křivka kvadratické funkce se označuje jako parabola. 1. Určeme průsečíky funkce y = −2x2 + 2x + 24 s osou x. Pro průsečíky musí platit y = −2x2 + 2x + 24 = −2 x2 − x − 12 = −2 (x − 4) (x + 3) = 0. Funkce proto protíná osu x v bodech x1 = 4 a x2 = −3 2. V kterých bodech se protínají funkce f(x) = x2 − x − 2 a g(x) = 3x + 5? Musí platit x2 − x − 2 = 3x + 5 → x2 − 4x − 7 = 0. Funkce se proto protínají ve 2 bodech x1,2 = 4 ± (−4)2 − 4.(−7) 2 = 2 ± √ 11. 3. Řesme rovnici f(x) = x2 + 2x + 2 = 0 v obou komplexních čísel. 15 2. Úvod do matematické analýzy Řešením jsou 2 komplexně sdružené kořeny x1,2 = −2 ± √ 4 − 8 2 = −2 ± √ −4 2 = −2 ± √ 4i2 2 = −2 ± 2i 2 = −1 ± i. Kubická funkce y = ax3 + bx2 + cx + d je třetího řádu a protíná osu x nejvýše ve 3 bodech, kořenech kubické rovnice ax3 + bx2 + cx + d = 0. S rostoucím řádem funkce je „stále obtížnější vymýšlet názvy koeficientů“ a je snazší používat indexy. Můžeme tedy napsat y = a3x3 + a2x2 + a1x + a0. Polynom n-tého stupně je y = anxn + an−1xn−1 + . . . + a2x2 + a1x + a0. Pokud použijeme symbol součtu , můžeme stejný polynom elegantně zapsat jako y = n i=0 aixi . Indexy u symbolu znamenají, že za i postupně dosazujeme hodnoty od 0 do n. Jednotlivé dvojice aixi pak sečteme. Polynom n-tého stupně má n kořenů v oboru komplexních čísel. Pokud máme v rovině n+1 bodů, lze najít polynom n-tého stupně, který bude všemi body přesně procházet. Poznamenejme, že pro součin má obdobný význam symbol . Např. n i=1 i = 1.2.3.....(n − 1).n = n! 2.2.2. Exponenciální a logaritmické funkce Řadu biologicky významných procesů, jako např. eliminaci léku ledvinami či rozpad radiofarmaka, lze popsat exponenciální funkcí y = ax. Jako a se často používá Eulerovo číslo1 e ≈ 2, 718, tedy y = ex. Exponenciální funkce, viz obr. 2.3, roste extrémně rychle. Inverzní k exponenciální funkci je logaritmická funkce y = loga x, viz obr. 2.3. a se označuje jako základ logaritmu. Platí y = ax ⇔ x = loga y. Pokud a = e, označujeme logaritmus jako přirozený a značíme ln, tedy y = ln x. Dekadický logaritmus má základ a = 10 a značí se log. Biologům je logaritmus dobře známý z definice pH; pH = − log [H+]. 1 Leonhard Euler, 1707-1783, švýcarský matematik a fyzik 16 2.2. Přehled základních funkcí −4 −2 2 4 6 −4 −2 2 4 6 y = x f(x) = ex f−1(x) = ln x x y Obrázek 2.3.: Exponenciální a logaritmická funkce Též dobře známé jsou vztahy pro logaritmus součinu a podílu ln xy = ln x + ln y ln x y = ln x − ln y Pro zábavu odvodíme vztah pro součet. Protože eln x = x, platí eln x+ln y = eln x .eln y = xy = eln xy . Protože je ex prostá funkce, plyne z rovnosti exponentů dokazovaný vztah. V následujícím příkladu si ukážeme jednak práci s logaritmy, jednak důležitost vhodného zane- dbání. Jaké je pH roztoku kyseliny octové CH3COOH o koncentraci c = 0.0001 mol/l a disociační konstantě Ka = 1, 75.10−5? V roztoku kysliny octové souběžně probíhá částečná disociace kyseliny a částečná disociace vody podle následujících rovnic: CH3COOH KA ⇌ CH3COO− + H+ H2O Kw ⇌ H+ + OH− Pojďme dále pro stručnost zápisu označovat CH3COO− jako A− a CH3COOH jako HA. Rovnice tedy zní HA KA ⇌ A− + H+. Veškeré H+ vznikají první nebo druhou reakcí. Z první reakce ve stejném množství vzniká 17 2. Úvod do matematické analýzy A−, z druhé OH−. Musí proto platit [H+ ] = [A− ] + [OH− ]. Tato podmínka je ekvivalentní požadavku elektroneutrality. Ze zákona zachování dále plyne podmínka c = [HA] + [A−]. Disociační konstanta, jak známo, je rovnovážná konstanta, která charakterizuje disociaci kyseliny takto: Ka = [H+].[A−] [HA] . Pokud použijeme pravidla pro logaritmování a vynásobíme celou rovnici −1, dostaneme − log Ka = − log [H+ ] − log [A−] [HA] . Podle definice je přitom pH = − log [H+] a pKa = − log Ka. Získali jsme tedy rovnici pH = pKa + log [A−] [HA] , což je v biologii a medicíně dobře známá Henderson-Hasselbalchova rovnice. Ta nám ovšem pro naši úlohu bohužel není nic platná. Obdobně iontový součin vody Kw = 10−14 charakterizuje disociaci vody rovnicí Kw = [H+].[OH−]. Dostáváme tak soustavu 4 rovnic, které všechny musí platit zároveň: [H+ ] = [A− ] + [OH− ] c = [HA] + [A− ] Ka = [H+].[A−] [HA] Kw = [H+ ].[OH− ] Pokud dosadíme za proměnné z jedné rovnice do druhé, dostaneme pro [H+] obtížně řešitelnou kubickou rovnici. Pomůže nám ale vhodné zanedbání. Uvědomme si, že voda disociuje mnohem méně než kyselina octová, protože Kw ≪ Ka. Proto je také [OH−] ≪ [A−] a téměř platí [H+] = [A−]. Tím se nám rovnice zjednoduší na [H+ ] = [A− ] Ka = [H+].[A−] c − [A−] Pak už máme Ka = [H+]2 c − [H+] , odkud pro [H+] platí [H+ ] = 1 2 −Ka + K2 a + 4Kac . Hodnota [H+] tedy vychází 3, 4.10−5 mol/l a pH = 4,77. Kdybychom šli se zanedbáním ještě dále a mysleli si, že disociuje pouze velmi malá část kyseliny, mohli bychom psát c − [A−] ≈ c. Pak je rovnice vůbec jednoduchá: [H+]2 = Kac a [H+] = √ Kac. pH pak vychází 4,38. To už je chyba poměrně značná. Předpoklad o 18 2.3. Limita funkce −7.85 −6.28 −4.71 −3.14 −1.57 1.57 3.14 4.71 6.28 7.85 −1 −0.5 0.5 1 f(x) = sin xf(x) = cos x x y Obrázek 2.4.: Goniometrické funkce velmi nízké disociaci totiž nebyl opodstatněný. Ale jako tzv. „kvalifikovaný odhad“ to není špatné. 2.2.3. Goniometrické funkce Pro popis periodických dějů se používají goniometrické funkce sinus a cosinus (obr. 2.4), které se liší pouze posunutím o π/2 na ose x. Obě funkce jsou periodické s periodou 2π. Připomeňme si krásný již zmíněný Eulerův vztah mezi komplexními čísly, goniometrickými funkcemi a exponenciální funkcí cos φ + i sin φ = eiφ . 2.3. Limita funkce Limita funkce je první téma tradičně řazené do vyšší matematiky. Intuitivně zformulováno představuje limita funkce v bodě x0 hodnotu, jakou by funkce v bodě x0 nabyla, kdyby se v tomto bodě chovala stejně, jako se chová v jeho blízkém okolí. Limitu funkce f „pro x jdoucí k x0“ značíme lim x→x0 f(x). Limita tedy nemluví o skutečném chování funkce v bodě, nýbrž o hypotetickém chování, které plyne z chování funkce v blízkém okolí. Z grafů na obr. 2.5 je zřejmých několik možností „vztahu“ limity v bodě k průběhu funkce: (a) Funkce je v bodě x0 definovaná a je spojitá. Zprava i zleva se funkce blíží k hodnotě f(x0). Limita funkce v tomto bodě je tedy stejná jako hodnota funkce sama, limx→x0 f(x) = f(x0). 19 2. Úvod do matematické analýzy (b) Funkce není v bodě x0 definovaná, ale míří zleva i zprava ke stejné hodnotě. Pak má v bodě limitu, ačkoli zde není definovaná. To pro limitu není problém, poněvadž odvozuje hodnotu v bodě na základě chování v jeho okolí. Příkladem je funkce sin x x v bodě nula. Tam funkce pochopitelně není definovaná, ale přesto zde má limitu. Jak později uvidíme, lim x→0 sin x x = 1 (c) Funkce je v bodě x0 definovaná, má ale jinou hodnotu, než předpovídá její chování v okolí. Proto má limita jinou hodnotu, než je hodnota funkce, limx→x0 f(x) ̸= f(x0) (d) Funkce je v bodě x0 definovaná, ale chování funkce zprava a zleva se liší (liší se limita zprava a limita zleva). Proto nelze limitu definovat. x0 2 4 f(x) = sin xos x x y (a) limx→x0 f(x) = f(x0) x0 2 4 f(x) = sin xf(x) = cos x x y (b) limx→x0 f(x) existuje x0 2 4 f(x) = sin xos x x y (c) limx→x0 f(x) ̸= f(x0) x0 2 4 f(x) = sin xf(x) = cos x x y (d) limx→x0 f(x) není definovaná Obrázek 2.5.: Různé případy limity funkce v bodě x0 Ve většině případů je určení limity snadné, stačí pouze dosadit x0 za x, např. lim x→0 x3 + 2x2 + 4 = 03 + 2.02 + 4 = 4. 20 2.4. Derivace funkce Jindy však prosté dosazení vede k neurčitému v 0 0 nebo ∞ ∞ . Např. lim x→1 x2 − 2x + 1 x2 − 1 = 0 0 =? Pak je třeba výraz nejprve vhodně upravit. Určeme následující limitu. lim x→1 x2 − 2x + 1 x2 − 1 = lim x→1 (x − 1)2 (x + 1)(x − 1) = lim x→1 x − 1 x + 1 = 0 2 = 0 2.4. Derivace funkce Limita funkce by byla akademickou záležitostí, kdyby nebylo jedné zásadní aplikace, totiž derivace funkce. Derivace funkce je speciálním případem limity. Určuje rychlost růstu funkce. Nejprve si ukážeme, co derivace je, poté jak ji spočítáme, a nakonec k čemu je užitečná. 2.4.1. Intuitivní představa derivace Chceme posoudit, jak rychle narůstá funkce f(x) v bodě x0, viz obr. 2.6. Řešení je v principu zřejmé: přiložíme k funkci v bodě [x0, f(x0)] tečnu (červená přímka na obrázku) a určíme úhel α, který svírá s osou x, případně její směrnici tan α. Jak ale tuto tečnu a její směrnici určit? Můžeme najít přibližné řešení. Z obrázku je vidět, že směrnice tan α modré úsečky, spojující body [x0, f(x0)] a [x0 + ∆x, f(x0 + ∆x)], je jen o trochu vyšší než sklon tečny. Platí tedy tan α ≈ tan α′ = ∆y ∆x = f(x0 + ∆x) − f(x0) ∆x . Dále je jasné, že se modrá a červená přímka budou postupně přibližovat, jak klesá ∆x, až v limitním přechodu pro limx→x0 splynou. tan α = lim ∆x→0 ∆y ∆x = lim ∆x→0 f(x0 + ∆x) − f(x0) ∆x 2.4.2. Exaktní definice derivace V definici derivace se často místo symbolu ∆x používá h. Derivace funkce v bodě x se značí f′(x) nebo df(x) dx . Derivace funkce f v bodě x je definovaná jako f′ (x) ≡ df(x) dx := lim h→0 f(x + h) − f(x) h Symboly ≡ i := znamenají definiční rovnost, tedy vlastně pojmenování něčeho něčím. Nejde o rovnici, kterou bychom měli řešit. 21 2. Úvod do matematické analýzy 1 2 3 2 4 f(x) ∆x ∆y α α′ x y Obrázek 2.6.: Derivace funkce f(x) v bodě x0 = 2 Derivace je právě tím případem limity, kdy prosté dosazení vede k neurčitému výrazu typu 0 0. Je proto nejprve potřeba použít nějakou úpravu či „trik“. Pro derivaci funkce x2 nap59klad vychází dx2 dx = lim h→0 (x + h)2 − x2 h = (x + 0)2 − x2 h = 0 0 =? Po předchozí úpravě však dostaneme dx2 dx = lim h→0 (x + h)2 − x2 h = lim h→0 x2 + 2hx + h2 − x2 h = lim h→0 2hx + h2 h = lim h→0 2x + h = 2x Symbol d, který se používá ve značení derivace df(x) dx , vznikl jako vyjádření velmi malého ∆, dx = lim∆x→0 ∆x. Derivace je tak podíl dvou velmi malých rozdílů. d se často označuje jako diferenciál, ačkoli tento pojem má v matematice přesnější význam. Někdy lze s těmito diferenciály „normálně počítat“, jak uvidíme u derivace inverzní funkce. Všimněme si, že když funkci zderivujeme v každém bodě, dostaneme v každém bodě nějakou hodnotu, čímž je vlastně definována nová funkce. Derivace tedy přiřazuje jedné funkci jinou funkci, jde o zobrazení. Zatímco je funkce zobrazení z množiny čísel do množiny čísel, je derivace zobrazení z množiny funkcí do množiny funkcí. To pro nás však není úplná novinka, vždyť např. násobení funkce konstantou nebo umocnění funkce na druhou je též zobrazení z množiny funkcí do množiny funkcí. 22 2.4. Derivace funkce 2.4.3. Derivace elementárních funkcí Lze odvodit následující vztahy pro derivace elementárních funkcí. k je libovolná konstanta. k′ = 0 k.f(x) ′ = k.f′ (x) (xn )′ = n.xn−1 (sin x)′ = cos x (cos x)′ = − sin x (ex )′ = ex Zde vidíme unikátnost Eulerova čísla e jako základu exponenciální funkce. Derivace exponenciální funkce se základem e má totiž v každém bodě stejnou hodnotu jako funkce sama. Určeme derivaci funkce 5x3. 5x3 ′ = 5. x3 ′ = 5.(3x2 ) = 15x2 2.4.4. Derivace součtu, rozdílu, součinu a podílu Pro derivaci součtu, rozdílu, součinu a podílu platí f(x) + g(x) ′ = f′ (x) + g′ (x) f(x) − g(x) ′ = f′ (x) − g′ (x) f(x).g(x) ′ = f′ (x).g(x) + f(x).g′ (x) f(x) g(x) ′ = f′(x).g(x) − f(x).g′(x) g2(x) Derivace součtu sin2 x + cos2 x ′ = 2 sin x. cos x + 2 cos x.(− sin x) = 0 Výsledek nás samozřejmě nepřekvapil. Však víme, že derivace konstanty je nula a že sin2 x + cos2 x = 1. Derivace součinu Podobně si ověříme pravidlo pro derivaci mocninné funkce, neboť x5 .x4 ′ = 5x4 .x4 + x5 .4x3 = 5x8 + 4x8 = 9x8 = x9 ′ . Derivace podílu ex sin x ′ = ex sin x − ex cos x sin2 x 23 2. Úvod do matematické analýzy Vidíme, že derivace součtu (či rozdílu) je součet derivací a derivace násobení konstantou je násobení derivace konstantou. Kombinace těchto dvou vlastností se v matematice vyskytuje často, je výsadní vlastností a je označovaná jako linearita. Derivace je tedy lineární zobrazení. Linearita je příjemná vlastnost, protože zjednodušuje výpočty. Naproti tomu např. „umocnění funkce na druhou“ není lineární zobrazení, protože (x + y)2 ̸= x2 + y2. 2.4.5. Derivace složených funkcí Složenou funkcí f(g(x)) se rozumí kombinace dvou (nebo více) funkcí f(x) a g(x), kdy jedna z nich je „uvnitř“ druhé. Výsledek vnitřní funkce je argumentem vnější funkce. Ve výrazu f(g(x)) je f vnější a g vnitřní funkce. Např. funkce sin x2 je složená, vnitřní funkce je x2, vnější funkce je sin. Argumentem vnější funkce je celý výraz x2. Složenou funkci zderivujeme takto: f(g(x)) ′ ≡ df(g(x)) dx = f′ (g(x)).g′ (x) Slovy formulováno: „Derivace složené funkce je derivace vnější funkce krát derivace vnitřní funkce“. Vnější funkci přitom derivujeme podle vnitřní funkce a vnitřní funkci podle proměnné. Pravidlo je nutno uplatnit opakovaně, pokud je vnořeno více úrovní funkcí. Zní to velmi komplikovaně. Pokud se však na derivaci díváme jako na podíl dvou diferenciálů, s nimiž, jak jsme již zmínili, můžeme „normálně počítat“, pak komplikovanost rychle zmizí. Zkusme vynásobit derivaci „speciální“ jedničkou, 1 = dy dy , a diferenciály ve jmenovatelích přeskupit. Výsledek vnitřní funkce označme jako y, tedy y = g(x). df dx = df dx .1 = df dx . dy dy = df dy . dy dx To už je jasné. df dy je derivace vnější funkce podle vnitřní funkce, dy dx je derivace vnitřní funkce podle proměnné. Derivace složené funkce Zderivujme funkci ex2−2x. Vnější funkce je „e na něco“, její vnitřní funkcí je x2 − 2x. ex2−2x ′ = ex2−2x .(2x − 2) Nyní budeme derivovat funkci sin3 x2. Tato funkce je složena ze 3 funkcí. Vnější funkcí je „něco na třetí“, její vnitřní funkcí je sin, který má dále svou vlastní vnitřní funkci x2. Opakovaně aplikuje pravidlo „derivace vnější funkce krát derivace vnitřní funkce“. sin3 x2 ′ = 3 sin2 x2 . sin x2 ′ = 3 sin2 x2 . cos x2 x2 ′ = 3 sin2 x2 . cos x2 .2x 24 2.4. Derivace funkce 2.4.6. Derivace inverzních funkcí Derivace funkce f−1(x) inverzní k funkci f(x) je rovna převrácené hodnotě derivace funkce f(x) v bodě f−1(x). f−1 (x) ′ = 1 f′ f−1(x) To zní opět velmi komplikovaně. Trik s podílem dvou diferenciálů vše opět ozřejmí. Pokud y = f−1(x), pak x = f(y) a platí dy dx = 1 dx dy . dy dx je derivace funkce f−1, kterou zde považujeme za „inverzní“, a dx dy je derivace funkce f. Pouze je třeba dosadit odpovídající hodnoty argumentů obou funkcí, jak objasní následující příklad. Derivace logaritmu Princip si nejprve ukážeme na derivaci logaritmu ln x, tedy inverzní funkci k ex, kterou už zderivovat umíme. (ln x)′ = 1 (ex)′ [ln x] = 1 ex[ln x] = 1 eln x = 1 x Výraz v hranatých závorkách znamená „v bodě“, např. [ln x] znamená v bodě [ln x]. Derivace odmocniny Podobně můžeme zderivovat druhou odmocninu, která je pro x ≥ 0 inverzní funkcí k x2. √ x ′ = 1 x2 ′ [ √ x] = 1 2x[ √ x] = 1 2 √ x Odmocninu můžeme derivovat i jako mocninou funkci podle vztahu (xn)′ = nxn−1, čímž si ověříme správnost předchozího výsledku. √ x ′ = x 1 2 ′ = 1 2 x−1 2 = 1 2 √ x 2.4.7. Derivace vyššího řádu Dosud jsme popsali derivaci prvního řádu, tzv. první derivace, která popisuje rychlost růstu funkce. Derivace sama je ovšem též funkcí a je proto (většinou) možné ji znovu derivovat. Získáme tak druhé, třetí a další derivace, které se značí f′′(x), f′′′(x) nebo d2f(x) dx2 , d3f(x) dx3 . N-tá derivace je f(n)x nebo dnf(x) dxn . Třetí derivace d3xex dx3 ≡ [xex ]′′′ = [ex + xex ]′′ = [2ex + xex ]′ = 3ex + xex = ex (x + 3) 25 2. Úvod do matematické analýzy 2.4.8. Geometrický a fyzikální význam derivace Geometrický význam derivace první derivace jsme již naznačili. Jde o směrnice tečny ke grafu funkce, určuje tedy strmost nárůstu funkce v daném bodě. Pokud funkce popisuje závislost nějaké proměnné na čase, určuje derivace okamžitou rychlost změny této proměnné v daný okamžik. Pokud je proměnnou například dráha s(t), kterou cyklista do doby t ujel, pak okamžitá rychlost cyklisty v čase t je v = ds(t) dt . Pokud c(t) je koncentrace léčiva v plazmě v čase t, pak − dc(t) dt . je okamžitá rychlost poklesu plazmatické koncentrace léčiva. Fyzikálním významem druhé derivace je zrychlení. Nechť je s(t) opět dráha, kterou cyklista ujel do doby t. Jeho okamžitá rychlost je v = ds(t) dt . Zrychlení a je nárůst okamžité rychlosti v čase, proto a = dv(t) dt = d2s(t) dt2 . Druhá derivace je pro fyziku velmi důležitá, protože jeden ze základních zákonů fyziky, druhý Newtonův zákon, popisuje vztah síly a zrychlení, tedy síly a druhé derivace polohy. F = m.a = m. d2s(t) dt2 Druhá derivace též popisuje oscilace a vlnění, jak uvidíme později. Geometrickým významem druhé derivace je míra „zakřivení“ funkce, tzv. konvexity (nebo konkavity) funkce. Popisuje, jak rychle se mění chování funkce. Například funkce y = ax+b popisuje přímku, parametr a udává její strmost. Chování přímky se ale nemění, roste pořád stejně. Tomu odpovídá skutečnost, že druhá derivace je nulová a nezávisí na strmosti přímky. Pokud se strmost funkce, která je sama první derivací, naopak rychle mění, musí mít derivace strmosti, tedy vlastně druhá derivace funkce, vysokou hodnotu. 2.4.9. Vyšetřování průběhu funkce Věnujme se nyní možnostem vyšetření průběhu funkce pomocí první a druhé derivace. Nulová první derivace v bodě x0 značí, že v tomto bodě nastává jedna ze 3 situací - lokální minimum, 26 2.4. Derivace funkce lokální maximum nebo tzv. inflexní bod (obr. 2.7). Situace rozlišíme pomocí druhé derivace. df(x0) dx = 0 a zároveň    d2f(x0) dx2 > 0. . . lokální minimum d2f(x0) dx2 = 0. . . inflexní bod d2f(x0) dx2 < 0. . . lokální maximum První derivace funkce je v (lokálním) maximu i minimu nulová. V lokálním minimu se tvar funkce, „údolí“, označuje jako konvexní, strmost roste a druhá derivace je kladná. Vysoká kladná druhá derivace znamená ostré minimum, nízká druhá derivace pak ploché minimum. V lokálním maximu se funkce označuje jako konkávní, druhá derivace je záporná. Inflexní bod leží „právě mezi“ maximem a minimem, první i druhá derivace jsou zde proto nulové. Maximum a minimum se souhrnně označují jako extrémy. Pro úplnost poznamenejme, že rozlišujeme globální a lokální extrémy. Globální extrém je nejvyšší nebo nejnižší bod křivky. Lokální extrémy jsou všechny body, které splňují výše uvedené charakteristiky. 1 2 1 2 3 f′(x) = 0 f′′(x) > 0 x y (a) Lokální minimum 1 2 1 2 f′(x) = 0 f′′(x) = 0 x y (b) Inflexní bod 1 2 −1 1 2 f′(x) = 0 f′′(x) < 0 x y (c) Lokální maximum Obrázek 2.7.: Vyšetření průběhu funkce Určeme lokální minima a lokální maxima následujících funkcí: 1. f1(x) = x2. cos x pro x ∈ [−2, 2] Pro extrémy a inflexní body musí platit f′ 1(x) = 2x cos x − x2 sin x = 0. Zjevným řešením je x1 = 0. Po vydělením x dostaneme 2 cos x = x sin x, což je nelineární rovnice, 2 řešení jsou přibližná, x2 ≈ 1, 08 a x3 = −x2 ≈ −1, 08. Pro zjištění typu extrému potřebujeme hodnotu 2. derivace v bodech x1, x2 a x3. f′′ 1 (x) = 2 cos x − 2x sin x − 2x sin x − x2 cos x Pro x1 = 0 platí f′′ 1 (0) = 2 cos 0 = 2 > 0, x1 je tedy lokální minimum. Upozorňuji, že jde o lokální minimum, nikoli o globální minimum. Pro body x2 x3 dosadíme podmínku extrému 2 cos x = x sin x a získáme f′′ 1 (x) = x sin x − 2x sin x − 2x sin x − x2 cos x = −3x sin x − x2 cos x. Protože x a sin x mají v intervalu (−π, π) stejné znaménko, je pro x2 i x3 x sin x > 0, stejně tak i x2 cos x > 0. Proto f′′ 1 (x2) < 0 i f′′ 1 (x3) < 0, oba body jsou tedy lokálními 27 2. Úvod do matematické analýzy maximy. 2. f2(x) = e−(x−4)2 Jediným řešením podmínky f′ 2(x) = −2(x − 4).e−(x−4)2 = 0 je x = 4. f′′ 2 (x) = −2.e−(x−4)2 + 4(x − 4)2 .e−(x−4)2 Pro x = 4 je f′′ 2 (4) = −2.e0 = −2 < 0, jde tedy o maximum. 3. f3(x) = x3 + 3x2 + 1 f′ 3(x) = 3x2 + 6x = 0. Řešením jsou x1 = 0 a x2 = −2. Platí f′′ 3 (x) = 6x + 6, tedy f′′ 3 (0) = 6 > 0 a f′′ 3 (−2) = −6 < 0. x1 je lokální minimum, x2 lokální maximum. −2 −1 1 2 −1 1 x y f1(x) = x2. cos x 2 3 4 5 6 7 0.5 1 x y f2(x) = e−(x−4)2 −3 −2 −1 1 −2 2 4 x y f3(x) = x3 + 3x2 + 1 2.4.10. Taylorovy řady Mějme za cíl přibližně nahradit nějakou složitou funkci f(x) v bodě x0 a jeho blízkém okolí jinou, jednodušší funkcí g(x). Například funkci f(x) = ex můžeme v okolí bodu x0 = 0 aproximovat funkcí g(x) = 1 + x + x2 2 + x3 6 , jak ukazuje obr. 2.8. Vidíme, že v blízkém okolí bodu x0 = 0 je aproximace téměř přesná. Taylorovy řady či Taylorův rozvoj používají jakožto aproximující funkci g(x) polynom. Pokusme se tedy nyní aproximovat obecnou funkci f(x) v okolí bodu x0 polynomem řádu n „centrovaným“ do bodu x0, tedy funkcí g(x) = a0 + a1(x − x0) + a2(x − x0)2 + a3(x − x0)3 . . . + a(x − x0)n = n i=0 ai(x − x0)i . Chceme, aby se v bodě x0 shodovaly hodnoty obou funkcí i všech jejich (prvních) n derivací. Požadujeme proto platnost následujících rovností: f(x0) = g(x0) f′ (x0) = g′ (x0) f′′ (x0) = g′′ (x0) ... f(n) (x0) = g(n) (x0) 28 2.4. Derivace funkce −2 −1 1 1 2 3 4 5 f(x) = ex g(x) = 1 + x + x2 2 + x3 6 x y Obrázek 2.8.: Aproximace funkce ex polynomem Spočítejme všechny potřebné derivace funkce g: g′ (x) = a1 + 2.a2(x − x0) + 3.a3(x − x0)2 . . . + n.an(x − x0)n−1 g′′ (x) = 2.a2 + 3.2.a3(x − x0) . . . + n.(n − 1).an(x − x0)n−2 g′′′ (x) = 3!.a3 + 4.3.2.a4(x − x0) . . . + n.(n − 1).(n − 2).an(x − x0)n−3 ... g(k) (x) = k!.ak + (k + 1)!.ak+1(x − x0) . . . + n(n − k + 1).an(x − x0)n−k ... g(n) (x) = n!.an Dosadíme nyní derivace v bodě x0 do požadovaných rovností. Hrůza opadne, jakmile si uvědomíme, že pro x = x0 jsou všechny členy obsahující x − x0 nulové, čímž zmizí. Dostaneme tedy jednoduché vztahy f(x0) = a0 f′ (x0) = a1 f′′ (x0) = 2a2 f′′′ (x0) = 3!a3 ... f(n) (x0) = n!.an Tudíž a0 = f(x0), a1 = f′(x0), a2 = f′′(x0) 2 , . . ., an = f(n)(x0) n! . Dospěli jsme tak k požadovanému 29 2. Úvod do matematické analýzy polynomu g(x) = n i=0 f(i)(x0) i! (x − x0)i = f(x0) + f′ (x0)(x − x0) + f′′(x0) 2 (x − x0)2 + f′′′(x0) 6 (x − x0)3 . . . + f(n) n! (x0)(x − x0)n Co kdybychom se neomezili na polynom řádu n a shodu v n derivacích, ale použili bychom hned polynom řádu ∞, tedy nekonečnou mocninnou řadu? Opět budeme požadovat shodu v bodě x0 i ve všech (nekonečně mnoha) derivacích v bodě x0. Pak dostaneme polynom g(x) = ∞ i=0 f(i)(x0) i! (x − x0)i Lze ukázat, že za určitých podmínek pro některé funkce f(x) polynom g(x) konverguje k funkci f(x) ve všech bodech x, tedy že lze funkci f(x) zcela a všech bodech nahradit tímto polynomem g(x). Platí pak f(x) = ∞ i=0 f(i)(x0) i! (x − x0)i Funkci f(x) jsme tak rozvinuli v Taylorovu řadu. Ilustrujme si aproximaci polynomem na příkladech. Aproximace funkce f(x) = ex v okolí bodu 0. Spočítejme jednotlivé derivace. Pro funkci f(x) = ex platí, že f(x) = ex, f′(x) = ex, f′′(x) = ex, . . . , f(n)(x) = ex. Pro x0 = 0 jsou tedy všechny derivace rovny 1. Po dosazení do Taylorova polynomu dostaneme ex ≈ 1 + x + x2 2 + x3 6 . . . + xn n! = x0 0! + x1 1! + x2 2! + x3 6 . . . + xn n! = n i=0 xi i! To se dobře pamatuje. Shodu pro polynom řádu 3 vidíme na obr. 2.8. Funkce ex je právě jednou z funkcí, které lze zcela nahradit polynomem. Platí ex = ∞ i=0 xi i! . Speciálně pro x = 1 dostaneme vyjádření Eulerova čísla e = 2, 7182818285 . . . pomocí nekonečné řady. Můžeme tak toto iracionální číslo vyjádřit s libovolnou přesností. e = 1 0! + 1 1! + 1 2! + 1 3! . . . Prvních 5 členů např. dává součet 1 + 1 + 1 2 + 1 6 + 1 24 = 2, 708, již docela blízký hodnotě e. 30 2.4. Derivace funkce Aproximace funkcí sin x a cos x v okolí bodu 0. Jednotlivé derivace pro f(x) = sin x jsou f′(x) = cos x, f′′(x) = − sin x, f(3)(x) = − cos x, f(4)(x) = sin x, a dále stále periodicky. Pro x0 = 0 jsou tedy derivace (včetně 0. derivace) postupně rovny 0, 1, 0, -1, 0, 1, 0, -1 . . . . Po dosazení dostaneme sin x ≈ x − x3 6 + x5 5! + . . . Shodu pro polynom řádu 5 vidíme na obr. ??. Vidíme typickou vlastnost polynomu polynom osciluje a na okraji intervalu rychle uniká k ±∞. I funkci sin x lze zcela nahradit polynomem. Platí sinx = ∞ i=0 sin (i mod 4) π 2 xi i! . Pro obecný zápis jsme použili operaci modulo, t.j. zbytek po dělení. i mod 4 je zbytek po dělení čtyřmi. Výraz sin (i mod 4) tak elegantně poskytuje alternující znamení 0, 1, 0, −1, 0, 1, 0, −1 . . .. −4 −2 2 4 −1 1 f(x) = sin x g(x) = x − x3 6 + x5 5! x y Pokud nyní zderivujeme Taylorův rozvoj pro sin x, musíme získat Taylorův rozvoj pro cos x, jak si sami můžete ověřit. cos x = (sin x)′ = x − x3 6 + x5 5! + . . . ′ = 1 − x2 2 + x4 4! + . . . = ∞ i=0 cos (i mod 4) π 2 xi i! Vidíme, že sin x obsahuje liché mocniny x a cos x sudé mocniny. V posledním příkladu této sekce se pokusíme určit limitu funkce důležité v teorii vlnění a difrakce. lim x→0 sin x x =?? 31 2. Úvod do matematické analýzy Limitu nemůžeme spočítat přímo dosazením, protože tak získáme neurčitý výraz 0/0. lim x→0 sin x x = sin 0 0 = 0 0 =?? Protože nás však zajímá chování v okolí bodu 0, může nám pomoci Taylorův rozvoj funkce sin x v okolí 0. lim x→0 sin x x = lim x→0 x − x3 6 + x5 5! + . . . x = lim x→0 1 − x2 6 + x4 5! + . . . = 1 Správnost výsledku je patrna z grafu funkce. −16 −12 −8 −4 4 8 12 16 −0.2 0.2 0.4 0.6 0.8 1 f(x) = sin x x x y V našem výkladu jsme postupovali tak, jako bychom funkce ex, sin x nebo cos x „už znali“, a hledali jsme jejich Taylorův rozvoj. Přitom jsme si nevšimli, že tyto funkce tak docela „neznáme“. Přinejmenším neumíme bez kalkulačky spočítat jejich hodnotu. Ve formální, „čisté“ matematice se tyto funkce naopak mohou pomocí nekonečných řad definovat. Zkrátka řekneme, že jistý nekonečný polynom nazveme „sinus“ a dále pak zkoumáme vlastnosti této „nové“ funkce. Definujeme tedy sin x := ∞ i=0 sin (i mod 4) π 2 xi i! . Podobně bychom se mohli ptát, který nekonečný polynom se po derivaci nezmění. Zjistili bychom, že to právě ten, který označujeme jako ex. Slíbili jsme, že se zdržíme matematických důkazů. V úchvatných případech však musíme učinit výjimku. Zkusme sečíst Taylorovy rozvoje funkcí cos x a sin x, ale sin x vynásobme imaginární jednotkou i. cos x + i sin x = 1 − x2 2 + x4 4! + . . . + ix − i x3 6 + i x5 5! + . . . = 1 + ix − x2 2 − i x3 6 + x4 4! + i x5 5! + . . . 32 2.5. Funkce více proměnných Pokud si uvědomíme, že i0 = 1, i1 = i, i2 = −1, i3 = −i ..., můžeme výraz přepsat na i0x0 0! + i1x1 1! + i2x2 2! + i3x3 3! + i4x4 4! + . . . = (ix)0 0! + (ix)1 1! + (ix)2 2! + (ix)3 3! + (ix)4 4! . . . . Samozřejmě už vidíme, že výraz odpovídá Taylorově rozvoji funkce eix. eix = (ix)0 0! + (ix)1 1! + (ix)2 2! + (ix)3 3! + (ix)4 4! . . . Dokázali jsme tak dříve uvedený Eulerův vztah eix = cos x + i sin x. 2.5. Funkce více proměnných Nyní se přesuneme k problematice funkcí více proměnných. Řada představ je pouhým rozšířením z funkcí jedné proměnné, ale některé problémy jsou nové. Reálná funkce n reálných proměnných přiřazuje n-tici reálných čísel reálné číslo, je to tedy zobrazení f : Rn → R : (x1, x2, . . . , xn) → f(x1, x2, . . . , xn). Funkce dvou proměnných má jasnou vizuální představu, např. kopce a údolí nad krajinou, viz obr. 2.9. Dva rozměry, x a y, „leží“ v rovině podstavy, funkční hodnotou je např. nadmořská výška. Funkce 3 proměnných je ještě představitelná, např. rozložení teploty v prostoru místnosti, kde je každému bodu přiřazena určitá teplota. Funkce více než 3 proměnných již nejsou vizuálně představitelné, ale matematicky s nimi lze nadále dobře pracovat. Napišme program v Pythonu pro vykreslení grafu funkce dvou proměnných f(x, y) = sin x2 + y2 x2 + y2 . Návod lze najít v Appendixu B.2. >>> import matplotlib.pyplot as plt >>> from mpl_toolkits.mplot3d import Axes3D >>> import numpy as np >>> # import ipympl >>> % matplotlib widget >>> x = np.arange(−15, 15, 0.1) # definice prom ě nn é x >>> y= np.arange(−15, 15, 0.1) # definice prom ě nn é y >>> def fun(x, y): >>> return np.sin(np.sqrt(x∗∗2+y∗∗2))/(np.sqrt(x∗∗2+y∗∗2)) >>> X, Y = np.meshgrid(x, y) >>> Z = fun(X,Y) 33 2. Úvod do matematické analýzy Obrázek 2.9.: Rotační paraboloid: z = x2 + z2 >>> fig = plt.figure() >>> ax = fig.add_subplot(111, projection=’3d’) >>> ax.plot_surface(X, Y, Z) # vykreslen í prostorov é ho grafu >>> ax.set_xlabel(’osa x’) >>> ax.set_ylabel(’osa y’) >>> ax.set_zlabel(’osa z’) >>> ax.view_init(−30, 30) >>> plt.show() 34 2.5. Funkce více proměnných Vidíme, že funkce vykazuje radiální symetrii, je tedy v jakémkoli směru od středu stejná. To nás nepřekvapuje. Pokud má totiž je v nějakých bodech konstantní hodnotu x2 +y2 = konst, pak tyto body leží na kružnici a funkce f má na celé této kružnici stejnou hodnotu f(x, y) = sin √ konst √ konst . Je to dvourozměrná cirkulární varianta nám už známé funkce sin x x . 2.5.1. Parciální derivace Parciální derivace je obdobou jednoduché derivace pro funkce více proměnných. Parciální derivaci funkce f podle x značíme ∂f ∂x . Jak jsme popsali výše, pokud zjišťujeme derivaci funkce jedné proměnné v bodě x0, sestrojíme nejprve tečnu k funkci v tomto bodě a pak určíme její směrnici. Významem derivace byla rychlost nárůstu funkce. Podobnou úlohu má i parciální derivace. Představme si pro jednoduchost funkci dvou proměnných, tedy např. kopce v krajině. Problémem je, že u funkce dvou proměnných neexistuje jen jedna tečna v každém bodě, nýbrž celá tečná rovina. Kterákoli přímka v ní ležící a procházející bodem dotyku roviny s funkcí je tečnou k funkci. Kterou z tečen máme zvolit, abychom posoudili rychlost nárůst funkce? Vyberme si dvě speciální tečny. První tečna bude mířit ve směru osy x, její projekce do podstavy (t.j. roviny x-y) bude rovnoběžná s osou x. Druhá tečna bude naopak mířit ve směru osy y, její projekce je rovnoběžná s osou y. Směrnice těchto dvou tečen označujeme jako parciální derivaci podle x a podle y. Výhodou těchto speciálních tečen je skutečnost, že se při pohybu ve směru tečny mění jen jedna proměnná (x nebo y), ale druhá zůstává konstantní. 35 2. Úvod do matematické analýzy Parciální derivace funkce f(x, y) v bodě (x0, y0) podle x (resp. y) tedy analogicky s obyčejnou derivací definujeme jako ∂f ∂x (x0, y0) := lim h→0 f(x0 + h, y0) − f(x0, y0) h ∂f ∂y (x0, y0) := lim h→0 f(x0, y0 + h) − f(x0, y0) h . Udává, jak rychle se mění funkce f(x, y), pokud se jedna z proměnných mění a všechny ostatní zůstávají neměnné. Protože se mění pouze jedna proměnná a ostatní zůstávají konstantní, můžeme pro derivování použít nám již známá pravidla, pouze proměnnou, podle níž právě nederivujeme, považujeme za konstantu. Postup si ukážeme na příkladech. 1. Derivujme funkci f(x, y) = x3 + y3 prodle x a podle y. Pokud derivujeme podle x, „cokoli s y“ považujeme za konstantu, jako by tedy funkce zněla f(x, y) = x3 + c. Při derivování podle y naopak funkce „vypadá“ jako f(x, y) = c + y3. ∂f ∂x = 3x2 ∂f ∂y = 3y2 2. Derivujme funkci f(x, y) = sin x. cos y. ∂f ∂x = cos x. cos y ∂f ∂y = − sin x. sin y 3. Derivujme funkci f(x, y) = x2y. sin x. Platí známé pravidlo pro derivování součinu. Přitom v součinu vystupuje pouze funkce x, jako by funkce zněla c.x2 sin x. ∂f ∂x = 2xy. sin x + x2 y. cos x ∂f ∂y = x2 . sin x 4. Derivujme funkci f(x, y) = ex2+y2 . Platí pravidlo pro derivování složené funkce, „vnější funkce krát vnitřní funkce“. ∂f ∂x = ex2+y2 .2x ∂f ∂y = ex2+y2 .2y 5. Derivujme funkci f(x, y, z) = x5exyz. 36 2.5. Funkce více proměnných Stejný postup platí pro funkci 3 a více proměnných. ∂f ∂x = 5x4 exyz + x5 exyz .yz ∂f ∂y = x5 exyz .xz ∂f ∂z = x5 exyz .xy Geometrickým významem parciální derivace funkce dvou proměnných je strmost funkce ve směru příslušné osy. Fyzikálním významem parciální derivace je rychlost nárůstu funkce se změnou jedné proměnné, přičemž ostatní proměnné zůstávají konstantní. Tento fyzikální význam je zachován i pro funkce 3 a více proměnných, ačkoli vizuální představu „tečné roviny“ již nelze uplatnit. Demonstrujme fyzikální význam parciální derivace na příkladu. Stavová rovnice ideálního plynu popisuje závislost tlaku ideálního plynu p na jeho látkovém množství n, objemu V a teplotě T. Zní p = nRT V . Parciální derivace ∂p ∂n = RT V ∂p ∂T = nR V ∂p ∂V = − nRT V 2 udávají, o kolik se změní tlak plynu, pokud se jednotlivé proměnné zvýší o jednotku a ostatní proměnné zůstanou konstantní. U derivace podle objemu máme záporné znaménko. To odpovídá naší fyzikální představě. Pokud se zvětší objem plynu, ale jeho látkové množství i teplota zůstanou konstantní, musí klesnou tlak plynu. V termodynamice bývá zvykem v parciální derivaci vyznačit, které proměnné zůstávají konstantní. Výše uvedené derivace by tak byly spíše zapsány jako ∂p ∂n V,T , ∂p ∂T n,V a ∂p ∂V n,T . 2.5.2. Vyšší a smíšené parciální derivace Stejně jako u funkcí jedné proměnné je i výsledkem parciální derivace funkce více proměnných opět funkce více proměnných. Tuto novou funkci můžeme přirozeně opět podrobit derivování. Nyní ovšem máme více možností. Druhá derivace může být podle stejné nebo jiné proměnné. Pokud znovu derivujeme podle stejné proměnné, dospějeme k druhým, třetím a dalším derivacím. ∂2f ∂x2 , ∂2f ∂y2 , ∂3f ∂x3 . . . 37 2. Úvod do matematické analýzy Pokud derivujeme podle jiné proměnné než při předchozí derivaci, získáme derivace smíšené. ∂2f ∂x∂y , ∂3f ∂x2∂y , ∂3f ∂x∂y∂z . . . Spočtěme všechny první a druhé parciální derivace funkce f(x, y) = ex2+y2 . ∂f ∂x = ex2+y2 .2x ∂f ∂y = ex2+y2 .2y ∂2f ∂x2 = ex2+y2 .4x2 + 2ex2+y2 ∂2f ∂y2 = ex2+y2 .4y2 + 2ex2+y2 ∂2f ∂x∂y = ∂ex2+y2 .2x ∂y = ex2+y2 .4xy V případě smíšených druhých derivací máme dvě možnosti: derivovat nejprve podle x a poté podle y, nebo opačně. Dostaneme tak ∂2 ∂x∂y nebo ∂2 ∂y∂x . V matematické analýze se dokazuje Schwarzova věta, která tvrdí, že nezáleží na pořadí derivování ve smíšených parciálních derivacích, tedy že ∂2f ∂x∂y = ∂2f ∂y∂x . Ověřme Schwarzovu větu na funkci f(x, y) = ex2+y2 .2x. ∂2f ∂x∂y = ∂ ex2+y2 .2x ∂y = ex2+y2 .4xy ∂2f ∂y∂x = ∂ ex2+y2 .2y ∂x = ex2+y2 .4xy 2.5.3. Vyšetřování průběhu funkce více proměnných Průběh funkce více proměnných může být podstatně složitější než průběh funkce jedné proměnné. V určitém bodě se například může nacházet lokální maximum nebo lokální minimum. Nebo se v určitém směru může nacházet minimum a v kolmém směru maximum, pak se jedná o tzv. sedlový bod. Obecně ale může být situace ještě komplikovanější. Podobně jako v případě funkcí jedné proměnné je nutnou podmínkou pro extrém funkce f(x, y) v bodě (x0, y0) nulovost obou parciálních derivací, tedy ∂f(x0, y0) ∂x = 0; ∂f(x0, y0) ∂y = 0. Není to však podmínka postačující. Může se stát, že jsou obě parciální derivace nulové, ale ve 38 2.5. Funkce více proměnných směru „mezi osami“ funkce roste a nejedná se tedy o lokální extrém. V reálných problémech však podmínka většinou „postačující“ je. Najděme lokální extrémy funkce f(x, y) = x2 + y2 (obr. 2.9). Pro extrém musí platit ∂(x2 + y2) ∂x = 2x = 0 ∂(x2 + y2) ∂y = 2y = 0 Jediným řešením je zjevně bod (0,0), kde funkce dosahuje minima. Představme si čtvercovou krajinu, která je vymezena hodnotami x i y 0,5 a 2, tedy x ∈ [0.5, 2] i y ∈ [0.5, 2]. Profil krajiny, tedy nadmořská výška h jednotlivých bodů, je dán funkcí h = exy xy . V údolí krajiny, nejníže položenými body, teče řeka. Zjistěme, kudy řeka teče, t.j. určeme funkci y = f(x), která body řeky popisuje. Určeme též, v jaké nadmořské výšce řeka teče. Údolí, nejnižší body, musí splňovat podmínky ∂h ∂x = 0 a ∂h ∂x = 0. Odtud získáme 2 rovnice, určující podmínky pro vztah x a y. ∂h ∂x = ∂ ∂x exy xy = yexyxy − exyy (xy)2 = 0 → xy = 1 ∂h ∂y = ∂ ∂y exy xy = xexyxy − exyx (xy)2 = 0 → xy = 1 39 2. Úvod do matematické analýzy Řeka je tedy popsána rovnicí y = 1/x. Odpovídající nadmořská výška je h = e. Poznamenejme pro úplnost, že obecně podmínky ∂h ∂x = 0 a ∂h ∂x = 0 pro řeku spíše neplatí, protože řeka teče z kopce dolů. Naše řeka byla speciální, vodorovná, jak už to v umělých příkladech bývá. 2.5.4. Aplikace funkcí více proměnných a parciálních derivací v biologii Funkce více proměnných a s nimi i parciální derivace jsou v přírodních vědách všudypřítomné. Často se vyskytují v podobě rovnic, které se označují jako parciální diferenciální rovnice. Některé z nich mají centrální postavení ve fyzice, označují se dokonce jako rovnice matematické fyziky. Tzv. vlnová rovnice 1 v2 ∂2z(x, t) ∂t2 = ∂2z(x, t) ∂x2 může například popsat šíření elektrického vzruchu po axonu. v je rychlost šíření vzruchu a z je membránový potenciál, který je funkcí polohy na axonu x a času t. My se těmto rovnicím nebudeme podrobněji věnovat. Ukážeme si však biologickou aplikaci funkcí více proměnných a parciálních derivací na případu teorie optimálního hematokritu, který je speciálním případem teorie evoluční optimality v biologii. Při jistém zjednodušení evoluční teorie říká, že se organizmy během evoluce vyvinuly tak, že jsou v jistém smyslu nejlepší, optimální. V průběhu evoluce se tedy optimalizovala jistá vlastnost, kterou můžeme matematicky popsat nějakou veličinou S. S je ale funkcí řady jiných proměnných, x1, x2..., tedy S = S(x1, x2, . . .). Veličinou S může být např. dodávka kyslíku do tkání, která zřejmě závisí na arteriálním tlaku, množství hemoglobinu v krvi, funkci plic apod. Je přirozené očekávat, že tak důležitá veličina, jako je dodávka kyslíku, dosáhla během evoluce maxima ve vztahu k těmto proměnným. Hledáme tedy hodnotu nějaké proměnné x1, např. koncentrace hemoglobinu v krvi, při níž S nabývá maxima. Pro tuto hodnotu x1,max musí platit ∂S ∂x1 (x1,max) = 0. Hematokrit je procento červených krvinek, erytrocytů, v krvi. U většiny savců i řady jiných zvířat se hematokrit pohybuje okolo 40 %. Vcelku nápadná shoda. Proč právě 40 %? Zkusme zjistit, zda 40 % náhodou není optimální hodnota maximalizující dodávku kyslíku. Hemoglobin váže kyslík, krev s vyšším hematokritem nese více kyslíku. Zároveň však vyšší hematokrit zvyšuje viskozitu krve, čímž zpomaluje její tok. Je-li hematokrit příliš nízký, krev teče rychle, ale nese málo kyslíku. Dodávka kyslíku do tkání je nízká. Je-li naopak příliš vysoký, krev sice nese hodně kyslíku, ale teče velmi pomalu. Optimální hodnota musí ležet někde uprostřed, jak je patrno z obr. 2.10 (a). Viskozita obecně roste s hematokritem, viz obr. 2.10 (b). Pro výpočet optimálního hematokritu potřebujeme znát přesnou závislost viskozity krve na hematokritu. Byla odvozena řada teoretických vztahů. My použijeme jednoduché vztahy Arrhenia η = η0e2,5φ a Saita η = η0(1+2, 5 φ 1−φ), kde η značí viskozitu krve, η0 viskozitu krevní plazmy a φ hematokrit. η(φ) zdůrazňuje, že je viskozita závislá na hematokritu. Pokračujme dále. Pro průtok krve cévou Q platí známá Hagen-Poiseuillova rovnice Q = πr4∆p 8lη(φ) . 40 2.5. Funkce více proměnných 0.2 0.4 0.6 0.8 1 0.5 1 φ J(φ) (a) Závislost dodávky kyslíku 0.2 0.4 0.6 0.8 1 2 4 6 8 10 12 14 φ η/η0 (b) Závislost viskozity podle Arrhenia a Saito Obrázek 2.10.: Závislost dodávky kyslíku a viskozity krve na hematokritu kde ∆p je tlakový gradient mezi začátkem a koncem cévy, l a r jsou délka a poloměr cévy. Pokud budeme rozměr cévy považovat za konstantní a společně s ostatními konstantami je zahrneme do nové konstanty K, dostaneme tvar Q = K ∆p η(φ) . Množství kyslíku v litru krve Cox je úměrné hematokritu φ, krev považujme za plně nasycenou kyslíkem. Platí tedy Cox = κφ. κ je konstanta úměrnosti. Pro dodávka kyslíku cévou do tkání Jox pak samozřejmě platí Jox = CoxQ. Po dosazení obdržíme vztah Jox = K′ ∆p φ η(φ) , kde jsme všechny, v tuto chvíli nepodstatné konstanty zahrnuli do nové konstanty K = κk. Dodávka kyslíku je tedy funkcí dvou proměnných, tlakového gradientu a hematokritu. Obr. 2.11 ukazuje závislost relativní dodávky kyslíku, t.j. procenta z maximální dodávky Jox/Jox,max, na hematokritu pro Arrheniovu a Saitovu závislost viskozity na hematokritu. Saitoův vztah poskytuje průběh funkce, jak jsme předpokládali. Tedy nulové hodnoty na okrajích a maximum uprostřed. Arrheniovův vztah je zjevně chybný pro vysoký hematokrit, protože počítá nenulovou dodávku kyslíku, ačkoli krev již téměř neteče (neboť už prakticky neobsahuje plazmu). Hledejme nyní hematokrit, který za konstantního tlakového gradientu maximalizuje dodávku kyslíku. Zde vstupuje do hry parciální derivace. Musí tedy platit 0 = ∂Jox ∂φ = K′ ∆p η(φ) − φη′(φ) η2(φ) . Odtud získáme rovnici η(φ) − φη′ (φ) = 0, 41 2. Úvod do matematické analýzy z níž plyne podmínka optimálního hematokritu φ∆p max = η(φ∆p max) η′(φ∆p max) . Horní index ∆p značí, že jsme derivovali za konstantního tlaku, našli jsme tedy optimální hematokrit za situace, kdy by byl tlakový gradient ∆p udržován konstantní. Abychom rovnici mohli dořešit, musíme znát konkrétní závislost viskozity na hematokritu. Určeme optimální hodnoty pro Saitoův a Arrheniův vztah: 0.2 0.4 0.6 0.8 1 0.5 1 φ J(φ) J(φmax) (a) pro Arrheniův vztah η = η0.e2,5φ 0.2 0.4 0.6 0.8 1 0.5 1 φ J(φ) J(φmax) (b) pro Saitoův vztah η = η0 1 + 2, 5φ/(1 − φ) Obrázek 2.11.: Závislost dodávky kyslíku na hematokritu při konstantním perfúzním tlaku 1. S použitím Arrheniova vztahu: φmax = η0.e2,5φ η0.2, 5.e2,5φ = 0, 4 2. S použitím Saitoova vztahu: φ = η0 1 + 2, 5 φ 1−φ η0 2, 5 1 (1−φ)2 = 1 + 2, 5 φ 1−φ 2, 5 1 (1−φ)2 → 2, 5φ = (1 − φ)2 + 2, 5φ(1 − φ) Odtud získáme rovnici 1.5φ2 + 2φ − 1 = 0 → φmax = −2 + √ 4 + 6 3 = 0, 387. Potvrdili jsme tak naši domněnku. Optimální hematokrit se skutečně pohybuje okolo 40 %, jak příroda již během evoluce dávno zjistila. 2.6. Integrální počet Problematika derivací se obvykle označuje jako diferenciální počet, problematika integrálů jako integrální počet. Oba dohromady pak jako infinitezimální počet, protože oba mají co do činění 42 2.6. Integrální počet s nekonečně malými čísly. Derivace je podíl dvou nekonečně malých čísel. (Určitý) integrál je součet nekonečně mnoha nekonečně malých čísel. 2.6.1. Idea integrálního počtu Pokud zderivujeme funkci x2, získáme funkci 2x. Položme si nyní opačnou úlohu. Kterou funkci jsme museli zderivovat, abychom získali funkci 2x? Snadné. x2. Ovšem též x2 + c, kde c je libovolná konstanta. Integrování je zpětná cesta, určitý opak derivace. Integrál, který je opakem derivace, se přesněji označuje jako neurčitý integrál a značí se symbolem . Též se označuje jako primitivní funkce. Dále existuje integrál určitý, který „počítá“ plochu pod křivkou a úzce souvisí s neurčitým integrálem. Dále si přesněji definujeme oba integrály, popíšeme si jejich vlastnosti a způsoby výpočtu. Budeme se zabývat pouze funkcemi jedné proměnné. 2.6.2. Neurčitý integrál Mějme funkci F(x). Její derivaci označme f(x), tedy f(x) := F′(x). F(x) označujeme jako primitivní funkci nebo synonymně jako neurčitý integrál k funkci f(x) a značíme F(x) = f(x) dx. dx značí proměnnou, podle níž integrujeme, podobně jako dx značilo proměnnou, podle níž jsme derivovali. Neurčitý integrál též označujeme jako integrál Newton-Leibnitzův. Pokud jakoukoli F(x) funkci posuneme o konstantu, F(x)+c, její derivace se nezmění - (F(x)+ c)′ = (F(x))′ = f(x). Proto bychom pro integrál správněji měli psát F(x) = f(x) dx + c, neboť řešení integrace není jedna funkce, nýbrž celá nekonečná množina funkcí, které se navzájem liší o libovolnou, tzv. integrační konstantu. 2.6.3. Metody integrace Integrování je podstatně složitější činnost než derivování. Pomocí pravidel pro derivování lze víceméně snadno zderivovat jakoukoli (běžnou) funkci. Integrovat jakoukoli funkci obecně nejen není snadné, ale ani možné. Např. integrál Gaussovy funkce ex2 dx známé ze statistiky sice existuje, ale není vyjádřitelný v uzavřené formě pomocí elementárních funkcí jako ex, ln x nebo sin x. Ukážeme si dvě metody integrace - metodu substituční a metodu per partes, ale ani s nimi není řada funkcí snadno integrovatelná. Přímá integrace U základních elementárních funkcí, kde „původní derivaci přímo vidíme“, je integrace snadná. 43 2. Úvod do matematické analýzy 1 dx = x + c x dx = 1 2 x2 + c xn dx = 1 n + 1 xn+1 + c cos x dx = sin x + c sin x dx = − cos x + c ex dx = ex + c 1 x dx = ln x + c Podobně jako derivace je i intergrál lineární zobrazení, platí tedy f(x) ± g(x) dx = f(x) dx ± g(x) dx + c k.f(x) dx = k. f(x) dx + c. Vyřešme několik jednoduchých příkladů. Vynecháme integrační konstantu. 2e3x dx = 2 e3x dx = 2 3 e3x 2x2 + 3x3 dx = 2 x2 dx + 3 x3 dx = 2 3 x3 + 3 4 x4 sin 2x dx = − 1 2 cos x 1 x2 dx = x−2 dx = − 1 x Cokoli dalšího už je složitější. Podobná pravidla jako pro derivaci součinu, podílu, inverzních funkcí apod. pro integrování neexistují. Někdy pomohou zmíněné metody substituční a per partes. Substituční metoda Pomocí substituční metody nahradíme, substituujeme, komplikovanější část integrované funkce jinou funkcí, čímž získáme jednodušší tvar, který už umíme přímo integrovat. Jak už jsme říkali, s diferenciály d můžeme často operovat jako v jinými výrazy, násobit, dělit apod. Ukažme si metodu na příkladech. 44 2.6. Integrální počet Vyřešme integrál x sin x2 dx. „Uhádnout“ správné řešení asi neumíme. Použijme však následující substituci: nahradíme funkci x2 funkcí t, tedy vlastně definujeme novou funkci t(x) := x2. Pro ni platí dt dx = 2x → x dx = 1 2 dt. „Svévolné manipulace“ s diferenciály vypadají možná podezřele, ale matematika tento postup pochopitelně exaktně dokázala. Nyní vše dosadíme do původního výrazu a upravíme. Dostaneme x sin x2 dx = 1 2 sin t dt = 1 2 sin t dt = − 1 2 cos t = − 1 2 cos x2 . Tímto „trikem“ jsme integrál převedli na známý tvar a přímo vyřešili. Derivací ověříme, že d dx − 1 2 cos x2 = 1 2 d cos x2 dx = x sin x2 . Zkusme nyní vyřešit integrál ln x x dx. Substituci musíme volit chytře, aby se nám intergrál zjednodušil a převedl na tvar, který umíme řešit. Zde nám pomůže substituce t := ln x, odkud dt = dx x . Proto ln x x dx = t dt = 1 2 t2 = 1 2 ln2 x. Derivací opět ověříme, že d dx 1 2 ln2 = 1 2 d ln2 dx = ln x x . Metoda per partes Druhou metodou, kterou si představíme, je metoda integrování „po částech“, per partes. Je aplikací pravidla pro derivování součinu (f.g)′ = f′ .g + f.g′ → f′ .g = (f.g)′ − f.g′ . Nyní obě strany zintegrujeme a využijeme skutečnosti, že „integrál z derivace“ se rovná původní funkci. f′ (x).g(x) dx = (f(x).g(x))′ dx − f(x).g′ (x) dx Tedy f′ (x).g(x) dx = f(x).g(x) − f(x).g′ (x) dx. Zdánlivě jsme mnoho nezískali. Funkce g se však po derivaci může výrazně zjednodušit. Ukažme si postup opět na příkladech. 45 2. Úvod do matematické analýzy Zintegrujme funkci x sin x. Lépe si funkci napišme jako sin x.x. Představme si, že f′(x) = sin x a g(x) = x. Pak f(x) = − cos x a g′(x) = 1. Dosadíme do výše uvedeného vzorce. sin x.x dx = −x cos x − − cos x dx = −x cos x + sin x Derivací ověříme, že d dx (−x cos x + sin x) = − cos x + x sin x + cos x = x sin x. Vypočítejme nyní ln x dx. Zde máme pouze jednu funkci. Zkusme si ale integrál představit jako 1. ln x dx a definujme f′(x) = 1 a g(x) = ln x. Pak f(x) = x a g′(x) = 1 x. Dosadíme do výše uvedeného vzorce. ln x dx = x ln x − x x dx = x ln x − x = x(ln x − 1) Derivací opět ověříme, že d dx (x ln x − x) = ln x + x x − 1 = ln x. Sami vidíte, že nevíme předem, kterou substituci nebo rozložení integrálu máme použít. Vždy je potřeba nový nápad. Proto je integrování obtížnější než derivování. V reálných problémech, jako je např. matematické modelování v biologii, ale určování primitivní funkce většinou nepotřebujeme, případně pomohou i některé online řešiče. 2.6.4. Určitý integrál Určitý integrál, též označovaný jako Riemannův integrál, historicky vznikl nezávisle na integrálu neurčitém a nemá s ním na první pohled žádnou souvislost. Úkolem bylo určit velikost plochy pod křivkou. Princip spočíval v tom, že se celá plocha pod křivkou S ohraničená hodnotami x = a a x = b rozdělí na úzké obdélníky o šířce ∆x a plochách Si a sečte se plocha všech obdélníků (2.12), která přibližně odpovídá ploše pod křivkou. S ≈ n i=1 Si = n i=1 f(xi)∆x Je přitom jasné, že jak roste počet obdélníků a klesá jejich šířka, součet plochy obdélníků se stále více blíží ploše pod křivkou, až v limitě obě plochy splynou. Určitý integrál b a f(x) dx je vlastně „sčítání nekonečně velkého počtu nekonečně malých čísel“. Vyjadřuje plochu pod křivkou funkce f(x) mezi hodnotami x = a a x = b. b a f(x) dx := lim n→∞ n i=1 Si = lim n→∞ n i=1 f(xi)∆x = S 46 2.6. Integrální počet Pro jasnost dodejme, že výsledkem určitého integrálu je číslo, zatímco výsledkem neurčitého integrálu je funkce. Výpočet plochy pod křivkou jako limity součtu je ovšem velmi obtížný. Elegantním řešením je výpočet určitého integrálu pomocí neurčitého integrálu. 2 4 a b Si x y Obrázek 2.12.: Idea určitého integrálu Vztah neurčitého a určitého integrálu Protože souvislost mezi určitým a neurčitým integrálem je zásadní, jsme nuceni ji odvodit, nikoli pouze prozradit. Chceme tedy určit plochu pod křivkou na obr. 2.13, přičemž plochu budeme měřit od nějakého konkrétního, ale libovolného bodu vlevo, např. od x = −2. V takovém případě je změřená plocha funkcí x. Např. v bodě x0 je to S = S(x0). O malý úsek h dále je obsah roven S(x0 +h). Rozdíl mezi oběma obsahy je na obr. 2.13 vyznačen žlutě. Je zjevné, že je tento rozdíl téměř roven obsahu červeně vyšrafovaného obdélníku o rozměrech h a f(x0). Platí tedy f(x0).h ≈ S(x0 + h) − S(x0). Když se h zmenšuje, „žlutá a červeně vyšrafovaná plocha“ si jsou stále bližší, až v limitě pro h → 0 splynou. Tedy lim h→0 f(x0).h = lim h→0 S(x0 + h) − S(x0). Po úpravě dostaneme f(x0) = lim h→0 S(x0 + h) − S(x0) h . Výraz na pravé straně rovnice je ale právě definice derivace S podle x. Tedy nutně f(x) = dS(x) dx . Po integraci platí S(x) = f(x) dx + .C Konstanta C je určena bodem, kde jsme „začali měřit“ plochu. Pro plochu mezi body x = a a x = b platí S(b) − S(a) = f(x)dx (b) + C − f(x)dx (a) − C =: b a f(x)dx. 47 2. Úvod do matematické analýzy f(x)dx (b) a f(x)dx (a) značí hodnotu neurčitého integrálu, primitivní funkce, v bodě x = b a x = a. Vidíme, že hodnota konstanty C je nepodstatná, neb se odečte. Hodnoty x = b a x = a označujeme jako horní a dolní integrační mez. Tím dostáváme způsob, jak vypočítat určitý integrál pomocí neurčitého. Stačí určit libovolnou primitivní funkci (neurčitý integrál), určit její hodnoty v horní i dolní integrační mezi a obě hodnoty odečíst. Jestliže primitivní funkci k f(x) označíme F(x), tedy F(x) = f(x) dx. pak pro určitý integrál platí b a f(x) dx = [F(x)]b a = F(b) − F(a). Bývá zvykem rozdíl F(b) − F(a) označovat [F(x)]b a. 2 4 x0 h S(x0) S(x0 + h) x y Obrázek 2.13.: Odvození vztahu určitého a neurčitého integrálu Vypočtěme následující určité integrály: 1. 1 0 e3 dx 1 0 ex dx = [ex ]1 0 = e1 − e0 = e − 1 ≈ 1, 72 2. 2π 0 sin x dx 2π 0 sin x dx = [− cos x]2π 0 = − cos 2π − (− cos 0) = −1 − (−1) = 0 3. 2 1 x3 + 4x5 dx 2 1 x3 + 4x5 dx = 1 4 x4 + 4 6 x6 2 1 = 16 4 + 128 3 − 1 4 − 2 3 = 15 4 + 126 3 = 45, 75 48 2.6. Integrální počet Aplikace určitého integrálu Aplikací určitého integrálu je řada. Vtip je v tom, že nejprve použijeme Riemannovu definici integrálu f(x)∆x, abychom určili, co vlastně chceme integrovat. Musíme tedy najít elementy f(x)∆x, které chceme sčítat. Poté nahradíme ∆x pomocí dx a pomocí a zintegrujeme, jak jsem výše popsali. Ostatně symbol v minulosti vznikl právě úpravou písmene S, ze slov sum, Summe, součet apod. f(x)∆x → f(x) dx Vše objasníme na příkladech. Výpočet plochy pod grafem funkce Chceme zjistit plochu pod grafem funkce y = x2 pro x ∈ [0, 1]. Sčítaný element je x2.∆x. Integrační proměnnou je x. S = lim n→∞ n 0 x2 i ∆x = 1 0 x2 dx = 1 3 x3 1 0 = 1 3 0.2 0.4 0.6 0.8 1 0.2 0.4 0.6 0.8 1 S x y Výpočet obsahu kruhu Chceme odvodit známý vztah pro výpočet obsahu kruhu S = πr2. Postupujme podle obrázku. Máme kruh o poloměru r, který si celý rozdělíme na infinitezimálně úzké rovnoramenné trojúhelníky, z nichž každý svírá úhel dφ, má ramena délky r a základnu dr. Uvědomíme si, že úzký rovnoramenný trojúhelník je v podstatě pravoúhlý. Pro jeho obsah tedy platí dS = r.dr/2. Z definice úhlu víme, že dr = r.dφ. Sčítaný element bude dS = r2.dφ/2. Pozor, integrační proměnnou nyní není r, nýbrž φ, r vystupuje jako konstanta, kterou vytkneme před integrál. Sčítat budeme všechny trojúhelníky přes celý kruh, tedy pro φ ∈ [0, 2π]. S = S 0 dS = 2π 0 1 2 r2 dφ = 1 2 r2 2π 0 dφ = 1 2 r2 .2π = πr2 49 2. Úvod do matematické analýzy −3 211 2 3 −3 −2 −1 1 2 3 r drdφS Biologická dostupnost léku a AUC (area under curve) Pokud nemocný spolkne lék, víme, kolik léku jsme podali (D). Nevíme však, jaká část léku se vstřebala do krevní plazmy a jaká se vyloučila stolicí. Označme množství léku, které se vstřebalo do krevní plazmy Dr. Můžeme tuto vstřebanou část, označovanou jako biologická dostupnost léku F = Dr/D, nějak zjistit? Je jasné, že veškeré množství léku, které se z plazmy později eliminovalo, musí být právě to množství, které se předtím vstřebalo. Eliminaci samu však bohužel též nemůžeme měřit. Můžeme však měřit koncentraci léku opakovaně v čase a eliminaci léku z této křivky dopočítat. 2 4 6 8 0.2 0.4 AUC t c Potřebujeme k tomu znát některé farmakokinetické parametry léku. Jeden z nich, clearance, udává intenzitu odstraňování léku z těla. Clearance Cl je definovaná jako objem plazmy, který je od léku úplně očištěn za jednotku času, má tedy rozměr např. ml.s−1. Za čas dt se tedy očistí Cl.dt plazmy. Pokud v tu chvíli činila plazmatická koncentrace léku c, odstranilo se c.Cl.dt léku. Pokud clearanci považujeme za konstantní, odstranilo se od okamžiku podání léku za dostatečně („nekonečně“) dlouhou dobu celkem ∞ 0 c.Cl.dt = Cl. ∞ 0 cdt = Dr léku. Integrál ∞ 0 cdt je přitom plocha pod koncentrační křivkou a označuje se jako area 50 2.6. Integrální počet under curve (AUC). Pro biologickou dostupnost tedy platí F = Dr D = Cl.AUC D . Co kdybychom neznali clearance Cl? Mohli bychom třeba stejné množství léku D aplikovat přímo do žíly, pak by platilo Dr = D a F = 1. Znovu bychom měřili koncentrační křivku a zjistili AUCnitrožilní. Pak se rovnice změní na 1 = Cl.AUCnitrožilní D . Clearance zůstává v obou variantách podání léku stejná, protože popisuje eliminaci léku např. v játrech či ledvinách, která nezávisí na způsobu podání. Pokud vše dosadíme, můžeme zjistit F jako F = Dr D = AUCperorální AUCnitrožilní . Měření srdečního výdeje pomocí Swan-Ganzova katetru V roce 1970 vyvinuli Swan a Ganz speciální katetr, který umožňuje měřit srdeční výdej. Katetr se cestou centrální žíly (např. v. jugularis interna) zavede přes pravou srdeční síň a komoru do plicní tepny (a. pulmonalis). Tam měří jednak krevní tlak, jednak teplotu krve nebo koncentraci nějaké látky, tzv. indikátoru. Princip techniky je následující: Chladná kapalina nebo nějaká měřitelná látka se rychle vstříkne do pravé síně. Kapalina ochladí kolem tekoucí krev nebo zředí vstřikovanou látku. Jakmile krev doputuje do a. pulmonalis, čidlo na konci katetru změří pokles teplotu nebo vzestup koncentrace indikátoru jako následující křivku. 51 2. Úvod do matematické analýzy 2 4 0.1 0.2 dt t c Ze známého množství aplikovaného indikátoru a změřené křivky lze dopočítat srdeční výdej. Následující obrázek představuje plicní tepnu, v níž je křivka měřena. q dV Krev teče průtokem q, který v případě plicní tepny odpovídá minutovému srdečnímu výdeji. Za čas dt proteče kolmým průřezem plicní tepny objem krve dV = q.dt. Pokud je koncentrace indikátoru (nebo pokles teploty) v tomto elementárním objemu krve c, pak tento objem obsahuje dN = c.dV = c.qdt indikátoru. Po celou dobu měření přitom musí postupně protéct veškeré množství podaného indikátoru N. Stačí tedy sečíst, zintegrovat, jednotlivá elementární množství látky v čase. Integrujeme opět od 0 do „nekonečna“. N = N 0 dN = ∞ 0 c.qdt = q ∞ 0 cdt Funkce c(t) je změřená křivka. Integrál ∞ 0 cdt opět měří plochu pod křivkou. Pro srdeční výdej CO = q (cardiac output) tedy dostáváme CO = N ∞ 0 cdt . Na první pohled kontraintuitivní je skutečnost, že čím nižší je srdeční výdej, tím větší je křivka i plocha pod ní. Odvozenou rovnici je pro případ měření teploty krve namísto koncentrace indikátoru nutno lehce „obohatit“ o teplotu krve i podávané tekutiny a o tepelnou kapacitu krve. Rovnice se pak v literatuře označuje jako Stewart-Hamiltonova a zní CO = V (Tb − Ti)k1k2 t2 t1 ∆Tdt . kde V je objem podané tekutiny, Tb a Ti teploty krve a podané tekutiny, k1 spojuje 52 2.7. Obyčejné diferenciální rovnice hustotu a tepelnou kapacitu, k2 je kalibrační konstanta a ∆T je aktuálně měřený rozdíl mezi teplotou protékající krve a teplotou krve před podáním roztoku. Je zajímavé poznamenat, že se změřená křivka v průběhu putování krve cévami příliš nemění. Je téměř stejná ve větvích plicní tepny jako přímo v ní, ale podobná je i po průchodu plícemi v arteriální krvi. Toho lze využít k méně invazívnímu, ale jen lehce méně přesnému měření srdečního výdeje pomocí tzv. transpulmonální termodiluce (například systémem zvaným zvaným PiCCO). Chladný roztok se podává centrální katetrem do pravé síně a teplota se měří speciálním arteriálním katetrem až v arteria radialis nebo arteria femoralis. Odpadá tak invazivita a komplikace spojené s nutností zavedení katetru až do plicní tepny. 2.7. Obyčejné diferenciální rovnice Nyní si v základech představíme další a zásadní oblast matematické analýzy, diferenciální rovnice. Jsou základním nástrojem matematického modelování. Tvrdí se, že diferenciální rovnice jsou nejpřirozenější formulací fyzikálních zákonů. 2.7.1. Idea diferenciální rovnice Představme si jakoukoli algebraickou rovnici, např. x2 + 2x − 1 = 0. Hledáme číslo x, které vyhovuje dané rovnici. Řešením algebraické rovnice je tedy číslo. Řesme nyní jinou úlohu. Znáte nějakou funkci f(x), jejíž derivace se rovná funkci samé? Samozřejmě, f(x) = ex. Uvedená otázka je ale vlastně slovní popis rovnice f′ (x) = f(x). Je to rovnice, která obsahuje derivaci nějaké neznámé funkce a jejímž řešením není číslo, nýbrž tato neznámá funkce. Takovou rovnici označujeme jako diferenciální. Řešením diferenciální rovnice je tedy funkce, nikoli číslo. Je zřejmé, že této diferenciální rovnici vyhovuje kromě funkce y(x) = ex též funkce y(x) = k.ex, kde k je libovolná konstanta. Řešení diferenciální rovnice tedy není jednoznačné, ale liší se v konstantě. Hodnotu konstanty pro konkrétní případ můžeme určit ze známých okolností popisovaného děje, např. ze známé hodnoty funkce v čase t = 0. Hovoříme o tzv. počáteční nebo okrajové podmínce. Hledejme řešení rovnice f′(x) = f(x), které zároveň splňuje požadavek, počáteční podmínku, aby hodnota funkce v bodě 0 byla 2, f(0) = 2. Obecným řešení rovnice je f(x) = k.ex. Aby platilo 2 = f(0) = k.e0, musí být k = 2. Hledaným řešení je tedy f(x) = 2ex . 53 2. Úvod do matematické analýzy Shrňme tedy, že diferenciální rovnice jsou rovnice, které obsahují derivaci nějaké neznámé funkce. Tato funkce je jejich řešením. Pokud je neznámá funkce funkcí jedné proměnné a rovnice tak obsahuje pouze obyčejné derivace, označuje se jako obyčejná diferenciální rovnice, často pod zkratkou ODE z anglického ordinary differential equations. Pokud je hledaná funkce funkcí více proměnných a rovnice tak obsahuje parciální derivace, označuje se jako parciální diferenciální rovnice, obvykle pod zkratkou PDE z anglického partial differential equations. V této kapitole popíšeme analytické metody řešení ODE. Analytickým řešením se rozumí matematický výraz popisující hledanou funkci, např. y = cos x. Poněvadž však většinu diferenciálních rovnic neumíme řešit analyticky, jsou pro praktické použití důležitější numerické metody řešení, které budou popsány v další kapitole. Výsledkem numerického řešení je graf nebo vybrané hodnoty hledané funkce, ale nikoli matematický výraz, který ji popisuje. V této kapitole se budeme věnovat analytickému řešení diferenciálních rovnic. 2.7.2. Základní pojmy Vysvětlíme si několik základních pojmů z problematiky diferenciálních rovnic. Neznámou funkcí bude dále y, nezávisle proměnnou bude x, tedy y(x). Pro derivaci budeme ekvivalentně používat zápis y′ nebo dy dx . Řádem diferenciální rovnice se rozumí nejvyšší stupeň derivace přítomný v diferenciální rovnici. Je-li nejvyšší derivace první, pak jde o rovnici 1. řádu. Je-li nejvyšší derivace n-tá, pak je rovnice n-tého řád. Rovnice y′x + y = 2x2 je tedy 1. řádu, rovnice xy′ + 2x = y′′′ je třetího řádu. Lineární diferenciální rovnice je taková, kdy se neznámá funkce y nebo její derivace vyskytují pouze v součtu, nikoli v součinu. Rovnice y′ + 2y = x2 je tedy lineární, rovnice yy′ = x je nelineární. Poznamenejme, že x není neznámá, proto se součin x, resp. f(x), a y v lineární rovnici vyskytovat může. Rovnice xy′ + 2y = x nebo y sin x = y′x2 jsou tedy též lineární. Obecně můžeme každou lineární diferenciální rovnici 2. řádu (a obecně jakéhokoli řádu) zapsat jako a(x)y′′ + b(x)y′ + c(x)y = d(x), kde a(x), b(x), c(x) i d(x) jsou známé funkce x, ale nikoli y. Pokud jsou a(x), b(x) i c(x) konstanty, hovoříme o rovnici s konstantními koeficienty. Na pravé straně rovnice se nevyskytuje neznámá y, pouze funkce x. Jestliže je pravá strana rovnice nulová, tedy d(x) ≡ 0, hovoříme o homogenní rovnici, jinak o rovnici nehomogenní. Ve výše uvedeném příkladu jsme našli y(x) = ex jako jedno konkrétní řešení rovnice y′ = y. Každé konkrétní řešení označuje jako partikulární. Existuje však, jak jsme již zmínili, nekonečně mnoho partikulárních řešení, která jsou všechna zapsatelná obecným tvarem y(x) = k.ex, kde k ∈ R. Takovému obecnému zápisu říkáme obecné řešení. Najít nějaké libovolné partikulární řešení, narozdíl od obecného řešení, může být snadné, lze jej např. uhádnout. Takovým zjevným partikulární řešení uvedené rovnice y′ = y je např. y(x) = 0. 54 2.7. Obyčejné diferenciální rovnice 2.7.3. Formulace diferenciální rovnice Pro potřeby matematického modelování je důležité umět převést reálný problém do podoby diferenciální rovnice. Ukážeme si několik příkladů takového převodu. Opět využijeme nám již dobře známé manipulace s diferenciály. Zformulujme diferenciální rovnice, které odpovídají následujícím popisům. 1. Molekuly látky spontánně degradují, přičemž pravděpodobnost degradace v následující sekundě je pro všechny molekuly stejná. Protože je pravděpodobnost degradace v následující sekundě pro všechny molekuly stejná, musí být počet molekul, které se v následujícím časovém úseku ∆t rozpadnou ∆N, přímo úměrný jejich aktuálnímu počtu N. ∆N je kladné, pokud počet molekul roste. V našem případě počet molekul ubývá, platí proto −∆N ≈ k.N.∆t. Pro velmi malé změny přechází ∆ v diferenciál d. Hledaná diferenciální rovnice tedy zní dN dt = −kN. 2. Bakterie se množí dělením jednotlivých buněk, zároveň pod vlivem antibiotik jednotlivé buňky umírají a zároveň růst bakterií omezuje konkurence o sdílené zdroje. Konkurence je úměrná skutečnosti, že se dvě bakterie setkají u stejného zdroje. Protože se bakterie množí dělením, je jejich přírůstek úměrný jejich počtu. Zároveň vlivem antibiotik jejich počet klesá, též úměrně počtu. Oba procesy se však liší rychlostní konstantou. Konkurence je vyjádřena pravděpodobností setkání u stejného zdroje, která je úměrná druhé mocnině počtu. Problém tak popisuje diferenciální rovnice dN dt = k1N − k2N − k3N2 . 3. Pozitivní zpětná vazba je charakterizována skutečností, že rychlost nárůstu veličiny je (přímo) úměrná veličině samotné. Odpovídající diferenciální rovnice samozřejmě zní dx dt = kx. Řešením je funkce x = x0ekx . Taková veličina tedy exponenciálně rychle roste, což se vyústí v brzkou „katastrofu“, pokud jiný proces růst nezastaví. 2.7.4. Homogenní lineární diferenciální rovnice prvního řádu, metoda separace proměnných Řešme nyní již zmíněnou rovnici y′ = y systematickým způsobem. Derivaci přepišme do tvaru podílu dvou diferenciálů, dy a dx, dy dx = y. 55 2. Úvod do matematické analýzy S diferenciály budeme opět zacházet jako s čísly, např. jimi násobit či dělit. Převedeme rovnici na tvar dy y = dx. Tím jsme vše související s y přesunuli na levou stranu rovnice a vše související s x na pravou stranu. Postup označujeme jako separaci proměnných. Nyní před oba diferenciály napíšeme integrál a zintegrujeme, čímž vyřešíme rovnici. dy y = dx → ln y = x + C Po úpravě dostaneme obecné řešení rovnice y = ex+C = eC .ex = kex , kde k := eC. Hodnotu konstanty získáme z počátečních podmínek. Požadujme například, aby y(0) = y0. Pak je k = y0 a odpovídající partikulární řešení zní y = y0ex . Jen poznamenejme, že metoda má samozřejmě exaktní důkaz, popsaný formální postup sám o sobě důkazem není. Vylučování antibiotika ledvinami Antibiotikum vankomycin je z organizmu eliminováno převážně v nezměněné podobě ledvinami, přičemž se řídí tzv. kinetikou prvního řádu, kdy je rychlost eliminace látky přímo úměrná její plazmatické koncentraci c. Rychlostí eliminace látky se rozumí pokles její koncentrace v čase, tedy vlastně záporná derivace podle času, −dc dt . Eliminaci vankomycinu tak můžeme popsat diferenciální rovnicí − dc dt = kc. kde k je konstanta úměrnosti, vyjadřující např. funkci ledvin. Rovnice je separovatelná do tvaru dc c = −kdt. Po integraci dostaneme ln c = −kt + b → c = B.e−kt , kde b, resp. B = eb je integrační konstanta. Tím jsme získali obecné řešení. Hodnotu konstanty B určíme z počáteční podmínky. Koncentraci vankomycinu v čase 0 označme c0. Platí tedy c0 = B.e−k.0 = B. Finálním partikulárním řešením proto je c = c0.e−kt . Příklady průběhů funkce pro různé počáteční koncentrace a hodnoty konstanty k ukazuje následující graf. 56 2.7. Obyčejné diferenciální rovnice 2 4 1 2 3 4 5 t c Poznamenejme ještě, že rovnice dc dt = −kc je lineární a homogenní, protože ji můžeme upravit na tvar s nulovou pravou stranou c′ + kc = 0. Viděli jsme, že kinetika prvního řádu vede na diferenciální rovnici, jejímž řešením je klesající exponenciála. K podobným diferenciálním rovnicím vede i řada dalších procesů známých z biologie a medicíny, jako jsou radioaktivní rozpad či monomolekulární přeměny molekul. Proto se klesající exponenciála vyskytuje v biologii tak často. Místo konstanty k se často používá poločas t1/2. Za dobu jednoho poločasu klesne koncentrace látky na polovinu. Proto platí c = c0 2 = c0e−kt1/2 → t1/2 = ln 2 k . Po 5 poločasech látka téměř zmizí, resp. klesne 25 = 32-krát z původní koncentrace. 2.7.5. Nehomogenní lineární diferenciální rovnice prvního řádu, metoda variace konstant Nyní si popíšeme způsob řešení nehomogenních lineárních diferenciálních rovnic prvního řádu, tzv. metodu variace konstant. Nejprve si postup ukážeme na konkrétním příkladu, poté obecně. Nitrožilní podávání vankomycinu Rozšíříme předchozí příklad s eliminací vankomycinu o situaci, kdy vankomycin současně kontinuálně podáváme infúzí rychlostí v0. Zajímá nás, jak se vyvíjí plazmatická koncentrace v čase poté, co zapneme infuzi s vankomycinem. Problém nyní popisuje rovnice dc dt = v0 − kc, zahrnující jak eliminaci ledvinami, tak kontinuální podávání léku. Oproti předchozímu příkladu jde nyní o nehomogenní rovnici s nenulovou pravou stranou c′ + kc = v0, kde již nemůžeme separovat proměnné. K řešení použijeme následující poněkud komplikovaný „trik“, označovaný jako metoda variace konstant. Nejprve si z nehomogenní rovnice vytvoříme rovnici homogenní tím, 57 2. Úvod do matematické analýzy že pravou stranu položíme rovnu 0, c′ + kc = 0. Získáme tak odpovídající homogenní rovnici dc c = −kdt, kterou jsme řešili již v předchozím příkladě a nalezli řešení c = B.e−kt , kde B byla konstanta. Variace konstant spočívá v tom, že konstantu B přestaneme považovat za konstantu, ale budeme ji dále považovat za funkci času, B(t). Řešení původní nehomogenní rovnice tak budeme hledat ve tvaru c = B(t).e−kt . Pro c′ pak platí dc dt = B′ (t).e−kt − kB(t)e−kt . Po dosazení do nehomogenní rovnice dostaneme B′ (t).e−kt − kB(t)e−kt = v0 − kB(t).e−kt . Po odečtení stejných členů na obou stranách získáme diferenciální rovnici pro B(t) B′ (t).e−kt = v0, která je separovatelná do tvaru dB = v0ektdt. Proto dB = v0ekt dt → B = v0 k ekt + D, kde D je další integrační konstanta. Řešením původní nehomogenní rovnice tedy je c = B(t)e−kt = v0 k ekt + D .e−kt = v0 k + De−kt . Na počátku požadujme nulovou koncentraci vankomycinu, tedy c(0) = 0, odkud plyne 0 = v0 k + De−k.0 → D = − v0 k . Konečně tak dostáváme definitivní partikulární řešení naší úlohy, totiž c = v0 k 1 − e−kt . Příklady řešení pro různé hodnoty parametrů, rychlosti infuze a funkce ledvin, ukazuje následující graf. 58 2.7. Obyčejné diferenciální rovnice 2 4 1 2 3 4 5 t c Koncentrace zpočátku rychle roste k setrvalé, stacionární hodnotě, pro níž (v nekonečném čase) platí cstac = v0 k 1 − e−k∞ = v0 k . V reálném životě považujeme koncentraci za ustálenou po zhruba 5 poločasech. Nyní zformulujeme postup pro obecný případ nehomogenní lineární diferenciální rovnici prvního řádu a(x)y′ + b(x)y = c(x). V předchozím příkladu šlo o speciální případ s konstantními koeficienty a = 1, b = k i c = v0. Rovnice je nehomogenní, protože má nenulovou pravou stranu. Nejprve vyřešíme odpovídající homogenní rovnici a(x)y′ + b(x)y = 0. Tu můžeme snadno separovat a dostaneme dy y = − b(x) a(x) dx. Po integraci pak máme ln y = − b(x) a(x) dx + C → y = ke − b(x) a(x) dx , kde k je konstanta. Nyní použijeme variaci konstanty k, kterou budeme dále považovat za funkci x, a budeme hledat řešení nehomogenní rovnice ve tvaru y = k(x)e − b(x) a(x) dx . Pro y′ platí y′ = k′ (x)e − b(x) a(x) dx − k(x) b(x) a(x) e − b(x) a(x) dx . Pro jasnost výkladu dodejme, že jsme zde derivovali pro nás možná neobvyklou složenou funkci e − b(x) a(x) dx , kde vnější funkce je eněco a vnitřní funkce je −b(x) a(x) dx. Derivace vnitřní funkce je snadná, protože d dx f(x)dx = f(x). Aplikací pravidla pro derivaci složené funkce „vnější funkce 59 2. Úvod do matematické analýzy krát vnitřní funkce“ hned dostaneme d dx e − b(x) a(x) dx = e − b(x) a(x) dx . − b(x) a(x) . Dosadíme za y a y′ do nehomogenní rovnice a dostaneme a(x)k′ (x)e − b(x) a(x) dx − a(x)k(x) b(x) a(x) e − b(x) a(x) dx + b(x)k(x)e − b(x) a(x) dx = c(x). Druhý a třetí člen se odečtou a získáme separovatelnou rovnici pro k(x) dk(x) dx a(x)e − b(x) a(x) dx = c(x). Po separaci a integraci obdržíme dk = c(x) a(x) e b(x) a(x) dx dx → k = c(x) a(x) e b(x) a(x) dx dx + D. Dosadíme do původní rovnice a získáme poněkud komplikovaný tvar obecného řešení. y = e − b(x) a(x) dx c(x) a(x) e b(x) a(x) dx dx + De − b(x) a(x) dx . Počáteční podmínky pak vyberou potřebné konkrétní partikulární řešení. 2.7.6. Soustavy obyčejných diferenciálních rovnic prvního řádu Soustavy obyčejných diferenciálních rovnic jsou mimořádně důležité, protože popisují řadu reálných procesů, kdy spolu různé proměnné interagují. Ilustrujme představu soustav diferenciálních rovnic dvěma příklady: Chceme matematicky popsat vývoj koncentrace inzulínu a glukózy v čase. Obě látky se vzájemně ovlivňují. Inzulín snižuje koncentraci glukózy, zároveň je však tvorba inzulínu závislá na její koncentraci. Inzulín je současně odbouráván kinetikou prvního řádu, nezávisle na koncentraci glukózy. Glukózu budeme zároveň přivádět infúzí konstantní rychlostí v0. Považujme nyní pro zjednodušení všechny vzájemné závislosti za lineární (s konstantami úměrnosti ki), byť to neodpovídá fyziologické realitě. g bude značit koncentraci glukózy (g := [glukóza]) a I koncentraci inzulínu (I := [inzulín]). Změny koncentrace glukózy a inzulínu v čase můžeme popsat následující dvojicí diferenciálních rovnic dg dt = v0 − k1I dI dt = k2g − k3I Hormon trijódthyronin (T3) tlumí či stimuluje tvorbu hormonu TSH, přičemž intenzita stimulace je popsána nějakou funkcí f koncentrace T3, f([T3]). Zároveň TSH stimuluje tvorbu T3, intenzita stimulace bude popsána funkcí g([TSH]). Jak TSH, tak T3 též spontánně degradují, s konstantami k1 a k2. Napišme odpovídající dvojici diferenciálních rovnic. 60 2.7. Obyčejné diferenciální rovnice d[TSH] dt = f([T3]) − k1[TSH] d[T3] dt = g([TSH]) − k2[T3] V obou případech je dvojice diferenciálních rovnic „zvláštní“ tím, že ani jednu z rovnic nemůžeme řešit samostatně, neboť pro vyšetření každé z rovnic potřebujeme znát řešení druhé rovnice. Takovou dvojici rovnic označujeme jako soustavu diferenciálních rovnic. Analogická situace nastává u soustavy algebraických rovnic, kde jsou jednotlivé rovnice též provázané. Soustava rovnic může být libovolně rozsáhlá. Řešit soustavu diferenciálních rovnic analyticky je možné jen v nejjednodušších případech, obvykle je nezbytné řešení numerické. Soustavu algebraických rovnic můžeme řešit eliminací proměnných, kdy z jedné rovnice vyjádříme jednu z proměnných a dosadíme ji do ostatních rovnic. Zkusme použít podobný postup na soustavu diferenciálních rovnic popisujících glukózu a inzulín dg dt = v0 − k1I dI dt = k2g − k3I. Zkusíme eliminovat glukózu. Zderivujme druhou rovnici podle času a dosaďme poté za g′ z první rovnice. d2I dt2 = k2 dg dt − k3 dI dt = k2v0 − k1k2I − k3 dI dt Skutečně jsme tak eliminovali glukózu a získali jsme nehomogenní lineární diferenciální rovnici druhého řádu s konstantními koeficienty d2I dt2 + k3 dI dt + k1k2I = k2v0, kterou budeme řešit v další kapitole. Jakmile pak nalezneme funkci I(t), z první rovnice dopočteme g(t). Později zjistíme, že oproti rovnicím prvního řádu určují hodnoty konstant ki nejen konkrétní hodnoty nalezené funkce, ale i její kvalitativní charakteristiky, např. jestli řešení v čase konverguje, zda dochází k oscilacím apod. Soustavu jsme tedy řešili tak, že jsme eliminovali proměnnou a ze soustavy dvou rovnic prvního řádu jsme získali jednu rovnici druhého řádu, kterou budeme dále analyticky řešit. Pro numerické řešení diferenciálních rovnic, které je z praktického pohledu důležitější, je ale postup obvykle opačný. Numericky řešit soustavu rovnic prvního řádu je totiž relativně snadné. Proto se nabízí, pokusit se rovnici vyššího řádu naopak převést na soustavu rovnic prvního řádu a tu pak numericky řešit. Postup je snadný. Jako příklad vezměme rovnici druhého řádu y′′ + by′ + y = d s neznámou funkcí y(x). Definujme novou funkci z(x) := y′ jako derivaci funkce y. Pak platí 61 2. Úvod do matematické analýzy z′ = y′′ a rovnici můžeme přepsat do tvaru z′ + bz + y = d. Můžeme sestavit novou soustavu dvou rovnic pro 2 neznámé funkce y a z, kterou dále numericky řešíme. dz dx = d − y − bz dy dx = z Pro potřeby numerického řešení diferenciálních rovnic kteréhokoli řádu tedy stačí umět vyřešit soustavu rovnic prvního řádu. 2.7.7. Lineární diferenciální rovnice druhého řádu V poslední části kapitol o diferenciálních rovnicích se budeme zabývat analytickým řešení nehomogenní rovnice druhého řádu s konstantními koeficienty. Takovou rovnicí je např. výše odvozená rovnice pro inzulín d2I dt2 + k3 dI dt + k1k2I = k2v0. Pro jednoduchost zápisu přeznačme konstanty na b, c a d. Před nejvyšší derivací konstanta být nemusí, poněvadž je nutně nenulová a lze jí krátit. d2I dt2 + b dI dt + cI = d Řešme opět nejprve homogenní rovnici d2I dt2 + b dI dt + cI = 0. Vysvětlíme nejprve pojem lineární kombinace. Mějme libovolné funkce I1 a I2. Lineární kombinací funkcí I1 a I2 se rozumí jejich násobky a součty. Nechť p a q jsou libovolná reálná čísla. Pak každou funkci I(x) := pI1(x) + qI2(x) označíme jako lineární kombinaci funkcí I1 a I2. Každá homogenní diferenciální rovnice má pozoruhodnou vlastnost. Jestliže nějaké funkce I1 a I2 jsou řešeními homogenní rovnice, pak i jejich jakákoli lineární kombinace je řešením. Důkaz je snadný. Nechť tedy I1 a I2 jsou řešeními homogenní rovnice. Pak nutně platí d2I1 dt2 + b dI1 dt + cI1 = 0 a d2I2 dt2 + b dI2 dt + cI2 = 0. Dosaďme nyní I(x) := pI1(x) + qI2(x) do homogenní rovnice, rovnici upravme a využijme, co 62 2.7. Obyčejné diferenciální rovnice už víme o funkcích I1 a I2. d2I dt2 + b dI dt + cI = p d2I1 dt2 + b dI1 dt + cI1 + q d2I2 dt2 + b dI2 dt + cI2 = 0 + 0 = 0 Vidíme tedy, že i lineární kombinace I(x) skutečně splňuje homogenní rovnici a je tedy též jejím řešením, což jsme chtěli dokázat. Nehomogenní diferenciální rovnice tuto vlastnost bohužel nesplňuje. Má však jinou pozoruhodnou vlastnost. Obecné řešení nehomogenní rovnice ION lze získat jako součet kteréhokoli jednoho partikulárního řešení nehomogenní rovnice IPN a obecného řešení homogenní rovnice IOH. ION = IPN + IOH Najít nějaké partikulární řešení nehomogenní rovnice může být snadné, lze ho často „uhádnout“. Např. zjevným partikulární řešením nehomogenní rovnice d2I dt2 + b dI dt + cI = d je konstantní řešení IPN = d c . Pak už stačí „pouze“ najít obecné řešení homogenní rovnice. I zde je důkaz snadný, proto si jej ukážeme. Představme si, že už známe nějaké obecné řešení nehomogenní rovnice ION a známe rovněž jakékoli jedno řešení partikulárního řešení nehomogenní rovnice IPN . Pak obě tato řešení splňují nehomogenní rovnici, platí tedy d2ION dt2 + b dION dt + cION = d i d2IPN dt2 + b dIPN dt + IPN I = d. Pokud obě rovnice odečteme, zjistíme, že d2(ION − IPN ) dt2 + b d(ION − IPN ) dt + c(ION − IPN ) = 0. ION − IPN je tedy nutně řešením homogenní rovnice IOH = ION − IPN . Proto je jasné, že platí zmíněná věta ION = IPN + IOH. Pokračujme dále. Zkusme nyní najít řešení homogenní rovnice, a to ve tvaru I = ekt. Po dosazení do rovnice a zkrácení ekt dostaneme k2 ekt + bkekt + cekt = 0 → k2 + bk + c = 0. Aby tedy I = ekt bylo řešením, musí k splňovat rovnici, musí proto platit k1,2 = −b ± √ b2 − 4c 2 . Můžeme rozlišit 3 situace podle hodnoty diskriminantu D = √ b2 − 4c. 1. D > 0 Dostáváme 2 reálné hodnoty k1,2 a 2 jim odpovídající řešení I1 = ek1t a I2 = ek2t. Řešení 63 2. Úvod do matematické analýzy jsou tzv. lineárně nezávislá, což znamená, že nelze vyjádřit jedno řešení jako násobek druhého řešení. V hlubší teorii diferenciálních rovnic se ukazuje, že rovnice n-tého řádu má nejvýše n lineárně nezávislých řešení. Protože řešíme rovnici druhého řádu, jsou řešení I1 a I2 veškerá lineárně nezávislá řešení. Jakékoli další řešení I(x) homogenní rovnice lze vyjádřit v již známém tvaru I(x) = pI1(x) + qI2(x), tedy IOH = pek1t + qek2t . Obecné řešení nehomogenní rovnice je pak ION = d c + pek1t + qek2t . Konstanty p a q se určí z počátečních podmínek, které v případě rovnice druhého řádu musí být dvě, např. počáteční koncentrace inzulínu a počáteční rychlost tvorby inzulínu (což vlastně nepřímo vyjadřuje počáteční koncentraci glukózy). V předchozím příkladu s inzulínem byly b i c kladné, proto je v případě kladného diskriminantu určitě 0 < √ b2 − 4c < b a obě konstanty k1,2 = −b ± √ b2 − 4c 2 < 0 jsou záporné. Obecné řešení ION proto můžeme napsat jako ION = d c + pe−|k1|t + qe−|k2|t . S časem tedy exponenciální komponenty klesají k 0 a zůstává pouze stacionární hladina inzulínu d c . Exponenciální komponenty se uplatní pouze zpočátku, než se ustaví stacionární hladina. Obrázek ukazuje možné průběhy koncentrací inzulínu, pokud je počáteční hladina nad nebo pod hladinou stacionární. 2 4 1 2 3 4 5 t I 2. D = 0 Pro nulový diskriminant dostáváme jediné lineárně nezávislé řešení ve tvaru ekt, totiž I1 = e −b 2 t . 64 2.7. Obyčejné diferenciální rovnice Vzhledem k nulovému diskriminantu platí b2 − 4c = 0 → c = b2 4 , čímž se diferenciální rovnice převádí na tvar d2I dt2 + b dI dt + b2 4 I = 0. Prozradíme si její druhé lineárně nezávislé řešení. Je jím I2 = te −b 2 t . Pro obecné řešení nehomogenní rovnice s nulovým diskriminantem tedy získáme ION = d c + pe −b 2 t + qte −b 2 t . V příkladu s inzulínem bylo b kladné, takže řešení opět obsahuje klesající exponenciály a je kvalitativně podobné řešení s kladným diskriminantem, blíží se ke stacionární hladině. Několik možných průběhů funkcí ukazuje obrázek. 2 4 1 2 3 4 5 t I 3. D < 0 Kvalitativně odlišné řešení obdržíme pro záporný diskriminant, kdy pro odmocninu neexistuje reálné řešení, ale existují 2 řešení v oboru komplexních čísel. Odmocninu ze záporného diskriminantu můžeme upravit do následujícího komplexního tvaru. √ D = −|D| = √ −1 |D| = i |D| Proto k1,2 = −b ± √ D 2 = −b ± i |D| 2 . 65 2. Úvod do matematické analýzy Dostáváme tak 2 komplexně sdružená lineárně nezávislá řešení I1 = e −b+i √ |D| 2 = e− b 2 t ei √ |D| 2 t I2 = e −b−i √ |D| 2 = e− b 2 t e−i √ |D| 2 t . To je na první pohled podivný výsledek, poněvadž v reálném fyzickém světě musí být řešení reálná. Komplexní řešení je pouze matematická konstrukce. Můžeme však využít výše popsanou vlastnost homogenní lineární rovnice, že součet řešení je též řešením. Zkusme obě komplexně sdružená řešení převést do goniometrického tvaru a sečíst. I1 + I2 = e− b 2 t . ei √ |D| 2 t + e−i √ |D| 2 t = e− b 2 t . cos |D| 2 t + i sin |D| 2 t + cos |D| 2 t − i sin |D| 2 t = 2e− b 2 t cos |D| 2 t Eliminovali jsme tak komplexní členy a zbylo nám reálné řešení! Poznamenejme, že druhé lineárně nezávislé řešení bychom získali odečtením obou řešení. Řešení by bylo čistě imaginární a pro reálný svět irelevantní. Pro obecné řešení nehomogenní rovnice se záporným diskriminantem tak získáme ION = d c + pe− b 2 t cos |D| 2 t. Řešení je kvalitativně zcela odlišné od řešení předcházející, vyskytují se v něm totiž oscilace. Ve výrazu e− b 2 t cos |D| 2 t můžeme rozlišit dvě části - oscilaci s konstantní amplitudou cos √ |D| 2 t a exponenciálně klesající amplitudu e− b 2 t . V čase tedy oscilující komponenta odezní a zbyde konstantní hladina inzulínu I0 = d c . Obrázek ukazuje možný průběh koncentrace inzulínu. Červené čárkované linie vyznačují exponenciálně klesající amplitudu oscilací. 66 2.7. Obyčejné diferenciální rovnice 2 4 1 2 3 4 5 t I Všimněme si, že parametry původní rovnice, resp. soustavy rovnic, určovaly, zda dojde či nedojde k oscilacím. Oscilace v regulačních systémech je tedy možná, ale nikoli nutná. 67 3. Poznámky k numerické matematice Řadu, či spíše většinu reálných úloh nelze řešit analyticky. Nepodaří se nám najít jednoduchý vztah, vzorec, do něhož můžeme dosadit a ihned zjistit výsledek. Téměř zcela to platí pro diferenciální rovnice. V kapitole 2.7 jsme řešili všechny úlohy analyticky, to byly ale ve skutečnosti pečlivě vybrané výjimky. Většinou je třeba úžít nějaký jiný postup, abychom získali alespoň číselný výsledek, když už nemáme analytické řešení. Rozvojem těchto postupů a a studiem jejich vlastností se zabývá numerická matematika. Formuluje též algoritmy k hledání řešení. Tím se pohybuje na hranici matematiky a informatiky. V téměř synonymním významu též hovoříme o disciplíně zvané výpočetní věda, computational science (nikoli computer science). 3.1. Numerické řešení algebraických rovnic Analyticky umíme řešit jednoduché algebraické rovnice, jako x2 + 3x + 2 = 0. Nelineární algebraické rovnice, např. cos x = x musíme řešit numericky. Zde si představíme 3 postupy numerického řešení algebraických rovnic - metodu půlení intervalů, metodu prosté iterace a metodu Newtonovu. Všechny tři metody mají iterativní charakter. Iterace znamená, že se znovu a znovu opakuje stejný výpočet s odlišnými čísly, přičemž výstup i-tého kroku je vstupem pro krok i + 1. Na počátku je třeba zvolit nějaký odhad řešení, označme jej x0. Tato hodnota je vstupem pro první iteraci. Výsledky je nový a snad i přesnější odhad řešení, x1. Ten je vstupem 2. iterace, výstupem je ještě přesnější odhad x2. Následují další iterace. Pokud se již řešení mezi jednotlivými iteracemi příliš nemění, změna je např. menší než předem zvolené kritérium ukončení ε, |xi −xi−1| < ε, program se ukončí a vypíše aktuální hodnotu xi. Různé postupy se liší konvergencí a efektivitou. Konvergencí se míní skutečnost, že se iterace stále více blíží správnému řešení. Konvergence může záviset na volbě počátečního x0 - pro některá x0 může iterace konvergovat, pro jiná nikoli. Efektivitou se rozumí počet provedených iterací, než program dosáhne kritéria ukončení. Každou algebraickou rovnici lze upravit na tvar f(x) = 0. Hledejme tedy numerické řešení této rovnice. Nechť je řešením rovnice xs, platí tedy f(xs) = 0. 3.1.1. Metoda půlení intervalů Metoda půlení intervalů je nejjednodušší. Obr. 3.1 ji demonstruje pro případ funkce f(x) = x − cos x. Je třeba zvolit dvě počáteční hodnoty xL 0 a xR 0 , jednu vlevo a druhou vpravo od xs. Tyto dvě hodnoty vymezují interval, v němž se nachází řešení. Budeme uvažujeme pouze situace, kdy funkce f(x) protíná osu x (v bodě xs) a v okolí bodu xs je monotónní, jako na obr. 3.1. V takovém případě totiž musí mít f(xL 0 ) a f(xR 0 ) opačná znamení, protože v xs je funkce nulová, f(xs) = 0. Opačné znamení vyjádříme podmínkou f(xL 0 ).f(xR 0 ) < 0. Neuvažujeme tedy situaci, kdy funkce osu neprotíná, pouze se jí dotýká, jako v případě funkce x2 v bodě x = 0. 68 3.1. Numerické řešení algebraických rovnic V každé iteraci najdeme prostřední hodnotu xM mezi oběma krajními hodnotami xM i := xR i − xL i 2 a určíme její funkční hodnotu, f(xM i ). Uvažme, že se řešení xs určitě musí nacházet mezi xM i a tou z krajních hodnot, která má opačné znaménko než f(xM i ). Pro další iteraci proto definujeme novou dvojici krajních hodnot xL i+1 a xR i+1 tak, že vždy jednou z nových krajních hodnot se stane xM i a druhá se nezmění. Přitom xL i+1 := xM i a xR i+1 := xR i , pokud má pravá hodnota opačné znaménko (f(xM i ).f(xR i ) < 0), a xR i+1 := xM i a xL i+1 := xL i , pokud má levá hodnota opačné znaménko. V každé iteraci se interval obsahují řešení xs zkrátí na polovinu, odtud název metody. Iterace se provádějí tak dlouho, až je šířka intervalu menší než předem zvolené ε. Dokonce stačí polovina intervalu, protože xM i se od xs liší nanejvýš o polovinu délky intervalu [xL i , xR i ]. Výhodou metody je její jistá konvergence, pokud se nám podaří najít monotónní úsek funkce v okolí řešení. 1 1 x cos x xs ≈ 0, 739 x f(x) (a) Rovnost funkcí. x = cos(x). 1 −1 1 f(x) = x − cos x xL xR xM xs x f(x) (b) Kořen rovnice. f(x) = x − cos(x) = 0. Obrázek 3.1.: Metoda půlení intervalů. Napišme v Pythonu program, který implementuje metodu půlení intervalů a řeší rovnici cos(x) = x. import math def g(x): return x−math.cos(x) epsilon = 0.001 # po ž adovan á př esnost řeš en í j=0 # sledov ání po č tu iterac í xL=0.0 # lev á krajn í hodnota po čá te ční ho intervalu xR=1.0 # prav á krajn í hodnota po čá te ční ho intervalu while abs(xR−xL)/2 > epsilon: # krit é rium ukon č en í iterac í xM = (xL+xR)/2 # definice st ř edu intervalu if g(xM)∗g(xR)<0: # volba nov ý ch krajn í ch hodnot xL = xM else: 69 3. Poznámky k numerické matematice xR = xM j+=1 # př ibyla 1 iterace print(xL) # lev á krajn í hodnota kone čné ho intervalu print(xR) # prav á krajn í hodnota kone čné ho intervalu print(j) # po č et proveden ý ch iterac í . V daném příkladu získáme pro ε = 0, 001 po 9 iteracích interval řešení [0.73828125, 0.740234375]. Pro představu přesnosti dodejme, že na 8 desetinných míst je xs = 0, 73908513. 3.1.2. Metoda prosté iterace Další metodou, zajímavou, ale asi nejméně používanou, je metoda prosté iterace. Je nutné z řešené rovnice f(x) = 0 vyjádřit x „jako funkci x“, tedy rovnici přeformulovat do tvaru x = g(x). Například rovnici x − cos x = 0, kde f(x) = x − cos x, přeformulujeme do tvaru x = cos x, kde g(x) = cos x. Opět se zvolí počáteční odhad řešení x0. Každý krok iterace je charakterizován jednoduchým předpisem xi+1 := g(xi). Princip algoritmu objasňuje obr. 3.2. Algoritmus „postupuje“ ve směru červených šipek. Problematické jsou podmínky konvergence. Aby algoritmus konvergoval, je nutné, aby pro všechny hodnoty mezi x0 a řešením xs platilo, že |g′(x)| < 1. Funkce tedy nesmí v žádném bodě tohoto intervalu růst nebo klesat příliš rychle. To často neplatí. Též rychlost konvergence závisí na |g′(x)| a může být nízká. 1 1 x0 x1x2 cos x x g(x) Obrázek 3.2.: Metoda prosté iterace. g(x) = cos(x). Implementujme v Pythonu algoritmus řešící rovnici cos(x) = x pomocí prosté iterace. import math def g(x): return math.cos(x) 70 3.1. Numerické řešení algebraických rovnic j=0 # sledov ání po č tu iterac í epsilon = 0.001 # po ž adovan á př esnost řeš en í x1=0.9 # po čá te ční hodnota x2=g(x1) while abs(x1−x2) > epsilon: # krit é rium ukon č en í iterac í x1=x2 # itera ční př edpis x2=g(x1) j+=1 # př ibyla 1 iterace print(x1) # př edposledn í hodnota iterace print(x2) # posledn í hodnota iterace print(j) # po č et proveden ý ch iterac í Pro stejnou přesnost ε = 0, 001 jako v předchozím příkladě získáme z poslední iterace dvojici hodnot 0, 7386421766270547 a 0, 7393834415834122, avšak až po 15 iteracích, oproti předchozím 9 iteracím. 3.1.3. Newtonova metoda Populární je Newtonova metoda, označovaná též Newton-Raphsonova metoda nebo metoda tečen. Konverguje velmi rychle, ale nikoli vždy. Řešíme opět rovnici f(x) = 0. Současně však musíme znát derivaci funkce f, f′. Opět je nutné poskytnou počáteční odhad řešení x0. Princip metody ilustruje obr. 3.3. V bodě x0 zjistíme derivaci f′(x0), čímž známe směrnici tečny v tomto bodě. Posuneme se do bodu x1, kde tečna protíná osu x. Tím vznikne bod x1. Zde opět zjistíme hodnotu derivace a „zkonstruujeme“ tečnu k funkci v tomto bodě. Obecně xi+1 je bod, kde tečna v bodě xi protíná osu x. Z obr. 3.3 je zřejmé, že platí f′ (x0) = f(x0) x0 − x1 → x1 = x0 − f(x0) f′(x0) . Pro iterační předpis proto obecně platí xi+1 := xi − f(xi) f′(xi) . Poznamenejme pro úplnost, že pokud derivaci neznáme a nahradíme ji odhadem derivace jako podílu 2 rozdílů ze dvou u sebe blízko ležících bodů, přechází metoda tečen v tzv. metodu sečen. Implementujme v Pythonu algoritmus řešící opět stejnou rovnici cos(x) = x, tentokrát Newtonovou metodou. import math def f(x): # řeš en á rovnice return x−math.cos(x) def fdev(x): # derivace funkce f 71 3. Poznámky k numerické matematice 1 −1 1 f(x) = x − cos x x0 x1 x2 x f(x) Obrázek 3.3.: Newtonova metoda. f(x) = x − cos(x). return 1+math.sin(x) j=0 # sledov ání po č tu iterac í epsilon = 0.001 # po ž adovan á př esnost řeš en í x0=1 # po čá te ční hodnota x1=x0−f(x0)/fdev(x0) # " nult á" iterace while abs(x0−x1) > epsilon: # krit é rium ukon č en í iterac í x0=x1 x1=x0−f(x0)/fdev(x0) # itera ční př edpis j+=1 # př ibyla 1 iterace print(x0) # př edposledn í hodnota iterace print(x1) # posledn í hodnota iterace print(j) # po č et proveden ý ch iterac í Pro stejnou přesnost ε = 0, 001 jako v předchozím příkladě získáme z poslední iterace dvojici hodnot 0, 7391128909113617 a 0, 739085133385284. Stačily nám k tomu pouhé 2 iterace!! Počet iterací přitom s rostoucí přesností roste velmi pomalu. Například pro řešení s přesností 11 desetinných míst (ε = 0, 00000000001) stačí pouhé 4 iterace (xs = 0.7390851332151607). 3.2. Numerické řešení diferenciálních rovnic Numerické řešení diferenciálních rovnic je stěžejní téma pro potřeby matematického modelování. Představíme si dva nejznámější iterativní postupy, jednodušší Eulerovu metodu a složitější, ale přesnější metodu podle Runga a Kutty. Diferenciální rovnici musíme nejprve převést do explicitního tvaru, kdy na levé straně rovnice se vyskytuje pouze derivace a na pravé straně všechny členy bez derivace, tedy do podoby dy dx = f(y, x). 72 3.2. Numerické řešení diferenciálních rovnic Hledanou neznámou bude funkce y(x). Pokud není derivace vyjádřena explicitně, což často ani není možné, hovoříme o tzv. implicitním tvaru diferenciální rovnice, který obecně můžeme zapsat jako f(y′, y, x) = 0. Pak je do každého kroku numerického řešení nutno vložit řešení algebraické rovnice pomocí některé z metod uvedených v předchozí kapitole. Vyjádřeme diferenciální rovnice v explicitním tvaru. 1. xy′ + 4y = x2√ y. Neznámou funkcí je y, proměnnou je x. y′ = x2√ y − 4y x 2. √ x′t + xt2 = 0. Neznámou funkcí je x, proměnnou je t. x′ = −xt2 t 2 = x2 t2 3. sin (z′t2) + (z′)2 = zt. Neznámou funkcí je z, proměnnou je t. V tomto případě nelze vyjádřit z′ v explicitním tvaru. Rovnici musíme řešit v implicitním tvaru. 3.2.1. Eulerova metoda Eulerova metoda využívá skutečnosti, že derivace je podíl dvou (nekonečně) malých rozdílů, přibližně tedy platí dx dt ≈ ∆x ∆t . Výraz pro derivaci x′ = f(x, t) tak můžeme přepsat do přibližného tvaru ∆x ∆t ≈ f(x, t) → ∆x ≈ f(x, t).∆t. Princip metody ilustruje obr. 3.4. Pokud známe derivaci v bodě, pak přibližně víme, jakou hodnotu bude funkce mít o ∆t později. Musí být známa počáteční hodnota x(0) = x0 v čase t = 0 resp. t = t0. Musíme též zvolit časový krok ∆t. V každém kroku metody se posuneme v čase o ∆t dopředu a o ∆x ve funkční hodnotě, čímž získáme novou dvojici hodnot xi+1 a ti+1 po (i + 1)-ním kroku z původních xi a ti po i-tém kroku. Iterativní předpis je tak definován výrazem xi+1 := xi + f(x, t).∆t Je patrné, že se hodnota xi+1 liší od správné hodnoty x(t+∆t). V i-tém kroku tak vzniká chyba errori = x(t + ∆t) − xi+1. Chyba zjevně závisí na velikosti kroku ∆t. Drobné chyby se však kumulují v každém kroku a výsledná celková chyba postupně roste. Celkovou chybu někdy nelze eliminovat ani zmenšením kroku ∆t. Pak sice klesne chyba jednotlivého kroku, ale vzroste počet kroků a celková kumulativní chyba klesnout nemusí. Metoda podle Rungy a Kutty, popsaná v další podkapitole, tento problém řeší. Implementujme v Pythonu Eulerovu metodu pro řešení diferenciální rovnice x′ = −x. Počáteční podmínka zní x(0) = 10. Hledanou funkcí je x, proměnnou je t. Iterativní předpis bude xi+1 := xi − xi.∆t. 73 3. Poznámky k numerické matematice 1 2 3 5 10 ∆t ∆x errori xi xi+1 t x(t) Obrázek 3.4.: Eulerova metoda import numpy as np import matplotlib.pyplot as plt size = 50 # hodnotu funkce chceme naj ít v 50 bodech t = np.linspace(0, 10, size) # vektor č asov ý ch bod ů x_num = np.linspace(0, 10, size) # vektor numerick ý ch hodnot x_anal = np.linspace(0, 10, size) # vektor analytick ý ch hodnot def g(a): # derivace hledan é funkce return −a dt = 10/size # č asov ý krok (v tomto pří pad ě 10/50 = 0.2) i=0 x[i] = 10 # po čá te ční hodnota funkce − x( t0 ) t[i] = 0 # po čá te ční č as while i < (size−1): # iterace dx = dt ∗ g(x_num[i]) x_num[i+1] = x_num[i] + dx t[i+1] = t[i] + dt i += 1 x_anal = 10∗np.exp(−t) # analytick é řeš en í 74 3.2. Numerické řešení diferenciálních rovnic # graf řeš en í fig, axes = plt.subplots() axes.plot(t, x_num, ’b’, label = ’numerické řešení’) axes.plot(t, x_anal , ’r’, label = ’analytické řešení’) axes.set_xlabel(’čas’) axes.set_ylabel(’x’) axes.legend() Při počáteční podmínce x(0) = 10 je analytickým řešením x = 10e−t. Numerické i analytické řešení je zobrazeno na obrázku. Je patrna drobná odlišnost obou křivek, tedy chyba Eulerovy metody. 3.2.2. Metoda Rungeho a Kutty Jak je jistě patrno, je Eulerova metoda velmi jednoduchá, ale nepříliš přesná. Výrazně přesnější metodu numerického řešení diferenciálních rovnic vypracovali počátkem 20. století němečtí matematici Carl Runge a Wilhelm Kutta. Metoda se snaží odstranit nepřesný odhad ∆x po kroku ∆t, tedy snížit chybu errori. Hodnotu x(t + ∆t) neodhaduje jednou rovnicí, ale v několika navzájem propojených rovnicích, též označovaných jako „kroky“. Jde o tzv. vícekrokovou metodu. Představíme si nejpoužívanější variantu se 4 kroky, tzv. Runge-Kuttovu metodu 4. řádu (často označovanou RK4). Upozorňuji na terminologický guláš - v každém 1 kroku iterace, kterých může být třeba 5000, proběhnou 4 „kroky“ odhadu ∆x. Řešíme opět rovnici dx dt = f(x, t). Opět zvolíme časový krok ∆t. Postupně spočítáme 4 odhady ∆x, označené k1 až k4 a z jejich váženého průměru dopočítáme finální odhad ∆x. K odhadu k2 se použije znalost k1, ke k3 znalost 75 3. Poznámky k numerické matematice k2 a ke k4 znalost k3. První krok, určení k1, je identický s Eulerovou metodou. Existují i jiné drobné modifikace téhož postupu. Algoritmus je následující: k1 = f (xi, ti) ∆t k2 = f xi + k1 2 , ti + ∆t 2 ∆t k3 = f xi + k2 2 , ti + ∆t 2 ∆t k4 = f (xi + k3, ti + ∆t) ∆t. Princip algoritmu je vizualizován na obrázku 3.5. Odhad „průměrného“ ∆x je ∆x := k1 + 2k2 + 2k3 + k4 6 . Odhady ti+1 a xi+1 definujeme jako ti+1 = ti + ∆t xi+1 = xi + ∆x. 1 2 3 5 10 ∆t k1 xi t x(t) 1 2 3 5 10 ∆t k1 k2 xi t x(t) 1 2 3 5 10 ∆t k2 k3 xi t x(t) 1 2 3 5 10 15 ∆t k3 k4 xi t x(t) Obrázek 3.5.: Konstrukce k1 až k4 v Rungově-Kuttově metodě Obr. 3.6 ukazuje výsledky obou metod po jednom kroku, počítáno z hodnot k1 až k4 z obr. 3.5. 76 3.2. Numerické řešení diferenciálních rovnic 1 2 3 5 10 ∆t xi xi+1,RK xi+1,Euler t x(t) Obrázek 3.6.: Porovnání přesnosti Eulerovy a Runge-Kuttovy metody Je vidět, že RK4 metoda je výrazně přesnější než Eulerova metoda. Odhad hodnoty xi+1 RK4 metodou téměř přesně souhlasí s funkční hodnotou v bodě t + ∆t, x(t + ∆). Implementujme v Pythonu Runge-Kuttovu metody pro řešení stejné diferenciální rovnici x′ = −x jako v předchozí kapitole. import numpy as np import matplotlib.pyplot as plt size = 50 # hodnotu funkce chceme naj ít v 50 bodech t = np.linspace(0, 10, size) # vektor č asov ý ch bod ů x_num = np.linspace(0, 10, size) # vektor numerick ý ch hodnot x_anal = np.linspace(0, 10, size) # vektor analytick ý ch hodnot def g(x,t=1): # derivace hledan é funkce return −x def RK(x,t=1): # 1 krok RK metody 4. řá du k1 = dt ∗ g(x,t) k2 = dt ∗ g(x+k1/2,t+dt/2) k3 = dt ∗ g(x+k2/2,t+dt/2) k4 = dt ∗ g(x+k3,t+dt) return x+(k1+2∗k2+2∗k3+k4)/6 dt = 10/size # č asov ý krok (v tomto pří pad ě 10/50 = 0.2) 77 3. Poznámky k numerické matematice i=0 x_num[i] = 10 # po čá te ční hodnota funkce − x_num ( t0 ) t[i] = 0 # po čá te ční č as while i < (size−1): # iterace x_num[i+1] = RK(x_num[i],t[i]) t[i+1] = t[i] + dt i += 1 x_anal = 10∗np.exp(−t) # analytick é řeš en í # graf řeš en í fig, axes = plt.subplots() axes.plot(t, x_num, ’b’, label = ’numerické řešení’) axes.plot(t, x_anal , ’r’, label = ’analytické řešení’) axes.set_xlabel(’čas’) axes.set_ylabel(’x’) axes.legend() Numerické i analytické řešení je zobrazeno na následujícím obrázku. Obě křivky jsou prakticky totožné. Opět je patrno, že chyba metody RK4 je výrazně menší než metody Eulerovy, ačkoli časové kroky ∆t byly zvoleny stejné. 3.3. Numerické řešení soustav diferenciálních rovnic Poněvadž je analytické řešení soustav diferenciálních rovnic možné jen vzácně, jsou numerické metody řešení zásadní. Obě výše popsané metody se dají rozšířit pro případ soustavy diferenciálních rovnic. Uvažujme dvě funkce času, x(t) a y(t), které charakterizuje soustava diferenciálních 78 3.3. Numerické řešení soustav diferenciálních rovnic rovnic dx dt = f1(x, y, t) dy dt = f2(x, y, t) s počátečními podmínkami x(0) = x0, y(0) = y0 a t(0) = t0. 3.3.1. Eulerova metoda Úprava Eulerovy metody pro případ soustavy rovnic je snadná. Rovnice analogicky upravíme na tvar ∆x ∆t ≈ f1(x, y, t) ∆y ∆t ≈ f2(x, y, t). Časový krok ∆t je společný pro obě rovnice. Každá z nich pak udává, o kolik se pro daný časových krok změní hodnota x a y. Iterační předpis musí znít xi+1 := xi + f1(x, y, t).∆t yi+1 := yi + f2(x, y, t).∆t ti+1 := ti + ∆t. Implementujme v Pythonu řešení soustavy diferenciálních rovnic dx dt = − x + 2y dy dt = − x + y pomocí Eulerovy metody. Požadujeme x(0) = 0 a y(0) = 10. Doplňme, ač je to zřejmé, že ve vztahu k obecnému zadání platí f1(x, y, t) = −x + 2y a f2(x, y, t) = −x + y. import numpy as np size = 100 # hodnotu obou funkc í chceme naj ít v 100 bodech t = np.linspace(0, 50,size) # vektor č asov ý ch bod ů x = np.linspace(0, 50,size) # vektor numerick ý ch hodnot x y = np.linspace(0, 50,size) # vektor numerick ý ch hodnot y def f1(x,y,t): # derivace hledan é funkce x(t) return −x + 2∗y def f2(x,y,t): # derivace hledan é funkce y(t) return −x + y dt = 0.1 # č asov ý krok i=0 x[i] = 0 # po čá te ční hodnota funkce x 79 3. Poznámky k numerické matematice y[i] = 10 # po čá te ční hodnota funkce y t[i] = 0 # po čá te ční č as while i < size−1: # iterace dx = dt ∗ f1(x[i],y[i],t[i]) dy = dt ∗ f2(x[i],y[i],t[i]) x[i+1] = x[i] + dx y[i+1] = y[i] + dy t[i+1] = t[i] + dt i += 1 # graf řeš en í − vý voj v č ase axes.plot(t, x, ’b’, label = ’x’) axes.plot(t, y, ’r’, label = ’y’) axes.set_xlabel(’čas’) axes.set_ylabel(’y’) axes.set_title(’vývoj v čase’) axes.legend() Obr. 3.7 (a) ukazuje časový průběh řešení. Vidíme oscilace s rostoucí amplitudou. Obr. 3.8 (a) ukazuje tzv. fázový portrét. Jde o vzájemné zobrazení vývoje funkcí x a y po eliminaci nezávisle proměnné, v tomto případě času. Kdybychom z výšky pozorovali objekt pohybující se po zemi, trajektorie jeho pohybu, kterou bychom viděli, je příkladem fázového portrétu. Samy polohy vůči osám, tedy x(t) a y(t), jsou funkcemi času. Pomocí fázového portrétu můžeme „vizualizovat chování“ soustav diferenciálních rovnice, např. hledat oscilace či stabilní a nestabilní body. Těmito (a dalšími) problémy se zabývá oblast matematické analýzy zvaná Teorie dynamických systémů. (a) Eulerova metoda (b) Runge-Kuttova metoda Obrázek 3.7.: Numerické řešení soustavy diferenciálních rovnic - vývoj v čase Nakresleme fázový portrét řešení soustavy diferenciálních rovnic uvedené v předchozím příkladě. # graf řeš en í − fá zov ý portr ét fig, axes = plt.subplots() 80 3.3. Numerické řešení soustav diferenciálních rovnic axes.plot(x, y, ’b’, label = ’dt = 0.1’) axes.set_xlabel(’x’) axes.set_ylabel(’y’) axes.set_title(’fázový portrét’) axes.legend() Výsledný portrét ukazuje obr. 3.8 (a). Okomentujeme jej později. (a) Eulerova metoda (b) Runge-Kuttova metoda Obrázek 3.8.: Numerické řešení soustavy diferenciálních rovnic - fázový portrét 3.3.2. Runge-Kuttova metoda Upravit RK4 metodu pro soustavy diferenciálních rovnic je složitější než v případě Eulerovy metody. V zásadě je třeba jednotlivá k1 až k4 počítat pro obě proměnné zároveň. k odpovídající proměnné x označme kx, ky budou odpovídat y. Pro výše uvedenou soustavu rovnic dx dt = f1(x, y, t) dy dt = f2(x, y, t) s počátečními podmínkami x(0) = x0, y(0) = y0 a t(0) = t0 zní algoritmus RK4 metody takto: 81 3. Poznámky k numerické matematice k1,x = f1 (xi, yi, ti) ∆t k1,y = f1 (xi, yi, ti) ∆t k2,x = f1 xi + k1,x 2 , yi + k1,y 2 , ti + ∆t 2 ∆t k2,y = f2 xi + k1,x 2 , yi + k1,y 2 , ti + ∆t 2 ∆t k3,x = f1 xi + k2,x 2 , yi + k2,y 2 , ti + ∆t 2 ∆t k3,y = f2 xi + k2,x 2 , yi + k2,y 2 , ti + ∆t 2 ∆t k4,x = f1 xi + k3,x, yi + k3,y, ti + ∆t ∆t k4,y = f2 xi + k3,x, yi + k3,y, ti + ∆ ∆t. První krok je opět identický s Eulerovou metodou. Odhady „průměrných“ ∆x a ∆y jsou ∆x := k1,x + 2k2,x + 2k3,x + k4,x 6 ∆y := k1,y + 2k2,y + 2k3,y + k4,y 6 . Iterační předpisy pro ti+1, xi+1 a yi+1 v jednotlivých iteracích zní ti+1 = ti + ∆t xi+1 = xi + ∆x yi+1 = yi + ∆y. Implementujme v Pythonu řešení stejné soustavy diferenciálních rovnic dx dt = − x + 2y dy dt = − x + y pomocí Runge-Kuttovy metody RK4. Požadujme opět x(0) = 0 a y(0) = 10. import numpy as np size = 100 # hodnotu obou funkc í chceme naj ít v 100 bodech t = np.linspace(0, 50,size) # vektor č asov ý ch bod ů x = np.linspace(0, 50,size) # vektor numerick ý ch hodnot x y = np.linspace(0, 50,size) # vektor numerick ý ch hodnot x def fx(x,y,t): # derivace hledan é funkce x(t) return −x + 2∗y def fy(x,y,t): # derivace hledan é funkce y(t) 82 3.3. Numerické řešení soustav diferenciálních rovnic return −x + y def RK(x,y,t=1): # 4−krokov á kalkulace k1 až k4 k1x = dt ∗ fx(x,y,t) k1y = dt ∗ fy(x,y,t) k2x = dt ∗ fx(x+k1x/2,y+k1y/2,t+dt/2) k2y = dt ∗ fy(x+k1x/2,y+k1y/2,t+dt/2) k3x = dt ∗ fx(x+k2x/2,y+k2y/2,t+dt/2) k3y = dt ∗ fy(x+k2x/2,y+k2y/2,t+dt/2) k4x = dt ∗ fx(x+k3x,y+k3y,t+dt) k4y = dt ∗ fy(x+k3x,y+k3y,t+dt) return (x+(k1x+2∗k2x+2∗k3x+k4x)/6, y+(k1y+2∗k2y+2∗k3y+k4y)/6) dt = 0.1 # č asov ý krok i=0 x[i] = 0 # po čá te ční hodnota funkce x y[i] = 10 # po čá te ční hodnota funkce y t[i] = 0 # po čá te ční č as while i < size−1: # iterace a,b = RK(x[i],y[i], t[i]) x[i+1] = a y[i+1] = b t[i+1] = t[i] + dt i += 1 Obrázky 3.7 (b) a 3.8 (b) ukazují časový průběh obou funkcí a fázový portrét při řešení RK4 metodou. Fázový portrét se podstatně liší od portrétu téže soustavy rovnic řešené Eulerovou metodou. Jde o stacionární, stále stejné cyklus oproti rozbíhavému cyklu. Stejně tak vidíme konstantní amplitudy oscilací oproti rostoucí amplitudě Eulerovou metodou (obr. 3.7 (a) a 3.8 (a)). Prozraďme, že analytické řešení soustavy s danými počátečními podmínkami je x = 20 sin t y = 10 √ 2 sin t + π/2 . Vidíme, že x a y jsou fázově posunuty, mají však konstantní amplitudu a stejnou úhlovou frekvenci. Ve fázovém diagramu proto tvoří uzavřenou elipsu. Správné řešení tedy plyne z Runge-Kuttovy metody, což opět dokumentuje její přesnost oproti Eulerově metodě (při stejném časovém kroku ∆t). Rozbíhání v Eulerově metodě je dáno postupnou kumulací chyb. Lze proto doporučit vždy upřednostnit RK metodu před Eulerovou metodou. 83 4. Poznámky k lineární algebře Matematika bývá označována jako strukturální věda, čímž se míní, že „hledá“ strukturu či zákonitosti v jistých vztazích. Matematika však není přírodní věda, toto hledání má jinou povahu než hledání v přírodních vědách. Přírodní vědy hledají zákonitosti v něčem, co je, co existuje, v přírodním světě. Matematika často postupuje tak, že extrahuje zákonitosti z intuitivně známých skutečností, např. z počítání s přirozenými čísly, a zkoumá, jaké jsou obecné důsledky těchto abstraktních zákonitostí. Lineární algebra je úchvatnou oblastí matematiky, často první výrazně abstrahující disciplínou, s níž se student matematiky setká. Buduje řadu základních představ a pojmů. Na její poznatky navazují další oblasti matematiky i fyziky, např. teorie diferenciálních rovnic či kvantová mechanika. Ilustrujme si zmíněný „abstrahující princip“ na příkladu. Dítě se v první třídě učí sčítat. 2 hrušky + 3 hrušky = 5 hrušek, 2 auta + 3 auta = 5 aut, 2 domy + 3 domy = 5 domů. Postupně zjistí, že všechny tyto rovnosti mají něco společného, totiž, že 2 + 3 = 5. Je to první stupeň abstrakce. Můžeme počítat s čísly, nepotřebujeme konkrétní předměty. Mnohem později abstrakce pokračuje. 2.(3 + 4) = 2.3 + 2.4, 4.(1 + 5) = 4.1 + 4.5. Všechna čísla ve vztazích můžeme nahradit proměnnými a, b, c, zastupujícími libovolné číslo, ale početní zákonitost, zde označovaná jako distribuční zákon, tedy a.(b + c) = a.b + a.c, stále platí. Nepotřebujeme tedy přímo čísla, stačí nám proměnné, které se řídí stejnými pravidly. Mají v jistém smyslu „stejnou strukturu“. Lineární algebra pokračuje touto cestou dále. Dalším stupněm abstrakce může být pojem vektoru. 4.1. Vektory a vektorové prostory Ukažme si, jak by cestou abstrakce matematika dospěla k pojmu vektor. Klasickou středoškolskou představou vektoru je „šipka mířící odněkud někam“. S taková „šipkou“ můžeme provádět některé „operace“, které mají charakteristické vlastnosti (viz obr. 4.1). 1. Násobení šipky číslem šipku prodlouží, zkrátí, nebo obrátí, ale šipka stále zůstává šipkou. 2. Pokud vynásobíme šipku číslem 1, nezmění se. 3. 2 šipky sečteme tak, že přiložíme druhou na konec první. Můžeme však též přiložit první na konec druhé. Výsledná šipka, resp. bod, kam šipky společně dosáhnou, je totožná. 4. „Nulovou“ šipku, tedy šipku délky O, můžeme přičíst k jakékoli šipce, aniž by se tím změnila. Právě jsme jmenovali 2 operace, sčítaní šipek a násobení šipek reálným číslem (konstantou), 84 4.1. Vektory a vektorové prostory ⃗v −2 3⃗v (a) Násobení vektoru konstantou ⃗v1 ⃗v2 ⃗v1 ⃗v2 ⃗v1+ ⃗v2 (b) Sčítání vektorů Obrázek 4.1.: Operace s vektory a popsali některé jejich vlastnosti. Dalšími typickými vlastnostmi těchto operací jsou jejich vzájemné „interakce“, označované jako komutativita, distributivita a asociativita. Zapišme popsané vlastnosti formálně, matematicky. Pojďme nyní místo slova šipka používat slovo vektor, berme je zatím jako synonyma. Vektor označme ⃗v, případně ⃗v1, ⃗v2 nebo ⃗v3. Reálné číslo, jímž násobíme, bude a. Máme tedy 2 operace - násobení vektoru konstantou a sčítání vektorů. Obě operace jsou uzavřené, což znamená, že výsledkem je opět vektor, nikoli třeba reálné číslo. ⃗v2 = a.⃗v1 násobení vektoru konstantou ⃗v = ⃗v1 + ⃗v2 sčítání vektorů Operace splňují následujících 8 vlastností, jak se můžeme na chování šipek sami snadno přesvěd- čit: ⃗v =⃗0 + ⃗v existuje neutrální prvek sčítání ⃗v + ( ⃗−v) =⃗0 existuje inverzní prvku ke každému prvku ⃗v1 + ⃗v2 = ⃗v2 + ⃗v1 komutativita sčítání ⃗v1 + (⃗v2 + ⃗v3) = (⃗v1 + (⃗v2) + ⃗v3 asociativita sčítání ⃗v = 1.⃗v existuje neutrální prvek násobení a.(⃗v1 + ⃗v2) = (a.⃗v1) + (a.⃗v2) distributivita (a + b).⃗v = a.⃗v + b.⃗v distributivita (a.b).⃗v = a.(b.⃗v) asociativita násobení Dosud jsme pouze „zkomplikovali“ banální představy o šipkách. Abstraktní krok je následující. Změňme od této chvíle význam slova vektor. Vektor již nebude znamenat pouze šipku, nýbrž jakýkoli „objekt“, na němž lze definovat nějaké 2 operace, které označíme jako sčítání a násobení číslem, které mají všech 8 uvedených vlastností. Budeme možná překvapeni, že takových objektů je řada. Krom šipek jsou jimi například n-tice čísel, polynomy kteréhokoli stupně, funkce, které jsou řešením homogenní diferenciální rovnice, matice konkrétního typu a další. Matematika se může dále zabývat pouze studiem 8 uvedených vlastností, aniž by ji zajímalo, který konkrétní objekt je „v pozadí“. Zjištěné výsledky pak budou automaticky platit pro všechny konkrétní případy vektorů. Šipky jsou tedy konkrétní, ale nikoli jediný příklad vektorů. 85 4. Poznámky k lineární algebře Zaveďme ještě důležitý pojem vektorový prostor, též označovaný jako lineární prostor. Poznamenejme jen, že slovo prostor je v matematice (přinejmenším zde) pouhé synonymum ke slovu množina, nemá jiný speciální význam. Mějme nějakou množinu V , na jejíž prvcích nějak libovolně definujeme operaci násobení reálným číslem „.“ a operaci sčítání 2 prvků „+“, přičemž ale definované operace splňují 8 výše uvedených podmínek a jsou uzavřené. Trojici (V, ., +) označíme jako vektorový prostor. Každý prvek vektorového prostoru nazveme vektor. Množina všech šipek s dvěma výše definovanými operacemi tedy zjevně tvoří vektorový prostor. Ukažme si v následujícím příkladu, že i polynomy 3. stupně můžeme považovat za vektory, prvky vektorového prostoru. Vezměme nějaké dva (obecné) polynomy 3. stupně y1 = a1x3 + b1x2 + c1x + d1 y2 = a2x3 + b2x2 + c2x + d2 Operaci násobení číslem a sčítání budeme chápat „klasicky“, jak jsme zvyklí. Násobme polynom y1 konstantou k ∈ R. Pak dostaneme y = ky1 = (ka1)x3 + (kb1)x2 + (kc1)x + (kd1), což je zjevně opět polynom 3. stupně. Operace násobení reálným čísle je tedy uzavřená. Nyní sečteme polynomy y1 a y2. y1 + y2 = (a1 + a2)x3 + (b1 + b2)x2 + (c1 + c2)x + (d1 + d2) Výsledkem je opět polynom 3. stupně. Operace je též uzavřená. Velmi jednoduše se dá dále ukázat, že tyto dvě operace splňují všech 8 výše uvedených požadavků. Jako příklady ukažme komutativitu a existenci neutrálního prvku sčítání. Pro sčítání platí komutativita: y1 + y2 = (a1 + a2)x3 + (b1 + b2)x2 + (c1 + c2)x + (d1 + d2) = (a2 + a1)x3 + (b2 + b1)x2 + (c2 + c1)x + (d2 + d1) = y2 + y1. Neutrálním prvkem sčítání je ⃗0 := 0.x3 + 0.x2 + 0.x + 0. Pro součet s neutrálním prvkem platí y +⃗0 = ax3 + bx2 + cx + d + 0x3 + 0x2 + 0x + 0 = (a + 0)x3 + (b + 0)x2 + (c + 0)x + (d + 0) = y. Polynom ⃗0 zjevně splňuje požadovanou vlastnost. Neutrální prvek sčítání tedy existuje. Takto bychom mohli dále ukázat platnost všech 8 vlastností. Polynomy 3. stupně tedy můžeme považovat za vektory. Množina všech polynomů 3. stupně společně s operacemi násobení reálným číslem a sčítání tvoří vektorový prostor. V dalším textu zúžíme naši představu vektorů pouze na n-tice čísel. Rozlišujeme řádkové vektory ⃗v = 1, 2, 3 86 4.1. Vektory a vektorové prostory a sloupcové vektory ⃗v =    1 2 3    . Záměna řádků a sloupců se označuje jako transpozice, značí se T. Tedy 1, 2, 3 =    1 2 3    T . Jednotlivá čísla uvnitř vektoru se označují složky nebo komponenty vektoru, označujeme je indexy, např. v2 = 2. i-tá složka je vi. 4.1.1. Operace s vektory Sčítání vektorů a násobení číslem probíhá „po složkách“, angl. element-wise.    5 7 9    =    1 2 3    +    4 5 6    .    −3 −6 −9    = −3.    1 2 3    . Dále definujeme skalární součin 2 vektorů jako „pronásobení“ odpovídajících složek a součet výsledků x1, x2, x3 .    y1 y2 y3    = x1y1 + x2y2 + x3y3. Elegantně můžeme skalární součin zapsat jako ⃗u.⃗v = n i=1 uivi. (1, 2, 3).(4, 5, 6)T = 1.4 + 2.5 + 3.6 = 29 V kvantové mechanice se skalární součin vektorů ⃗u a ⃗v obvykle zapisuje pomocí tzv. Diracovy braketové notace jako ⟨⃗u|⃗v⟩. Délka šipky ⃗š, jejíž složky v osách by byly šx, šy a šz, by dle Pythagorovy věty přirozeně byla š = ⃗š = š2 x + š2 y + š2 z. Analogicky proto definujeme velikost neboli normu vektoru jako v =∥⃗v∥ = v2 1 + v2 2 + . . . + v2 n. 87 4. Poznámky k lineární algebře ⃗v1 ⃗v2 φ Obrázek 4.2.: Skalární součin vektorů - geometrická interpretace Pomocí skalárního součinu můžeme normu vektoru elegantně zapsat jako v = √ ⃗v.⃗v. Norma 6-rozměrného vektoru ⃗v = (1, 2, 3, 4, 5, 6) je v = 12 + 22 + 32 + 42 + 52 + 62 ≈ 9, 54. Geometricky představuje skalární součin kolmou projekci jednoho vektoru do druhého (a násobenou druhým vektorem), viz obr 4.2. Pokud oba vektory svírají úhel φ, lze skalární součin spočítat jako ⃗u.⃗v =∥⃗u∥ .∥⃗v∥ . cos φ. Skalární součin dvou kolmých vektorů je 0. Například vektory (0, 1) a (1, 0) jsou zjevně kolmé, „leží v ose x a y“, a platí 0.1 + 1.0 = 0. Podobně vektory (3, 5) a (5, −3) jsou kolmé a platí 3.5 + 5.(−3) = 0. Ve fyzice se skalární součin vyskytuje často. Je jím například definována práce jako skalární součin vektoru síly a vektoru dráhy - W = ⃗F.⃗s. Pokud síla působí kolmo na dráhu, žádnou práci nekoná. Jako rozšíření doplňme následující abstraktní poznámku. Pokud u vektorů, tedy prvků vektorového prostoru, umíme nějak definovat normu, pak kombinaci vektorového prostoru s normou označujeme jako normovaný vektorový prostor. A pokud u vektorů umíme definovat normu i skalární součin, pak takový vektorový prostor označujeme jako Hilbertův prostor. Hilbertův prostor je základní matematická struktura, v níž se „odehrává“ kvantová mechanika. A ještě zmíníme jednu abstraktní drobnost závěrem. Pokud umíme definovat normu a skalární součin, pak můžeme výše uvedený vztah obrátit a naopak definovat abstraktní úhel mezi dvěma vektory jako cos φ := ⃗u.⃗v ∥⃗u∥ .∥⃗v∥ . Můžeme tak definovat úhel, který svírají dvě matice. Jde opět o velkou abstrakci, žádný reálný úhel matice samozřejmě nesvírají. 88 4.2. Matice 4.2. Matice Maticí rozumíme seskupení několika čísel do obdélníkového nebo čtvercového tvaru. Matici obvykle uzavíráme do kulatých nebo hranatých závorek. Rozlišujeme řádky a sloupce matice. Např. A =    1 2 3 3 5 5 8 7 6 9 1 0    je matice nazvaná A s 3 řádky a 4 sloupci. Hovoříme o matici typu 3 × 4. Obecně má matice typu m × n m řádků a n sloupců. Matice typu m × m se označuje jako čtvercová. Jednotlivá čísla označujeme jako prvky či elementy matice. Prvek v druhém řádku a třetím sloupci značíme a23, pro uvedenou matici je a23 = 8. Obecně je prvek v i-tém řádku a j-tém sloupci aij. Prvek levý horní je a11, pravý horní a1n, levý dolní am1 a prvek pravý dolní je amn.     a11 . . . a1n ... aij ... am1 . . . amn     Jednolivé řádky matice můžeme považovat za řádkové vektory, jednotlivé sloupce za sloupcové vektory. 4.2.1. Typy matic Kromě obecné matice výše uvedené, kdy je většina čísel v matici odlišných od 0 a není patrna žádná struktura uspořádání prvků, existují speciální typy matic. Diagonální matice má prvky jen na hlavní diagonále.       1 0 0 0 0 3 0 0 0 0 2 0 0 0 0 7       Jednotková matice je diagonální matice se všemi prvky rovnými 1. E4 =       1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1       Symetrická matice je symetrická vůči hlavní diagonále.       1 −1 7 −3 −1 3 5 4 7 5 2 0 −3 4 0 7       89 4. Poznámky k lineární algebře Horní a dolní trojúhelníková matice mají pouze nuly pod nebo nad hlavní diagonálou.       1 −1 7 −3 0 3 5 4 0 0 2 9 0 0 0 7       ,       1 0 0 0 −1 3 0 0 7 5 2 0 −3 4 8 7       Transponovaná matice má vyměněné řádky a sloupce. Transponovaná matice AT k výše uvedené matici A je typu 4 × 3 a zní AT =       1 5 6 2 5 9 3 8 1 3 7 0       . Pro symetrickou matici zjevně platí AT = A. 4.2.2. Operace s maticemi Sčítání a odčítání matic stejného typu je prosté sčítání a odčítání po prvcích.    1 3 −5 −2 1 4 3 4 −3    +    1 2 3 4 5 6 7 8 9    =    2 5 −2 2 6 10 10 12 6    . Totéž platí pro násobení matic číslem. 3.    1 2 3 4 5 6 7 8 9    =    3 6 9 12 15 18 21 24 27    . Operace splňují všech 8 výše popsaných vlastností. I množina všech matic stejného typu proto tvoří vektorový prostor. Chovají se totiž „jako šipky“. Násobení vektoru maticí je složitější. Matici si představíme jako m řádkových vektorů napsaných pod sebou a provedeme skalární součin každého řádku s násobeným vektorem. Postupujeme systémem „řádek-krát-sloupec“.    1 3 −5 1 −2 1 4 1 3 4 −3 1    .    1 2 3    =    1.1 + 3.2 + (−5).3 + 1.1 (−2).1 + 1.2 + 4.3 + 1.2 3.1 + 4.2 + (−3).3 + 1.3    =    −7 14 5    . Výsledky vektor má tolik prvků, jako má matice řádků. Násobený vektor musí mít tolik prvků, jako matice sloupců. Pokud je matice A typu m × n, v násobení ⃗y = A.⃗x má ⃗x n prvků a ⃗y m prvků. Nejkomplikovanější je násobení matice maticí, C = A.B. První matici, A, typu m × n si 90 4.2. Matice a1,1 . . . a1,j . . . a1,n ... ... ... ... ... ... ai,1 . . . ai,j . . . ai,n ... ... ... ... ... ... am,1 . . . am,j . . . am,n                                         b1,1 . . . b1,j . . . . . . b1,p ... ... ... bi,1 . . . bi,j . . . . . . bi,p ... ... ... bn,1 . . . bn,j . . . . . . bn,p                             c1,1 . . . c1,j . . . . . . c1,p ... ... ... ... ... ... ci,1 . . . ci,j . . . . . . ci,p ... ... ... ... ... ... cm,1 . . . cm,j . . . . . . cm,p                                         × + × + × + × + × Obrázek 4.3.: Schéma násobení matic představíme jako složenou z m řádkových vektorů o n komponentách, druhou matici B typu n×p jako složenou z p sloupcových vektorů délky n. Provedeme skalární součin každého řádkového vektoru matice A s každým sloupcovým vektorem matice B. Pro to je nutné, aby byl „vnitřní“ rozměr obou matic, v tomto případě n, stejný, tedy počet sloupců první matice musí být stejný jako počet řádků druhé matice. Výsledná matice C je typu m × p. Obecně pro prvek s indexy i, j matice C platí Cij = n k=1 Aik.Bkj. Obr. 4.3 názorně ukazuje postup výpočtu. Násobení matic A =       1 5 6 2 5 9 3 8 1 3 7 0       B =    1 6 −2 9 3 −1    C = A.B =       1.1 + 5.(−2) + 6.3 1.6 + 5.9 + 6.(−1) 2.1 + 5.(−2) + 9.3 2.6 + 5.9 + 9.(−1) 3.1 + 8.(−2) + 1.3 3.6 + 8.9 + 1.(−1) 3.1 + 7.(−2) + 0.3 3.6 + 7.9 + 0.(−1)       =       9 45 19 48 −10 89 −11 81       . Matice A je typu 4 × 3, matice B typu 3 × 2 a matice C typu 4 × 2. 91 4. Poznámky k lineární algebře 1 2 3 1 2 3 ⃗v ⃗u x y (a) Zrcadlení podle osy y = x 1 2 3 1 2 3 ⃗v ⃗u x y (b) Vertikální roztažení 1 2 3 1 2 3 ⃗v ⃗u φ = 50◦ x y (c) Rotace o 50° Obrázek 4.4.: Geometrická interpretace násobení vektoru maticí 4.2.3. Geometrická interpretace násobení vektoru maticí Mějme jako příklad dvojrozměrný vektor v rovině ⃗u = (u1, u2) a vynásobme jej čtvercovou maticí typu 2 × 2. Ukažme si několik příkladů, abychom „viděli“, co provede matice s vektorem (obr. 4.4). Násobením maticí A = 0 1 1 0 dostaneme nový vektor ⃗v = A.u = (u2, u1). Došlo k výměně složek vektoru, což odpovídá zrcadlení vektoru podle osy y = x. Matice A = 1 0 0 2 prodlouží „y-vou“ složku vektoru dvakrát a nezmění „x-vou složku“, provede tedy vertikální roztažení. Matice A = cos φ − sin φ sin φ cos φ způsobí rotaci vektoru o úhel φ proti směru hodinových ručiček, ale nezmění velikost vektoru. Různé matice tedy působí různé, ale pro danou matici charakteristické změny vektoru. Pokud vektor násobíme čtvercovou maticí, výsledný vektor má stejnou dimenzi. Je možné násobit vektor i maticí obdélníkovou. Pak klesá nebo roste dimenze vektoru a geometrická interpretace už není snadná. Mohlo by jít např. o projekci 3D-vektoru do nějaké roviny (2D-vektoru). 4.2.4. Příklady aplikací matic Matice a lineární algebra obecně mají množství aplikací ve různých vědních oblastech. Ukážeme si čistě pro ilustraci dva příklady. Reprezentace vztahů Mějme 5 lidí, A až E. Schéma 4.5 (a) vyjadřuje vztahy mezi nimi. Šipka X → Y znamená „X má rád Y“. Některé vztahy jsou oboustranné, některé pouze jednostranné. Tyto vztahy můžeme vyjádřit pomocí matice I, někdy označované jako incidenční (4.5 (b)). Řádky znamenají „kdo má rád“, sloupce znamenají „koho má rád“. 1 a 0 značí „má rád“ a „nemá rád“. Například 1 v 92 4.2. Matice 2. řádku 1. sloupce znamená „B má rád A“, 0 ve 4. řádku 5. sloupce znamená „D nemá rád E“. Takto můžeme snadno zachytit vztahy libovolného množství osob a dále je například počítačově analyzovat. (a) Vztahy mezi lidmi I =           A B C D E A 0 1 1 1 1 B 1 0 1 0 0 C 0 0 0 1 0 D 0 1 1 0 0 E 1 0 1 1 0           (b) Incidenční matice Obrázek 4.5.: Vztahy mezi lidmi vyjádřené maticí Co můžeme z matice zjistit? Matice je čtvercová, protože popisuje vztaky každého z každým. Nuly na hlavní diagonále znamenají, že nikdo nemá rád sám sebe. Ani jeden řádek a ani jeden sloupec neobsahují samé nuly. Není tedy nikdo, kdo by neměl nikoho rád, nebo někdo, koho by neměl nikdo rád. Mohlo by nás zajímat, zda existují dvojice, které se mají rády navzájem. Pokud se symetricky oproti hlavní diagonále nacházejí jedničky, znamená to, že se tato dvoji lidí má navzájem ráda. Pokud matici I transponujeme a transponovanou matici IT „položíme na původní matici“, pak tyto dvojice musí mít „na stejném místě jedničku“. U ostatních dvojic se čísla liší. Výjimkou jsou obě nuly, kdy se dvojice oboustranně nemají rády. I =         0 1 1 1 1 1 0 1 0 0 0 0 0 1 0 0 1 1 0 0 1 0 1 1 0         ; IT =         0 1 0 0 1 1 0 0 1 0 1 1 0 1 1 1 0 1 0 1 1 0 0 0 0         Pokud nyní obě matice odečteme, získáme novou matici V zt, kde jsou na místech stejných vzájemných vztahů, ať pozitivních či negativních, nuly. Z matice hned vidíme (modré nuly), že dvojice se vzájemnými sympatiemi jsou (A,B), (A,D) a (C,D). Navržený postup má samozřejmě vadu na kráse v tom, že ukazuje 0 i při vzájemné antipatii (v matice je dvojice (B,E) vyznačena červeně). V zt = I − IT =         0 0 1 1 0 0 0 1 −1 0 −1 −1 0 0 −1 −1 1 0 0 −1 0 0 1 1 0         Pro zajímavost dodejme, že matice rozdílů V zt je antisymetrická, tedy až na znaméko symetrická vůči hlavní diagonále. Proto nám stačí „hledat nuly“ pouze nad hlavní diagonálou. 93 4. Poznámky k lineární algebře Analýza obrazu Rastrový černobílý obraz můžeme vnímat jako síť černých a bílých čtverců. Pokud 0 bude bílá a 1 černá, můžeme obraz vyjádřit jako matici (obr. 4.6) a matematicky s ním dále pracovat. Pokud matici například vydělíme dvěma, obraz „zešedne“. Digitální analýza obrazu je rozsáhlé téma aplikované matematiky a informatiky, kde právě lineární algebra hraje významnou úlohu. (a) Černobílý obraz           1 0 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0 0 1 0 0 1 1 1 0 1           (b) Odpovídající matice Obrázek 4.6.: Obraz jako matice Ukažme si příklad matematické operace s maticí černobílého obrazu. Zkusme vynásobit matici původního čenobílého obrazu diagonální maticí s různými čísly od 0 do 1. Protože násobíme diagonální matici, bude vždy celý sloupec původní matice vynásoben stejným číslem. To znamená že „zešedne či zbělá“ celý sloupec stejně, jak můžemme vidět na obrázku 4.7. ObrKdyby nás třeba zajímala pouze část obrazu a zbytek ne, mohli bychom takto část obrazu „vymazat“. (a) Šedý obraz           1 0 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0 0 1 0 0 1 1 1 0 1           .           1 0 0 0 0 0 0 0.8 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0.4           (b) Násobení diagonální maticí Obrázek 4.7.: Změna obrazu jako násobení matic 4.3. Soustavy lineárních algebraických rovnic Soustavou m lineárních algebraických rovnic o n neznámých se rozumí celek m lineárních vzájemně provázaných rovnic, v nichž se dohromady vyskytuje n neznámých. Soustavou 3 rovnic o 3 neznámých x1, x2, a x3 je například 2x1 +x2 −x3 = 1 −x1−3x2 + 2x3 = 4 3x1 −x3 = −2 Řešením této soustavy je trojice čísel x1, x2, a x3, které můžeme považovat za složky vektoru ⃗x = (x1, x2, x3). Na pravé straně soustavy, za „=“, stojí též 3 čísla, která můžeme považovat za složky nějakého vektoru, např. ⃗b = (1, 4, −2). Kdybychom z napsané soustavy „vypustili“ 94 4.3. Soustavy lineárních algebraických rovnic proměnné xi, zbyla by nám struktura matice. Seskupme tedy koeficienty u proměnných do matice A. A =    2 1 −1 −1 −3 2 3 0 −1    Pak ale můžeme celou soustavu rovnic ihned přepsat do maticové rovnice A⃗x = ⃗b. Řešit soustavu rovnic tedy vlastně znamená hledat vektor ⃗x, který vyhovuje dané maticové rovnici. Geometricky nahlíženo hledáme vektor ⃗x, který matice A přetváří ve vektor ⃗b. Tím jsme sice dospěli k novému „pohledu“ na řešení soustavy rovnic, ale zatím nám to jakkoli nepomohlo při vlastním řešení. 4.3.1. Gaussova eliminační metoda Řešit soustavu rovnic lze například tak, že postupně vyjadřujeme jednu z proměnných a dosazujeme do ostatních rovnic. Postup je to jednoduchý, ale pracný a nesystematický. Představíme si systematickou metodu, kterou lze např. snadno implementovat v podobě počítačového programu, označovanou jako Gaussova eliminační metoda. Metodu si vysvětlíme na příkladu výše uvedené soustavy rovnic. Soustavu si přepíšeme do matice rozšířené o pravou stranu rovnic, kterou si pro přehlednost oddělíme svislou čarou, tedy    2 1 −1 1 −1 −3 2 4 3 0 −1 −2    . Principem metody je převedení matice na horní trojúhelníkový tvar s pouhými nulami pod hlavní diagonálou, tedy    × × × × 0 × × × 0 0 × ×    . Z trojúhelníkové matice už snadno tzv. zpětným chodem zjistím řešení, jak hned uvidíme. Uvědomme si znovu, že každý řádek matice je pouze některá „přepsaná“ rovnice. Pokud bychom původní rovnici vynásobili nenulovým číslem, dostaneme rovnici novou, avšak se stejným řešením. Podobně můžeme např. ke 3. rovnici přičíst rovnici 1., nebo můžeme zaměnit pořadí rovnic. Řešení soustavy se též nezmění. Stejné operace můžeme proto provádět i s maticí - násobit řádek číslem, přičítat násobený řádek k jinému řádku a vyměňovat řádky. Pokud násobíme a přičítáme chytře, „vznikají“ na potřebných místech, pod hlavní diagonálou, nuly. Vyřešme tedy výše uvedenou soustavu. Nejprve vyměníme 1. a 2. řádek. Potom k 2. řádku přičteme 2-násobek řádku 1. a ke 3. řádku 3-násobek řádku 1. Nově vzniklé matice jsou stran řešení ekvivalentní s maticí původní, což vyznačíme symbolem „∼“.    2 1 −1 1 −1 −3 2 4 3 0 −1 −2    ∼    −1 −3 2 4 2 1 −1 1 3 0 −1 −2    ∼    −1 −3 2 4 0 −5 3 9 0 −9 5 10    Nyní můžeme 2. řádek vynásobit −9 5 a přičíst k 2. Poté ještě pro přehlednost vynásobme 3. řádek -5-ti. 95 4. Poznámky k lineární algebře    −1 −3 2 4 0 −5 3 9 0 −9 5 10    ∼    −1 −3 2 4 0 −5 3 9 0 0 5 − 27 5 10 − 81 5    ∼    −1 −3 2 4 0 −5 3 9 0 0 2 31    Dostali jsme tak ekvivalentní matici v dolním trojúhelníkovém tvaru. Přepišme ji pro čistě pro srozumitelnost výkladu znovu do tvaru 3 rovnic, ačkoli tento krok není nutný. −x1−3x2 +2x3 = 4 −5x2 + 3x3 = 9 2x3 = 31 Nyní už přímo získáme řešení „zezdola nahoru“. Z třetí rovnice plyne, že x3 = 15, 5. Dosazení x3 do druhé rovnice získáme x2 = 7, 5. Z první rovnice pak x1 = 4, 5. Dosazením do původních rovnic se přesvědčíme o správnosti řešení. Gaussova eliminační metoda je však metoda výpočetně náročná, pro soustavu n rovnic o n neznámých vyžaduje řádově n3 početních operací. Pro rozsáhlé speciální matice s velkým počtem 0, které vznikají např. při numerickém řešení parciálních diferenciálních rovnic, byly vytvořeny speciální účinnější postupy, např. podle Jacobiho nebo Gausse-Seidela. 4.3.2. Inverzní matice Čísla 3 a 1 3 můžeme označit jako vzájemně inverzní, protože 3. 1 3 = 1 3 .3 = 1 1 3 též zapisujeme jako 3−1. Podobný význam má inverzní matice. Mějme čtvercovou matici A. Matici A−1 označíme jako inverzní, pokud platí A.A−1 = A−1 .A = E kde E je jednotková matice. Např. k matici A = 2 0 0 −1 je inverzní matice A−1 = 1 2 0 0 −1 protože platí AA−1 = 2 0 0 −1 . 1 2 0 0 −1 = 1 0 0 1 = E2 Pro úplnost se ještě přesvědčíme, že platí i A−1A = E2. A−1 A = 1 2 0 0 −1 . 2 0 0 −1 = 1 0 0 1 = E2 Znát inverzní matici je užitečné. Vraťme se k předchozímu příkladu řešení soustavy rovnic A⃗x = ⃗b. Pokud bychom znali inverzní matici A−1, pak stačí obě strany rovnice touto maticí vynásobit 96 4.3. Soustavy lineárních algebraických rovnic a hned máme hledané řešení ⃗x = A−1⃗b, protože A−1 .A⃗x = A−1 A.⃗x = E.⃗x = ⃗x = A−1⃗b Museli bychom sice vynásobit matici A−1 vektorem ⃗b, to je ale podstatně jednodušší než provést celou Gaussovu eliminaci. Obtížné je ovšem spočítat inverzní matici. Výpočet se provádí variantou Gaussovu eliminace, je tedy vposledku stejně náročný. Pokud ale potřebujeme opakovaně řešit stejnou soustavu rovnic s odlišnými pravými stranami ⃗b, pak už se postup s inverzní maticí vyplatí. Z hlediska geometrické interpretace provádí inverzní matice s vektorem opačnou operaci. Jestliže např. matice otáčí vektor o 30° po směru hodinových ručiček, inverzní matice jej otáčí o 30° proti směru hodinových ručiček. 97 A. Základní programové konstrukty jazyka Python Zde si stručně popíšeme základní konstrukty jazyka Python - datové typy, podmínky, cykly a funkce. Pro jednoduché programy nám budou stačit. A.1. Obecné poznámky k Pythonu Python je v současnosti jedním z nejpopulárnějších programovacích jazyků. Je široce použitelný v mnoha oblastech, jako jsou vědecké výpočty, analýza dat, machine learning, programování aplikací, práce s databázemi nebo webové aplikace. Jedná se o tzv. objektově orientovaný jazyk, ale lze v něm programovat i „jednoduše“ neobjektově, tzv. procedurálně. Python je interpretovaný (synonymum skriptovací) jazyk. Programátor píše obyčejný textový soubor, většinou s příponou .py, obvykle označovaný jako skript. Tento soubor se předloží programu s názvem python. Program python je tzv. interpret, tedy program, který rozumí textu ve skriptu, čte jej řádek po řádku a převádí jednotlivé příkazy do strojových příkazů (instrukcí) pro procesor počítače, který je vykonává. Pythonský skript soubor.py bychom tedy spustili např. z příkazové řádky Windows pomocí příkazu C:\python soubor.py. Obvykle však používáme nějaký program usnadňující psaní skriptu, obecně označovaný jako IDE (Integrated Development Environment). IDE pro Python jsou např. Jupyter Notebook, Spyder, PyCharm či IDLE. Obvykle jsou součástí nějaké distribuce, což je soubor několika programů usnadňujících programování - distribuce obsahuje vlastní interpret python, nějaké IDE a řadu doplňkových modulů. Jednotlivé distribuce se liší právě těmito doplňkovými produkty, pythonský interpret je ve všech distribucích téměř stejný. Nejznámější distribucí je Anaconda, případně její stručnější verze Miniconda. Většinou pak kliknout na ikonu „Run“ a program přímo spustit. Jistá slova, tzv. klíčová slova (keywords), např. print, for, in nebo range, mají v Pythonu vlastní speciální význam a nelze je použít např. jako název proměnné. S těmito asi 35 klíčovými slovy lze naprogramovat v podstatě cokoli (A.1). Zvládnout programování v základním Pythonu tedy vlastně znamená naučit se syntaxi (jak přesně se příkazy zapisují, aby jim interpret rozuměl) a sémantiku (co přesně znamenají) těchto klíčových slov. Krom toho ale existuje obrovské množství balíků, též označovaných jako moduly nebo packages, které usnadňují a rozšiřují schopnosti Pythonu. Byly však naprogramovány v základním Pythonu. Zápis programu v Pythonu je jednoduchý. Namísto středníků či závorek používaných v jiných programovacích jazycích se pro účely seskupování textu programu („co k sobě patří“) používá odsazení, tzv. indentace. Indentaci nelze vynechat či pozměnit, změnila by se logika programu. Např. v následujícím programu je první print() součástí for cyklu (vytiskne se při každém běhu cyklu), druhý print() již není součástí (vytiskne se pouze jednou). 98 A.2. Datové typy Tabulka A.1.: 35 klíčových slov jazyka Python False continue global pass None def if raise True del import return and elif in try as else is while assert except lambda with async finaly nonlocal yield await for not class break from or >>> for i in range(4): # koment áře ná sleduj í za # # slou ží k lep ší orientaci program á tora # a č ten áře , interpret je př esko čí >>> print(’je součástí’) # pat ří pod for cyklus >>> print(’není součástí’) # nepat ří pod for cyklus je součástí je součástí je součástí je součástí není součástí A.2. Datové typy Každá proměnná v Pythonu je určitého datového typu, například číslo nebo text. Proměnným určitého typu odpovídají jisté operace. Lze například sčítat dvě čísla, ale nelze sčítat číslo s písmenem, jinak Python hlásí chybu. Pokud napíšeme x=3, Python sám pozná, že proměnná x je typu int (celé číslo), proměnnou x vytvoří a přiřadí ji hodnotu 3. A.2.1. integer a float Integer je datový typ celých čísel, float značí desetinná čísla. >>> a = 7 # čí slo typu int >>> b = 1.2 # čí slo typu float >>> print(type(a)) # type zjist í datov ý typ >>> print(type(b)) # print vytiskne hodnotu >>> 3+4 # ob ě čí sla jsou int , vý sledek je automaticky int 7 99 A. Základní programové konstrukty jazyka Python >>> 3.0+4 # prvn í čí slo je int , druh é float 7.0 # vý sledek je automaticky float >>> 3∗∗4 # 3 na 4. 81 >>> z=(a+b)∗(a−b) # v prom ě nn ý ch už jsou ulo ž eny hodnoty >>> print(z) # lze norm á ln ě po čí tat 47.559999999999995 A.2.2. string String je datový typ textových řetězců. Vlastní typické textové funkce, jako délka řetězce, poslední písmeno apod. >>> fraze = ’textový řetězec je typu string’ >>> print(fraze) >>> print(’Delka fraze: ’, len(fraze)) # len zjist í dé lku ř et ě zce >>> print(’9 prvnich pismen:’, fraze[0:9]) # [2:8] vybere pod ř et ě zec od pí smene 2 do 8 >>> print(’Posledni slovo velkymi:’, fraze.split()[−1].upper()) # roz štěpí ř et ě zec na slova a vr átí posledn í slovo textový řetězec je typu string Delka fraze: 18 9 prvnich pismen: textový ř Posledni slovo velkymi pismeny: STRING A.2.3. boolean Boolean je logický datový typ, nabývá pouze hodnot pravda a nepravda, True a False. >>> a = False >>> print(a) >>> print(type(a)) False >>> 5>4 # Je 5 větší ne ž 4? ano True >>> 5 == 7 # POZOR !! == rovnost , = přiř azen í False >>> 5 != 8 # nerovn á se True 100 A.2. Datové typy >>> print((5>8) or (5>4)) # plat í jedno nebo druh é >>> print((5>8) | (5>4)) # alternativa pro or True True >>> print((5>8) and (5>4)) # plat í jedno i druh é >>> print((5>8) & (5>4)) # alternativa pro and False False \end{priiiklad} A.2.4. list List, česky seznam, je datový typ kolekce. Jiné objekty jakéhokoli datového typu lze tak „seskupit“ pod jedno označení. >>> muj_seznam = [’one’,’two’,’three’,4,5, [1,2,’list2’]] # definice kolekce s ná zvem muj_seznam >>> my_list[5] # 6. prvek kolekce s indexem 5 # POZOR ! 1. prvek má index 0, Python čí sluje od 0 [1, 2, ’list2’] >>> my_list[5][−1] # z 6. prvku kolekce vybere posledn í prvek ’list2’ A.2.5. tuple Tuple, česky n-tice, je datový typ kolekce podobně jako list. Po jejím vytvoření však už nelze měnit její obsah. >>> t = (1,2,3) # definice kolekce tuple >>> t[0] # vybere 1. prvek s indexem 0 1 >>> t.append(4) # př id á prvek ... co ž nelze # Python hl ásí chybu −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− AttributeError Traceback (most recent call last) in −−−−> 1 t.append(4) AttributeError: ’tuple’ object has no attribute ’append’ >>> t[1] = 5 # zm ění hodnotu 2. prvku ... co ž op ět nelze # Python hl ásí chybu −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− TypeError Traceback (most recent call last) in 101 A. Základní programové konstrukty jazyka Python −−−−> 1 t[1] = 5 TypeError: ’tuple’ object does not support item assignment A.2.6. dictionary Jak název říká, dictionary je datový typ obdobný slovníku - je to kolekce dvojic klíč:hodnota. Zadáním klíče lze najít odpovídající hodnotu, podobně jako dům:house. >>> my_dict = {’key1’:123,’key2’:[12,23],’key3’:[’it0’,’it1’]} >>> my_dict[’key3’][0] # vyp íše prvn í hodnotu pro kl íč key3 ’it0’ >>> my_dict[’key4’] = [4444] # do my_dict př id á pár key4 :4444 >>> my_dict.keys() # vyp íše vš echny kl íče dict_keys([’key1’, ’key2’, ’key3’, ’key4’]) >>> my_dict.values() # vyp íše vš echny hodnoty dict_values([123, [12, ...... , [4444]]) >>> my_dict.items() # vyp íše cel é dictionary dict_items([(’key1’, 123), ......, (’key4’, [4444])]) A.3. Importování knihoven Knihovny, moduly, pakety, packages a balíky jsou synonyma. Jsou to pythonské skripty, které obsahují jistý program. Pokud se nám takový program v rámci našeho programu hodí, importujeme daný modul a program použijeme, aniž bychom ho celý museli psát od začátku. Příkladem je modul numpy, který obsahuje řadu funkcí pro numerické výpočty. Moduly lze stáhnout z internetu a uložit do adresáře vlastního počítače, kde Python moduly hledá. Během importování se tam Python podívá, a pokud odpovídající modul najde, nahraje jej do paměti. >>> import numpy as np # importuje a nahraje cel ý modul numpy # do pam ěti ,dá le jej ale bude pou ží vat # pod zkratkou np >>> print(np.sqrt(9)) # pou ž ije funkci sqrt z modulu numpy >>> print(np.arange(5)) # pou ž ije funkci arange z modulu numpy >>> print(np.random.rand(5)) # pou ž ije funkci random . rand 3.0 [0 1 2 3 4] [0.89479446 0.74400804 0.76156047 0.60258417 0.74705343] >>> from numpy.random import rand # importuje a nahraje do # pam ě ti pouze funkci random z modulu numpy , # čímž š et ří pam ěť >>> rand(5) # pou ž ije f. rand , kter á generuje 5 ná hodn ý ch čí sel array([0.34395972, 0.854625, 0.769615, 0.085601, 0.674828]) 102 A.4. Podmínka A.4. Podmínka Nutným konstruktem každého programovacího jazyka je podmínka, která umožní odlišné chování programu za různých situací. Základní součást podmínky je logický výraz, který je vyhodnocen jako pravdivý (True) nebo nepravdivý (False). Podmínku utvoříme dvojicí příkazů If a else, případně ještě elif. Co k sobě patří, určuje indentace. >>> x = 5 >>> if x>5: # podm í nka >>> print(’ano’) # provede , pokud podm í nka plat í >>> else: >>> print(’ne’) # provede , pokud podm í nka neplat í ne >>> x = 5 >>> if x>5: >>> print(’>5’) >>> elif x==5: # pokud podm í nka neplat í , táže se dá le >>> print(’=5’) # pokud nen í větší ne ž 5, je př esn ě 5? >>> else: >>> print(’<5’) =5 A.5. Cykly Dalším základním konstruktem každého programovacího jazyka jsou cykly, tedy úseky programu, které jsou opakovány tak dlouho, dokud platí nějaká podmínka. Obvykle jsou k dispozici 2 cykly - while a for. A.5.1. Cyklus for For cyklus prochází předem zadanou sekvenci, např. hodnoty 1 až 5. Lze jej nahradit cyklem while. >>> for jmeno in ["Petr",’Pavel’,’Eva’, ’Martina’]: >>> print(jmeno) # za jmeno se postupn ě dosazuj í jm é na Petr Pavel Eva Martina >>> for i in range(5): range(n) vytvoří posloupnost 0 až n−1 >>> print(i∗i) # prom ě nn á i v ka ždém kroku nab ývá dal ší # hodnoty posloupnosti 0 103 A. Základní programové konstrukty jazyka Python 1 4 9 16 A.5.2. Cyklus while While cyklus se provádí, dokud platí zadaná podmínka. Pokud se podmínka nikdy nesplní, může dojít i k „zacyklení“ programu, který pak nikdy neskončí. >>> i=0 >>> while i<5: # Nejprve se vyhodnot í podm í nka . Pokud plat í , # prob ě hne 1 cyklus a znovu se hodnot í podm í nka >>> print(i) >>> i+=1 # je ekvivalentn í s i=i +1; zv ýší i o 1 0 1 2 3 4 A.6. Funkce Dalším typickým konstruktem programovacích jazyků jsou funkce. Je to úsek textu programu, jemuž je přiřazen vlastní název a může být v programu opakovaně volán. Text funkce by se dal opakovaně psát přímo do hlavního textu programu, ale s pomocí funkcí se program mnohem lépe strukturuje i rychleji probíhá. Chovají se podobně jako funkce v matematické - nějaké proměnné, označované jako parametry, do funkce vstupují, jiné proměnné jsou výsledkem funkce. Říkáme, že funkce vrací určité hodnoty (čísla, písmena, logickou hodnotu apod.). Funkce je v Python samostatným objektem, má tedy své jméno a adresu v paměti, tedy v tomto smyslu „existuje“. Funkci obecně definujeme takto: >>> def jmenoFunkce(parametry): # definice ná zvu a parametr ů >>> prikazovy blok # odsazeni říká , co vše pat ří do funkce >>> return (...) # říká , co má funkce vracet Ukažme si 2 příklady funkcí: >>> def pocetSamohlasek(slovo): # funkce ur čí po č et samohl á sek >>> pocet = 0 104 A.7. "Komplexní"příklad >>> for pismeno in slovo: >>> if pismeno in aeiouAEIOU: >>> pocet = pocet + 1 >>> return(pocet) >>> type(pocetSamohlasek) function # funkce je v Python samostatn ým objektem >>> text = input(’zadejte slovo: ’) # input = zad ání z kl á vesnice >>> pocetSsamohlasek(text) # vol á se funkce se zadan ým textem zadejte slovo: pokus 2 >>> def fce_na_ukazku(i): # definice funkce fce_na_ukazku >>> return str(i) +’.: nedelam nic’ # funkce se provede # a toto vr átí >>> for i in range(5): >>> print(fce_na_ukazku(i)) #5x se vol á f. a tiskne vý sledek 0.: nedelam nic 1.: nedelam nic 2.: nedelam nic 3.: nedelam nic 4.: nedelam nic Některé funkce jsou vestavěné (built-in functions) přímo v základní konstrukci Pythonu. Například print(), len() nebo type(). Ty můžeme používat ihned, aniž bychom předtím cokoli definovali. Další funkce pak „vlastní“ objekty určitého datového typu. Například objekt typu dictionary automaticky poskytuje funkce keys() nebo values(). Ty můžeme volat pouze „na tomto objektu“, samostatně je Python nezná. A.7. "Komplexní"příklad Následující „komplexní“ příklad obsahuje téměř vše výše probrané. Je jistě názorný a srozumitelný i bez podrobnějšího komentáře. >>> def zadani(): >>> x = float(input(’Zadejte první číslo: ’)) >>> y = float(input(’Zadejte druhé číslo: ’)) >>> return(x,y) >>> def soucet(): >>> x,y=zadani() >>> return(x+y) 105 A. Základní programové konstrukty jazyka Python >>> def rozdil(): >>> x,y=zadani() >>> return(x−y) >>> i=5 >>> while i!=0: >>> i = int(input(’1 = součet, 2 = rozdíl, 0 = konec: ’)) >>> if i==1: >>> print(’Součet je: ’, soucet()) >>> elif i==2: >>> print(’Rozdíl je: ’, rozdil()) >>> print(’Program ukončen’) 1 = součet, 2 = rozdíl, 0 = konec: 1 Zadejte první číslo: 5 Zadejte druhé číslo: 6 Součet je: 11.0 1 = součet, 2 = rozdíl, 0 = konec: 2 Zadejte první číslo: 4 Zadejte druhé číslo: 6 Rozdíl je: −2.0 1 = součet, 2 = rozdíl, 0 = konec: 0 Program ukončen 106 B. Grafy funkcí v Pythonu Nutnou dovedností v matematickém modelování je vizualizace výsledků. Ukážeme si, jak v Pythonu kreslit grafy funkcí jedné a dvou proměnných. Budeme používat funkce knihovny matplotlib. Jiná pythonská knihovna pro vizualizaci dat je např. seaborn. B.1. Funkce jedné proměnné B.1.1. Definice zobrazované funkce Matplotlib kreslí funkce tak, že pouze spojí zadané body. Nejprve musíme „definovat“ funkci, neboli zadat body, tedy dvojice (x,y), které se mají spojit. Definujeme vektor „x-ových“ souřadnic bodů a odpovídající vektor „y-vých“ souřadnic. Pro definici vektorů a matematické operace s nimi použijeme knihovnu numpy. Vše ozřejmí příklad. >>> import numpy as np # importuje knihovnu numpy >>> x = np.linspace(0, 5,100) # vektor 100 hodnot od 0 do 5 >>> y = x ∗∗ 2 # 1. funkce − 2. mocnina , aplikov á na # na ka ždý element vektoru x >>> z = 10∗x ∗∗ 0.5 # 2. funkce − 10 ∗ odmocnina B.1.2. Vytvoření plátna a základního grafu Kresba grafů má v Matplotlib „objektově orientovaný charakter“. Nejprve vezmeme „papír“, říkáme mu plátno nebo canvas, a v něm si vyhradíme zatím prázdný graf. Obojí provede funkce subplots(). Jejím výstupem jsou dva objekty - plátno a na něm graf. Nyní voláme různé funkce na objektu graf, které do něj dokreslují různé jednotlivosti, jako vlastní graf funkce, osy, názvy os apod. >>> import matplotlib.pyplot as plt # importuje funkci pyplot # knihovny matplotlib >>> fig, axes = plt.subplots() # vytvo ří " pl á tno " ( canvas ) # a pr á zdn ý graf # nyn í ná sleduje kreslen í do vytvo ř en é ho grafu >>> axes.plot(x,y,’b’,label=’na druhou’) # spoj í dvojice x ,y >>> axes.plot(x,z,’r’,label=’odmocnina’) # x−z ozna čí odmocnina >>> axes.set_xlabel(’název osy x’) # set_ v ná zvu metody 107 B. Grafy funkcí v Pythonu >>> axes.set_ylabel(’název osy y’) # nastavuje parametry grafu >>> axes.set_title(’název grafu’) # nap ř. ná zev grafu >>> axes.legend() # do grafu se př id á legenda >>> fig # vykresl í vytvo ř en ý graf Uvedený program vykreslí následující graf s dvěma funkcemi. Alternativou je vytvořit pouze plátno pomocí funkce figure() a na něm volat funkci add_axis(), která na plátně vytvoří prázdný graf. Umožní tak na 1 plátno nakreslit více grafů a nastavit, kde na plátně se grafy nacházejí. >>> fig = plt.figure() # vytvo ří pouze " pl á tno " ( canvas ) # př id á axes (= graf ) na pl á tno >>> axes = fig.add_axes([0.1, 0.1, 0.5, 0.5]) # left , bottom , width , height ( rozsah 0 to 1) # ur čí , kde na pl á tn ě bude graf le ž et # ! relativn í um í st ění axes2 = fig.add_axes([0.2, 0.2, 0.4, 0.7]) # druh ý graf # na stejn ém objektu fig # kreslen í do grafu 1 >>> axes.plot(x, y, ’b’, label = ’text legendy’) >>> axes.set_xlabel(’osa x’) >>> axes.set_ylabel(’ osa y’) >>> axes.set_title(’nazev grafu’) >>> axes.legend() # kreslen í do grafu 2 108 B.1. Funkce jedné proměnné >>> axes2.plot(x, z, ’y’, label = ’text ’) >>> axes2.set_xlabel(’osa x’) >>> axes2.set_ylabel(’ osa y’) >>> axes2.set_title(’nazev grafu’) >>> axes2.legend() Takto lze „fiktivně“ nakreslit i vnořený graf. >>> fig = plt.figure() >>> axes1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # hlavn í graf >>> axes2 = fig.add_axes([0.2, 0.5, 0.4, 0.3]) # vno ř en ý graf # vno ř en ý graf je men ší a má posunutou polohu # hlavn í graf >>> axes1.plot(x, y, ’b’) >>> axes1.set_xlabel(’osa x 1’) >>> axes1.set_ylabel(’osa y 1’) >>> axes1.set_title(’název hlavního grafu’) # vlo ž en ý graf >>> axes2.plot(y, x, ’r’) >>> axes2.set_xlabel(’osa x 2’) >>> axes2.set_ylabel(’osa y 2’) 109 B. Grafy funkcí v Pythonu >>> axes2.set_title(’název vnořeného grafu’); B.1.3. Uložení grafu Vytvořený graf lze (v rámci programu) přímo uložit pomocí funkce savefig(). >>> plt.savefig(’uloha.png’, dpi = 300) # ná zev souboru ( mo žné ulo ž it jako .PNG , .PDF , . SVG ) # specifikace rozli š en í B.1.4. Specifikace podoby grafu funkce Matplotlib nabízí řadu možností, jak upravit vzhled grafu podle potřeby. Například: >>> fig, axes = plt.subplots() # kreslen í do grafu >>> axes.plot(x, y, ’b’, label = ’na druhou’) >>> axes.plot(x, z, ’r’, ls = ’−−’, label = ’odmocnina’) 110 B.1. Funkce jedné proměnné >>> axes.plot(x, y,’∗r’) # č erven é ∗ >>> axes.plot(x, z,’oy’) # ž lut á o >>> axes.set_xlabel(’název osy x’) >>> axes.set_ylabel(’název osy x’) >>> axes.set_title(’název grafu’) >>> axes.legend() fig B.1.5. Více grafů na plátně Více grafů na plátně lze nakreslit buď pomocí funkcí figure() a add_axis(), jak jsme již popsali, nebo přímo pomocí funkce subplots(), kde lze specifikovat „strukturu“ grafů (např. 1x3, 2x2) a jejich velikost. Jednotlivé grafy se pak volají dvojicí indexů [i,j]. >>> import matplotlib.pyplot as plt >>> import numpy as np >>> fig, axes = plt.subplots(2,2, figsize = (8,6)) # vytvo ří na pl á tn ě 2 x2 graf ů , ka ždý velikosti 8 x6 >>> x = np.linspace(0, 5,100) # definice 4 funkc í >>> y00 = x >>> y01 = x∗x >>> y10 = np.sin(x) >>> y11 = np.cos(x) # kreslen í do graf ů 111 B. Grafy funkcí v Pythonu >>> axes[0,0].plot(x, y00, ’b’, label=’$x$’) # lev ý horn í graf >>> axes[0,0].set_ylabel(’y’) >>> axes[0,0].legend() >>> axes[0,1].plot(x, y01, ’r’,ls= ’−−’, label = ’$x^2$’) >>> axes[0,1].legend() >>> axes[1,0].plot(x, y10, ’g’, ls= ’−.’,label = ’$\sin x$’) >>> axes[1,0].set_xlabel(’x’) >>> axes[1,0].set_ylabel(’y’) >>> axes[1,0].legend() >>> axes[1,1].plot(x, y11, ’y’, ls=’dotted’,label=’$\cos x$’) >>> axes[1,1].set_xlabel(’x’) >>> axes[1,1].legend() >>> fig, axes = plt.subplots(nrows=1, ncols=2) # lev ý graf >>> axes[0].plot(x, y, ’b’) >>> axes[0].set_title(’y = x∗∗2’) >>> axes[0].set_xlabel(’X axis’) >>> axes[0].set_ylabel(’Y axis’) # prav ý graf 112 B.1. Funkce jedné proměnné >>> axes[1].plot(y, x, ’r’) >>> axes[1].set_title(’y = sqrt(x)’) >>> axes[1].set_xlabel(’X axis’) >>> axes[1].set_ylabel(’Y axis’) B.1.6. Nastavení os Matplotlib umožňuje mnohá nastavení os. V příkladu je vidět vnořený graf, kde kreslíme stejné funkce, ale zaměřujeme se na bod dotyku. >>> xx = np.linspace(−1,1,100) >>> fig, ax = plt.subplots(figsize = (10,5)) # velikost pl á tna >>> ax.plot(xx, xx∗∗2, xx, xx∗∗3) >>> fig.tight_layout() # minimalizuje př ekr ývání graf ů # vnit řní graf >>> vnitrni_ax = fig.add_axes([0.2, 0.55, 0.35, 0.35]) # poloha x , poloha y , šířka , výš ka >>> vnitrni_ax.plot(xx, xx∗∗2, xx, xx∗∗3) >>> vnitrni_ax.set_title(’zoom near origin’) # nastaven í os vnit řní ho grafu >>> vnitrni_ax.set_xlim(−.2, .2) # rozsah osy x >>> vnitrni_ax.set_ylim(−.005, .01) # rozsah osy y 113 B. Grafy funkcí v Pythonu # nastaven í ukazatel ů os vnit řní ho grafu >>> vnitrni_ax.set_yticks([0, 0.005, 0.01]) # ukazatele x >>> vnitrni_ax.set_xticks([−0.1,0,.1]); # ukazatele y B.1.7. Formátování grafu Matplotlib poskytuje mnoho možností formátování grafu. Buď můžeme nastavit jednotlivosti, jako jsou například typ, barva nebo šířka křivky, nebo si vybereme z mnoha předdefinovaných stylů. Detaily možných nastavení lze najít v dokumentaci pro Matplotlib: Seznam typů markerů https://matplotlib.org/3.1.1/api/markers_api.html Seznam barev https://matplotlib.org/3.1.0/gallery/color/named_colors.html Úpravy textu v obrázcích https://matplotlib.org/stable/users/explain/text/text_intro.html V obrázcích lze použít i matematický font ve stylu LATEXu. Některé možnosti ukazuje následujících příklad. >>> fig = plt.figure(figsize = (9,5), dpi = 100) >>> ax = fig.add_axes([0.1,0.1,0.8,0.8]) >>> ax.set_title(’Možnosti formátování’) >>> ax.plot(x∗5,y, >>> color = ’red’, # barva >>> ls = ’−−’, # styl kř ivky >>> label = ’křivka 1’ # ná zev kř ivky >>> ) >>> ax.scatter(y, x∗5, # scatter − jako plot , ale nespoj í body >>> color = ’grey’, >>> marker = ’s’, # styl markeru >>> label = ’křivka 2’ >>> ) 114 B.1. Funkce jedné proměnné >>> ax.set_xlabel(’X’) # ná zev osy x >>> ax.set_ylabel(’Y’) # ná zev osy x >>> plt.legend() # př id ání legendy # popisky = anotace >>> plt.rcParams[’text.usetex’] = True # zapne matematick ý styl # matematick ý text stylu LaTeXu >>> ax.text(15,5,r"$y=\left(\frac{x}{5}\right)^2$", fontsize=15, color="red") >>> ax.text(4, 15, r"$y=5\sqrt{x}$", fontsize=15, color="grey") B.1.8. Styly Stylem se rozumí komplexní předdefinovaná podoba grafu. Lze si vybrat z mnoha stylů, jak uvádí dokumentace pro Matplotlib - https://matplotlib.org/3.1.1/gallery/style_sheets/ style_sheets_reference.html. V následujícím příkladu použijeme styl ggplot, který jinak používá stejnojmenná knihovna programovacího jazyka R. # pou ž it í ggplot stylu >>> matplotlib.style.use(’ggplot’) # volba stylu ggplot >>> fig = plt.figure(figsize=(6,4)) >>> axes = fig.add_axes([0.1, 0.1, 0.8, 0.8]) >>> axes.plot(x, y, ’b’) >>> axes.set_xlabel(’Set X Label’) 115 B. Grafy funkcí v Pythonu >>> axes.set_ylabel(’Set y Label’) >>> axes.set_title(’Set Title’) Seznam stylů můžeme též najít takto: # dostupn é styly >>> for i in matplotlib.style.available: >>> print(i) Solarize_Light2 _classic_test_patch bmh ... B.2. Funkce dvou proměnných Pro kresbu funkcí 2 proměnných opět použijeme knihovnu matplotlit, nyní funkci plot_surface(). Nejprve musíme definovat proměnné, obdobně jako v případě funkcí 1 proměnné. Dále musíme definovat vlastní funkci 2 proměnných pomocí příkazu def. Dále pomocí funkce np.meshgrid vytvoříme síť dvojic hodnot (x,y) v základně grafu, na níž definujeme proměnnou z. Tak vlastně definujeme skupinu bodů v prostoru, které funkce ax.plot_surface(X, Y, Z) pospojuje v prostorový graf. Pokud budeme chtít použít interaktivní mód, kdy lze myší otáčet grafem, musíme předem na- 116 B.2. Funkce dvou proměnných instalovat a poté importovat knihovnu ipympl. 1 Nakresleme graf gunkce f(x, y) = x2 + y, tedy rotačního paraboloidu. >>> import matplotlib.pyplot as plt >>> from mpl_toolkits.mplot3d import Axes3D >>> import numpy as np >>> # import ipympl # interaktivn í mód >>> #% matplotlib widget >>> x = np.arange(−15, 15, 0.1) # definice prom ě nn é x >>> y = np.arange(−15, 15, 0.1) # definice prom ě nn é y >>> def fun(x, y): # definice funkce >>> return x∗∗2 + y∗∗2 >>> X, Y = np.meshgrid(x, y) # vytvo ří X−Y síť >>> Z = fun(X,Y) # definice prom ě nn é z >>> fig = plt.figure() >>> ax = fig.add_subplot(111, projection=’3d’) >>> ax.plot_surface(X, Y, Z) # vykreslen í prostorov é ho grafu >>> ax.set_xlabel(’osa x’) >>> ax.set_ylabel(’osa y’) >>> ax.set_zlabel(’osa z’) >>> ax.view_init(−50, 50) # inici á ln í ho nato č en í grafu >>> plt.show() # zobrazen í grafu 1 Instalace knihovny ipympl: Otevřeme Anacondu - Anaconda Powershell Prompt a napišme conda install ipympl. 117 B. Grafy funkcí v Pythonu 118 Použitá a doporučená literatura 1. Arens T, Hettlich F, Karpfinger C, Kockelkorn U, Lichtenegger K, Stachel H, eds. Mathematik. 2., korrigierter Nachdr. Spektrum, Akad. Verl; 2010. 2. Arfken G, Weber HJ, Harris FE. Mathematical Methods for Physicists: A Comprehensive Guide. 7th ed. Elsevier; 2013. 3. Bender EA. An Introduction to Mathematical Modeling. Dover Publications; 2000. 4. Chongchitnan S. Exploring University Mathematics with Python. Springer; 2023. 5. Jüngel A, Zachmann HG. Mathematik für Chemiker. 8. Auflage. Wiley-VCH; 2023. 6. Riley KF, Hobson MP, Bence SJ. Mathematical Methods for Physics and Engineering. 3rd ed. Cambridge University Press; 2006. 7. Mathematical Modeling. Springer Berlin Heidelberg; 2017. 8. McKinney W. Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython. Second edition. O’Reilly Media, Inc; 2018. 9. Pecinovský R. Python: kompletní příručka jazyka pro verzi 3.10. První vydání. Grada Publishing; 2021. 10. Jänich K. Linear Algebra. Springer; 1994. 11. Musilová J, Musilová P. Matematika I-III: pro porozumění i praxi : netradiční výklad tradičních témat vysokoškolské matematiky. 2., dopl. vyd. VUTIUM; 2009. 12. Kubíček M, Dubcová M, Janovská D. Numerické metody a algoritmy. Vyd. 2., opr. Vysoká škola chemicko-technologická; 2005. 119