Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
Jihočeská univerzita v Českých Budějovicích
Pedagogická fakulta
Oddělení celoživotního vzdělávání
Závěrečná práce
Vybrané deterministické a stochastické
metody ve výuce počítačové fyziky
Vypracoval: Mgr. Jiří Blažek
Vedoucí práce: doc. RNDr. Petr Bartoš, Ph.D.
České Budějovice 2017
Prohlášení
Prohlašuji, že svoji závěrečnou práci jsem vypracoval samostatně pouze s použitím pramenů
a literatury uvedených v seznamu citované literatury.
Prohlašuji, že v souladu s § 47b zákona č. 111/1998 Sb. v platném znění souhlasím se
zveřejněním své závěrečné práce, a to v nezkrácené podobě elektronickou cestou ve veřejně
přístupné části databáze STAG provozované Jihočeskou univerzitou v Českých Budějovicích
na jejích internetových stránkách, a to se zachováním mého autorského práva k
odevzdanému textu této kvalifikační práce. Souhlasím dále s tím, aby toutéž elektronickou
cestou byly v souladu s uvedeným ustanovením zákona č. 111/1998 Sb. zveřejněny posudky
školitele a oponentů práce i záznam o průběhu a výsledku obhajoby kvalifikační práce.
Rovněž souhlasím s porovnáním textu mé kvalifikační práce s databází kvalifikačních prací
Theses.cz provozovanou Národním registrem vysokoškolských kvalifikačních prací a
systémem na odhalování plagiátů.
V Českých Budějovicích dne 11. května 2017 Jiří Blažek
Anotace
Práce se zabývá vybranými kapitolami počítačového modelování pro potřeby výuky.
Konkrétně je v ní popsána metoda Monte Carlo, Eulerova metoda a Verletova
metoda. Uvedenými metodami jsou ilustrativně řešeny vybrané úlohy v MATLABu.
Připojeny jsou jejich zdrojové kódy.
Klíčová slova
počítačové modelování, počítačová fyzika, Eulerova metoda, Verletova metoda,
metoda Monte Carlo, MATLAB, programování
Abstract
The thesis concerns selected topics of computer modeling for teaching purposes.
There are in detail described Monte Carlo, Euler and Verlet methods. These methods
are illustratively applied to selected problems realized in MATLAB. Their codes are
attached.
Keywords
computer modeling, computer physics, Euler method, Verlet method, Monte Carlo
method, MATLAB, programming
Poděkování
Děkuji docentu Bartošovi za vedení práce a výběr tématu a mému otci děkuji za rady,
týkající se programování v MATLABu
1
Obsah Úvod ......................................................................................................................................... 2
1 Počítačové modelování .................................................................................................... 3
1.1 Techniky počítačového modelování ......................................................................... 4
2 Stochastické metody a metoda Monte Carlo ................................................................... 4
2.1 Princip metody Monte Carlo a modelové příklady ................................................... 5
2.2 Schéma řešení problému pomocí metody Monte Carlo ........................................... 7
2.3 Základní pojmy matematické statistiky a metoda Monte Carlo .............................. 8
3 Deterministické modely a metoda molekulární dynamiky ............................................... 9
3.1 Princip metody molekulární dynamiky ..................................................................... 9
3.2 Metoda molekulární dynamiky z matematického hlediska ................................... 10
3.2.1 Úvod – pohybová rovnice ............................................................................... 10
3.2.2 Analytická metoda řešení pohybových rovnic ................................................ 12
3.2.3 Numerická metoda řešení pohybových rovnic ............................................... 12
3.2.4 Elementární metody – metoda Eulerova ........................................................ 13
3.2.5 Ilustrace Eulerovy metody na příkladech ....................................................... 15
3.2.6 Verletova metoda a její varianty .................................................................... 19
4 Praktická část ................................................................................................................. 22
4.1 Problémy řešené metodou Monte Carlo ................................................................ 22
4.1.1 Určování čísla π .............................................................................................. 22
4.1.2 Výpočet určitého integrálu ............................................................................. 23
4.1.3 Náhodná procházka ....................................................................................... 25
4.1.4 Modelování Brownova pohybu ...................................................................... 27
4.2 Modelování dějů metodou molekulární dynamiky ................................................. 29
4.2.1 Oscilátor ......................................................................................................... 29
4.2.2 Pohyb planety v radiálním silovém poli .......................................................... 33
Závěr ....................................................................................................................................... 39
Seznam použitých zdrojů ........................................................................................................ 40
Zdrojové kódy v MATLABu...................................................................................................... 41
2
Úvod
Tato práce se zabývá základy počítačového modelování.
Proč je počítačové modelování hodno pozornosti i pro studenty středních škol?
Mnoho fyzikálních jevů popisujeme diferenciálními rovnicemi. Exaktní řešení těchto
rovnic je však pro středoškolského studenta nepřiměřeně náročné, navíc ne vždy je
ho možné dosáhnout. Velkou výhodou numerických metod je jejich univerzálnost.
Nezáleží příliš na tom, jaký tvar mají rovnice, popisující daný jev. Vždy se postupuje
víceméně stejným způsobem.
Díky znalosti počítačovému modelování by bylo možné do výuky fyziky zahrnout nová
témata. Studenti by sami mohli řešit problémy, které jdou sice nad rámec
středoškolské matematiky, ale které lze numericky snadno řešit. Zároveň by tyto
metody poskytly studentům nový pohled na některé fyzikální zákony. Jako příklad
uvedu Newtonův zákon síly 𝐹 = 𝑚𝑎. Většina studentů tento zákon chápe staticky
jako vztah mezi silou a zrychlením a neuvědomuje si, že jde o rovnici, která spolu
s počáteční rychlostí a polohou tělesa rekonstruuje jeho celou trajektorii. Ale při
řešení pohybových rovnic na počítači tento fakt přirozeně vyplyne.
Jelikož počítačové modelování není v osnovách gymnázií standardním tématem, má
tato práce sloužit zejména studentům se zájmem o fyziku a programování.
Programy v praktické části jsou psány v MATLABu. Tento program bohužel není volně
dostupný, jednodušší výpočty lze ale také dělat Excelu (i když poněkud těžkopádně)
nebo v programu OCTAVE, který je zdarma ke stažení.
3
1 Počítačové modelování
Počítačová fyzika se zabývá počítačovým modelováním fyzikálních dějů a s tím
související počítačovou simulací a počítačovými experimenty. Připomeňme si stručně
kroky, kterými je nutné projít při řešení fyzikálního problému počítačovým
modelováním [1]:
o Formulce problému
Jev se popíše fyzikálními pojmy, které ho vystihují a které budou odpovídat
zvolené technice modelování
o Vytvoření modelu
Zformuluje se model, který se bude dále na počítači řešit. Je třeba mít
na paměti, že model podléhá různým zkreslujícím vlivům, např.
o je téměř vždy jednodušší než studovaný jev
o není jistota, zda model jev dobře vystihuje (skryté parametry, přílišné
zjednodušení atd.)
o Získané výsledky vypovídají přímo pouze o modelu a jen nepřímo
o studovaném jevu. Počítačový model v principu nemůže nahradit
reálný experiment. Navíc přesnost počítačového modelu je limitována
přesností vstupních (experimentálních) dat.
o Řešení modelu
Zvolení patřičných numerických metod, které řeší problém. Nejběžnější je
řešení soustav algebraických nebo diferenciálních rovnic.
o Srovnání výsledků modelu s experimentálními daty
Aby se ověřila míra korespondence modelu s realitou, musí se použít nezávislá
data, která nebyla při formulování modelu využita.
Stěžejní je při práci počítačového fyzika první a druhý krok. Zbylé dva kroky spočívají
především v rutinní činnosti.
4
1.1 Techniky počítačového modelování
Rozlišují se tři základní metody počítačového modelování:
o Částicové techniky
Studuje se chování částic, ze kterých se jev skládá. Například plazma se bude
zkoumat jako seskupení atomů, iontů a elektronů, Galaxie se budou zkoumat
jako seskupení bodových hvězd apod. Model se vyhodnocuje statisticky.
o Spojité modelování
Jev se popisuje na makroskopické úrovni. Například plazma je v takovém
případě kontinuum o určitém tlaku, teplotě, rychlosti proudění atd. Obvykle
je model popsán parciálními diferenciálními rovnicemi.
o Hybridní modelování.
Jde o kombinaci spojitého a částicového modelování.
V této práci se zaměřím pouze na částicové techniky. Na nich budu ilustrovat vybrané
deterministické a stochastické metody, využívané v oblasti počítačového
modelování.
2 Stochastické metody a metoda Monte Carlo
Stochastika je matematický obor, který se zabývá zkoumáním a modelováním
náhodných jevů. Stochastický (z řeckého stochastiké techné, tj. umění uhádnout,
trefit se) znamená náhodný, nahodilý.
Hlavním představitelem stochastických metod je metoda Monte Carlo. Její rozšíření
se objevilo současně se vznikem počítačů na konci 40. let minulého století. Obecný
princip této metody, ačkoli nebyl pojmenován, je však znám minimálně už od konce
18. století.
5
2.1 Princip metody Monte Carlo a modelové příklady
„Metodou Monte Carlo se nazývá souhrn postupů, dovolujících pomocí
mnohonásobných náhodných pokusů získat řešení problémů z nejrůznějších oblastí
vědy…“ [1, str. 26]:
Pro ilustraci uvedu ve stručnosti dva příklady, jak lze metodou Monte Carlo určit
hodnotu čísla π.
Číslo π je iracionální a v jeho desetinném rozvoji zatím nebyl objeven žádný řád.
Nejstarší metoda zjišťování rozvoje tohoto čísla pochází od Archimeda a je založena
na počítání obvodu pravidelných mnohoúhelníků, které vepíšeme nebo opíšeme
kruhu o jednotkovém průměru. Tak získáme nerovnost:
𝑜𝑏𝑣𝑜𝑑 𝑣𝑒𝑝𝑠𝑎𝑛éℎ𝑜 𝑚𝑛𝑜ℎ𝑜úℎ𝑒𝑙𝑛í𝑘𝑢 < 𝜋 < 𝑜𝑏𝑣𝑜𝑑 𝑜𝑝𝑠𝑎𝑛éℎ𝑜 𝑚𝑛𝑜ℎ𝑜úℎ𝑒𝑙𝑛í𝑘𝑢
V 17. století Leibniz vyjádřil číslo π jako součet nekonečné řady
𝜋
4= 1 −
1
3+
1
5−
1
7+
1
9−
1
11….
Jak je vidět, každý následující člen této řady je menší než předchozí, „opravy“ jsou
tedy stále menší a řada konverguje. Konverguje však velmi pomalu. K tomu, aby bylo
jisté, že 4 > π > 3, se musí sečíst prvních 7 členů, a pokud by se mělo určit číslo π
na čtyři desetinná místa (Archimédova aproximace), muselo by se sečíst víc než
4000 členů této řady.
Metodou Monte Carlo je možno určit číslo π například následujícím způsobem:
Je dán čtverec o straně jednotkové délky. Do něho se narýsuje čtvrtkruh o poloměru
1 (viz. Obrázek 1). Obsah čtverce je tedy roven 1 a obsah čtvrtkruhu 𝜋
4. Pokud se nyní
náhodně ve čtverci vybere dostatečný počet bodů, pak poměr počtu bodů
v čtvrtkruhu k počtu všech bodů bude přibližně odpovídat poměru obsahu čtvrtkruhu
a čtverce, tedy 𝜋
4.
6
Obrázek 1 Určování Ludolfova čísla metodou Monte Carlo
V triviálním případě zachyceném na obrázku je 𝜋
4≈
4
5 , tedy 𝜋 ≈ 3,2.
Je zřejmé, že čím více náhodných bodů se zvolí nebo čím více jednotlivých pokusů se
uskuteční, tím bude odhad – v souladu se zákonem velkých čísel – přesnější.
Uvedu ještě druhý příklad určení čísla π, takzvanou Buffonovu jehlu [6]. Problém byl
formulován již roku 1777.
Nechť je na linkovaném papíru vzdálenost sousedních rovnoběžných linek rovna d.
Na papír se hází jehla o stejné délce d. Počet případů, kdy poloha jehly po dopadu
protne některou linku nechť je M, počet všech hodů N. Lze ukázat, že limitní podíl
M/N je roven
𝑀
𝑁=
2
𝜋
Metodu Monte Carlo je tak možné realizovat pomocí náhodných dopadů jehly a tak
aproximovat číslo π.
Velkou nevýhodou této metody obecně je, že konverguje velmi pomalu. Například
aby se v posledním příkladu aproximovalo číslo π na dvě desetinná místa
s dostatečnou jistotou, je potřeba alespoň 100 000 hodů.
7
Tyto dva příklady pouze ilustrují princip metody Monte Carlo. Pokud by šlo skutečně
o výpočet Ludolfova čísla, existují iterativní vzorce (podobné Leibnizově řadě), které
konvergují velice rychle, například již druhá iterace určí π na 30 desetinných míst [7].
V současnosti je Ludolfovo číslo určeno na několik bilionů míst.
2.2 Schéma řešení problému pomocí metody Monte Carlo
1. Formulace problému a vytvoření modelu.
Odpovídá prvním dvěma krokům obecného schématu modelování v části 1.1.
Fyzikální jev v tomto případě popíšeme pomocí náhodné veličiny. K vytvoření
modelu stanovíme obor hodnot, jakých náhodná veličina může nabývat, a její
rozdělení pravděpodobnosti. Musí se také určit, která charakteristika
náhodné veličiny obsahuje námi hledanou odpověď. Ve výše zmíněném
příkladu určování čísla π můžeme říct, že obor hodnot je libovolný bod ve
čtverci, pravděpodobnost zvolení určitého bodu je stejná pro všechny body, a
konečně určující charakteristikou je, zda bod je v kruhu nebo není.
2. Generování náhodné veličiny.
a. Nejdříve se generuje náhodná veličina s určitým, pevně daným
rozdělením.
b. Potom se podle požadavků modelu tato veličina přetransformuje
v hledanou náhodnou veličinu. Pokud se budu držet předchozího
příkladu, tak první krok spočívá v generování dvou libovolných čísel
z intervalu (0,1), druhý krok spočívá v přetransformování těchto čísel
na určitý bod ve čtverci.
3. Opakování kroku 2 a statistické vyhodnocení výsledků.
Jak již bylo uvedeno, Metoda Monte Carlo konverguje velmi pomalu,
ke statisticky významnému závěru je potřeba mnoho rozehrávek (pokusů).
8
2.3 Základní pojmy matematické statistiky a metoda Monte Carlo
V této podkapitole velice stručně popíšu základní statistické a pravděpodobnostní
pojmy, které se používají při práci s metodou MC. Tyto popisy nesplňují nároky
na exaktní matematickou definici.
Veličina se nazývá náhodná, pokud je možno stanovit (nenulovou) pravděpodobnost,
s jakou při pokusu může nabývat určité hodnoty, u níž však není možno předpovědět
její hodnotu při realizaci konkrétního pokusu.
Náhodné veličiny se dělí na diskrétní a spojité. Příklad diskrétní množiny může být
množina 𝑀 = {1,2,3} nebo všechna celá čísla. Příkladem spojité veličiny je interval
𝑀 = (2; 3) nebo celá přímka reálných čísel.
Pro každou náhodnou veličinu se zavádí „zákon rozdělení náhodné veličiny“, který
každé hodnotě (v případě diskrétní veličiny) nebo každému intervalu hodnot
(v případě spojité veličiny) přiřadí pravděpodobnost, že náhodná veličina nabude této
hodnoty nebo bude v daném intervalu. Rozdělení pravděpodobnosti náhodné
veličiny 𝜉 se obvykle popisuje pomocí distribuční funkce 𝐹(𝑥), definované vztahem
𝐹(𝑥) = 𝑃(𝜉 < 𝑥).
𝐹(𝑥) tedy udává pravděpodobnost, že náhodná veličina 𝜉 bude ostře menší než
stanovená hodnota 𝑥. Z definice plyne
𝑃(𝑥1 ≤ 𝜉 < 𝑥2) = 𝐹(𝑥2) − 𝐹(𝑥1).
Pro spojitou náhodnou veličinu se zavádí hustota pravděpodobnosti 𝑝(𝑥), pro kterou
platí:
∫ 𝑝(𝑥)𝑥2
𝑥1𝑑𝑥 = 𝐹(𝑥2) − 𝐹(𝑥1) ⇔ 𝑝(𝑥) =
𝑑𝐹(𝑥)
𝑑𝑥
9
3 Deterministické modely a metoda molekulární
dynamiky
Deterministické modely jsou jednoznačně dány počátečním stavem a pohybovými
rovnicemi. Pokud se modelování začne s totožným počátečním stavem, daná
deterministická metoda, na rozdíl od stochastických metod, vždy dospěje
ke stejnému výsledku.
V práci bude deterministické modely zastupovat metoda molekulární dynamiky.
3.1 Princip metody molekulární dynamiky
Metoda molekulární dynamiky je metoda částicová, tedy jev se studuje z hlediska
jeho částí. Řeší se pohybové rovnice pro každou částici. Protože částice spolu
interagují, bývá obvykle příslušný soubor dat značně rozsáhlý.
Metoda vznikla v 50. letech při studiu kapalin. Dnes se úspěšně používá pro široké
spektrum problémů, sahajících od studia atomů až po astronomii a kosmologii.
K typickým problémům, které se řeší touto metodou, patří modelování dráhy
molekul, odtud název metody.
Obecný postup je následující [1]:
1. Vytvoří se odpovídající model studovaného jevu.
2. Systém se popíše pomocí souboru N částic.
3. Sestaví se klasické pohybové rovnice pro všechny částice.
4. Stanoví se počáteční podmínky a pohybové rovnice se vyřeší. Obvykle se
pracuje v určitém předem stanoveném rozmezí času, pohyb částic se sleduje
pouze v tomto časovém intervalu.
Pro účely práce je typickým příkladem principu metody molekulární dynamiky model
pohybu planety v radiálním gravitačním poli Slunce. Nechť má planeta určitý vektor
rychlosti a určitou vzdálenost od Slunce. Z gravitačního zákona se spočítá síla, která
10
na planetu působí a z té okamžité zrychlení planety. Z okamžitého zrychlení, okamžité
rychlosti a okamžité polohy se pak jednoduše vypočítá nová poloha a rychlost planety
po uplynutí vhodně stanovené doby, během které se gravitační síla příliš nemění.
V této nové poloze se spočítá nové okamžité zrychlení a celý postup se opakuje. Tímto
způsobem se postupně numericky rekonstruuje celá dráha planety.
Je dobře známo, že řešením konkrétně tohoto problému je kuželosečka (hyperbola,
parabola nebo elipsa) a řešení vstupních rovnic lze v tomto případě vyjádřit analyticky
bez ohledu na počáteční podmínky. Výše zmíněná numerická metoda však vynikne
v situaci, kdy analytické řešení problému neexistuje nebo je příliš složité. Pro typický
příklad není třeba chodit daleko: místo dvou gravitačně vázaných planet stačí
uvažovat tři („problém tří těles“). Pak řešení závisí citlivě na počátečních podmínkách
a jeho analytická forma neexistuje. Problém se řeší numericky na počítači. Právě
tento problém tří těles stál u počátku teorie chaosu – konkrétně v práci Henriho
Poincarého na konci 19. století [8].
Poznámka: Sluneční soustava je samozřejmě obecný „problém n těles“ avšak
vzájemné působení planet lze zanedbat do té míry, že je jisté, že planety přibližně
zůstanou na stejných orbitech jako dosud v řádu milionů let. Ovšem jakákoliv
předpověď, jdoucí nad rámec několika desítek milionů let, může být i v hrubých
rysech zcela nepřesná [3,4].
3.2 Metoda molekulární dynamiky z matematického hlediska
3.2.1 Úvod – pohybová rovnice
Pohybový zákon ve tvaru
𝐹 = 𝑚�⃗� = 𝑚𝑑2𝑟
𝑑𝑡2 (1)
s danými počátečními podmínkami se stává pohybovou rovnicí, která určuje
trajektorii částice. Síla �⃗� může záviset na poloze hmotného bodu a jeho rychlosti,
případně i na čase. Uvedu několik známých příkladů.
11
V případě homogenního tíhového pole je síla konstantní:
�⃗� = 𝑚�⃗�
V případě radiálního gravitačního pole, kde má centrální těleso velkou hmotnost 𝑀,
síla závisí na poloze tělesa:
�⃗� = −𝜘𝑚𝑀
𝑟3 𝑟
Síla, která závisí na rychlosti částice, je například síla odporu viskózního prostředí
(vzduchu, kapaliny):
�⃗� = −𝑘�⃗�
A konečně síla, která závisí na čase, je například harmonicky se měnící tzv. budící síla
nucených kmitů:
�⃗� = �⃗�𝑚 ∙ sin Ω𝑡
Dále budu uvažovat zcela obecný případ síly, závislé na poloze, rychlosti a času. Je
třeba si uvědomit, že v obecném případě se musí řešit soustava rovnic (1) současně
pro každý rozměr 𝑥, 𝑦, 𝑧. Tato vektorová rovnice se „rozpadne“ na tři vzájemně
svázané části:
𝑚𝑎𝑥 = 𝑚𝑑2𝑥
𝑑𝑡2 = 𝐹𝑥 = 𝐹𝑥(𝑡, 𝑥, 𝑦, 𝑧, 𝑣𝑥, 𝑣𝑦, 𝑣𝑧)
𝑚𝑎𝑦 = 𝑚𝑑2𝑦
𝑑𝑡2= 𝐹𝑦 = 𝐹𝑦(𝑡, 𝑥, 𝑦, 𝑧, 𝑣𝑥 , 𝑣𝑦, 𝑣𝑧) (2)
𝑚𝑎𝑧 = 𝑚𝑑2𝑧
𝑑𝑡2 = 𝐹𝑧 = 𝐹𝑧(𝑡, 𝑥, 𝑦, 𝑧, 𝑣𝑥 , 𝑣𝑦, 𝑣𝑧)
V práci nebude trojrozměrný problém řešen, zabývat se budu nanejvýš
dvojrozměrným problémem v rovině. Jednorozměrný problém a problém
vícerozměrný se liší jenom počtem rovnic, mechanismus metody však zůstává stejný.
Jsou-li zadány počáteční podmínky – obvykle se jedná o polohu částice 𝑟0 její rychlost
�⃗�0 – je možné pomocí souboru rovnic (2) stanovit průběh pohybu 𝑟(𝑡) a rychlost
částice �⃗�(𝑡) v závislosti na čase. Při modelování pohybu jde o to, abychom k určité
12
posloupnosti časů {𝑡𝑖} stanovili posloupnost příslušných polohových vektorů {𝑟(𝑡𝑖)}
a případně rychlostí {�⃗�(𝑡𝑖)}. Získané posloupnosti se pak využijí ke grafickému
znázornění dráhy částice.
Posloupnost {𝑡𝑖} bude mít v celé práci aritmetickou formu s konstantním krokem ℎ,
tedy
ℎ = 𝑡𝑖+1 − 𝑡𝑖
3.2.2 Analytická metoda řešení pohybových rovnic
Spočívá ve vyřešení souboru rovnic (2) metodami matematické analýzy. Řešením je
poloha 𝑟 a rychlost �⃗� jako elementární funkce času 𝑡, 𝑟 = 𝑟(𝑡) a �⃗� = �⃗�(𝑡). Pokud
do těchto funkcí budeme za čas postupně dosazovat z množiny {𝑡𝑖}, získáme přesné
polohy částice {𝑟(𝑡𝑖)}.
Zřejmou předností analytické metody je, že poskytuje přesné řešení, ze kterého je
možné vyčíst další charakteristiky děje (perioda, zakřivení trajektorie atd.).
Nevýhody jsou dvě. Řešit složité diferenciální rovnice analyticky vyžaduje pokročilé
matematické znalosti. Například studenti na střední škole se sice setkají s odvozením,
že těleso v homogenním gravitačním poli se pohybuje po parabole, ale v případě, že
se těleso pohybuje v radiálním gravitačním poli, se svými znalostmi už rovnici
trajektorie odvodit nedokážou. Dalším omezením je, že ne vždy analytické řešení
existuje, jak tomu je např. ve zmíněném problému tří těles.
3.2.3 Numerická metoda řešení pohybových rovnic
Numerická metoda vychází ze skutečnosti, že polohy 𝑟(𝑡𝑖) a rychlosti �⃗�(𝑡𝑖)
v posloupnosti {𝑡𝑖} jsou spolu (v určitém přiblížení) svázány rekurentními vztahy.
Z veličin 𝑟(𝑡𝑖), �⃗�(𝑡𝑖) a funkce �⃗�(𝑟(𝑡𝑖), �⃗�(𝑡𝑖)) (v těchto případech představující sílu),
lze vypočítat polohu a rychlost v následujícím okamžiku 𝑡𝑖 + ℎ: 𝑟(𝑡𝑖 + ℎ), �⃗�(𝑡𝑖 + ℎ).
Tímto způsobem se pokračuje až do předdefinovaného konečného času 𝑡max.
Výhodou numerického přístupu je jeho univerzálnost – nezáleží na tom, jak složitý
tvar má funkce 𝐹 nebo jak je pohybový model zadaný, všechny problémy lze řešit
podobným způsobem a bez hlubokých znalostí matematické analýzy.
13
Existuje velké množství numerických metod, které se liší svou složitostí a přesností.
V práci se zaměřím na ty nejzákladnější. Všechny numerické metody se vyznačují
rysem, že čím menší se zvolí časový krok ℎ, tím přesnější metoda je. Současně ovšem
narůstá čas výpočtu.
3.2.4 Elementární metody – metoda Eulerova
Nechť síla, působící na částici, je obecnou funkcí času, rychlosti a polohy: �⃗�(𝑡, �⃗�, 𝑟).
Funkce 𝐴(𝑡, �⃗�, 𝑟), udávající okamžité zrychlení �⃗�, je
�⃗� = 𝐴(𝑡, �⃗�, 𝑟) =�⃗�(𝑡,�⃗⃗�,𝑟)
𝑚. (A)
Při vytváření posloupností 𝑟(𝑡𝑖), �⃗�(𝑡𝑖) Eulerovou metodou se použijí rekurentní
vztahy
�⃗�𝑖+1 = �⃗�𝑖 + �⃗�ℎ (V)
𝑟𝑖+1 = 𝑟𝑖 + �⃗�𝑖ℎ (R)
𝑡𝑖+1 = 𝑡𝑖 + ℎ, (T)
neboť z definice okamžité rychlosti a zrychlení platí pro dostatečně malou časovou
změnu Δt = ℎ:
Δ�⃗� = �⃗� Δt
Δ𝑟 = �⃗� Δt
(symbolem Δ se označuje změna fyzikální veličiny za čas ℎ).
Rovnice (A) – výpočet zrychlení, (V) – výpočet rychlosti, (R) – výpočet polohy a (T) –
výpočet času, představují vztahy, které se použijí při výpočtu veličin v následujícím
časovém kroku vždy ve stejném pořadí, jako při výpočtu v kroku předcházejícím. Je
však několik možností, jak pořadí rovnic pro všechny kroky stanovit.
14
Nejběžnější pořadí je (ARVT), tedy:
𝑎𝑖⃗⃗⃗⃗ = 𝐴(𝑡𝑖, �⃗�𝑖, 𝑟𝑖)
𝑟𝑖+1 = 𝑟𝑖 + �⃗�𝑖ℎ
�⃗�𝑖+1 = �⃗�𝑖 + �⃗�𝑖ℎ
𝑡𝑖+1 = 𝑡𝑖 + ℎ
Možné je také pořadí (AVRT):
𝑎𝑖⃗⃗⃗⃗ = 𝐴(𝑡𝑖, �⃗�𝑖, 𝑟𝑖)
�⃗�𝑖+1 = �⃗�𝑖 + �⃗�𝑖ℎ
𝑟𝑖+1 = 𝑟𝑖 + �⃗�𝑖+1ℎ
𝑡𝑖+1 = 𝑡𝑖 + ℎ
Případně pořadí (RAVT):
𝑟𝑖+1 = 𝑟𝑖 + �⃗�𝑖ℎ
𝑎𝑖⃗⃗⃗⃗ = 𝐴(𝑡𝑖, �⃗�𝑖, 𝑟𝑖+1)
�⃗�𝑖+1 = �⃗�𝑖 + �⃗�𝑖ℎ
𝑡𝑖+1 = 𝑡𝑖 + ℎ
Tyto tři postupy dávají ve většině případů výslednou trajektorii s podobnou přesností.
Pokud se například uvažuje pohyb tělesa v homogenním gravitačním poli, dává první
a třetí metoda totožný výsledek, zrychlení v tomto případě nezávisí na poloze tělesa.
Tyto postupy se souhrnně označují jako „Eulerova metoda“.
15
3.2.5 Ilustrace Eulerovy metody na příkladech
Až dosud byl výklad Eulerovy metody obecný, nyní se však omezím na konkrétní
příklady pohybu částice v jedné dimenzi. Značení se zjednoduší, vektorové funkce
budou nahrazeny skalárními:
𝑟(𝑡𝑖) ≡ 𝑥(𝑡𝑖)
�⃗�(𝑡𝑖) ≡ 𝑣(𝑡𝑖)
𝑎𝑖⃗⃗⃗⃗ = 𝐴(𝑡𝑖, �⃗�𝑖, 𝑟𝑖) ≡ 𝑎𝑖 = 𝐴(𝑡𝑖, 𝑣𝑖 , 𝑥𝑖).
Než přistoupím k běžnějšímu příkladu řešení Newtonových pohybových rovnic, které
jsou druhého řádu, ilustruji Eulerovu metodu na příkladu obyčejné diferenciální
rovnice prvního řádu:
�̇�(𝑡) = 𝑦(𝑥, 𝑡) (3)
Derivaci určité funkce podle času budu v souladu s fyzikální konvencí označovat
tečkou nad danou funkcí. Rovnice výše vyjadřuje, že derivace polohy podle času je
rovna dané funkci 𝑦, která závisí na 𝑥 a 𝑡. Nechť jsou počáteční podmínky 𝑡0 = 0
𝑥(0) = 𝑥0; úkolem je modelovat dráhu částice 𝑥(𝑡).
Zvolí se dostatečně malý časový krok ℎ. Ze znalosti počátečních podmínek 𝑡0 = 0 a
𝑥0 se podle vzorce (3) nejdříve spočítá rychlost:
�̇�0 = �̇�(0) = 𝑦(𝑥0, 0). (4)
Ze znalosti počáteční polohy, rychlosti a doby, po kterou se částice pohybuje, se
spočítá nová poloha pomocí prvních dvou členů Taylorova rozvoje funkce 𝑥(𝑡), tedy:
𝑥(ℎ) = 𝑥(0) + ℎ ∙ �̇�(0) = 𝑥0 + ℎ 𝑥0̇ .
Tím je dána nová poloha 𝑥1 = 𝑥(ℎ) a rychlost 𝑥1̇ = 𝑦(𝑥1, ℎ) částice v čase 𝑡1 = ℎ.
Analogickým způsobem se tyto hodnoty využijí pro výpočet polohy 𝑥2 a rychlosti 𝑥2̇
v čase 𝑡2 = 2ℎ.
Ačkoliv je použitá metoda jednoduchá, není příliš přesná. V časovém úseku ℎ se ve
skutečnosti rychlost poněkud mění, zatímco v modelu je nahrazena konstantní
16
hodnotou. Zanedbáním vyšších členů Taylorova rozvoje se dopouštíme chyby
ve výpočtu řádově ℎ2 (značí se O(ℎ2)). Přesnější model by tak vyžadoval volbu menší
hodnoty konstanty h, tím by se ale stal výpočet početně a tedy i časově náročnější.
Existují však sofistikovanější matematické modely, které pro danou hodnotu kroku ℎ
vedou k řádově větší přesnosti.
Na předcházejícím příkladu budu jeden z nich ilustrovat, další alternativu pak popíšu
v podkapitole Tři verze metody Verletovy. Slovně lze tuto metodu popsat následovně:
Předpokládejme, že poloha částice 𝑥𝑛 v čase 𝑡𝑛 = 𝑛ℎ je již známa. Ze vzorce (3) se
vypočítá derivace polohy �̇�𝑛 a z té nová poloha 𝑥𝑛+1𝑝 (index p značí „prediktor“) v čase
𝑡𝑛+1 postupem stejným jako v předchozím případě. Nyní však tuto polohu nebudeme
pokládat za konečný výsledek. Ze vzorce (3) se vypočítá derivace v bodě 𝑥𝑛+1𝑝
v čase
𝑡𝑛+1 a tato derivace se zprůměrujeme s předchozí derivací v bodě (𝑥𝑛, 𝑡𝑛). Takto
získaná „nová“ derivace je přesnějším odhadem změny polohy v časovém úseku ℎ.
S její pomocí se vypočte konečná poloha 𝑥𝑛+1 v čase 𝑡𝑛+1. Vyjádřeno rovnicemi:
𝑥𝑛+1𝑝 = 𝑥𝑛 + ℎ ∙ 𝑦(𝑥𝑛, 𝑡𝑛)
𝑥𝑛+1 = 𝑥𝑛 + ℎ ∙𝑦(𝑥𝑛, 𝑡𝑛) + 𝑦(𝑥𝑛+1
𝑝 , 𝑡𝑛+1)
2 .
Lze ukázat, že tato metoda má chybu řádu O(ℎ3). Je zřejmé, že pro malá ℎ ≪ 1 je
chyba mnohem menší.
Nyní aplikuji Eulerovu metodu na rovnici druhého řádu, tedy na rovnici, v níž
vystupuje zrychlení. Částice se nachází v silovém poli 𝐹(𝑥, 𝑡) (například gravitačním):
𝑚 ∙ �̈�(𝑡) = 𝐹(𝑥, 𝑡).
Zavedením pomocné funkce 𝑣(𝑡) ≡ �̇�(𝑡) převedu rovnici druhého řádu na soustavu
dvou rovnic prvního řádu:
�̇�(𝑡) = 𝑣(𝑡),
�̇�(𝑡) = 𝐴(𝑥(𝑡), 𝑡). (5)
17
Funkce 𝐴(𝑥, 𝑡) ≡ 𝐹(𝑥, 𝑡)/𝑚 představuje zrychlení částice, obecně zadané jako
funkce polohy a času.
Soustavu (5) je třeba ještě doplnit počátečními podmínkami:
𝑥(𝑡0) = 𝑥0,
𝑣(𝑡0) = 𝑣0.
Postup výpočtu soustavy (5) je analogický postupu, použitému k řešení diferenciální
rovnice prvního řádu. Vycházíme z pořadí rovnic (ARVT) z předcházející kapitoly.
Zvolí se časová konstanta ℎ. Ze vzorce (5) se nejdříve spočítá zrychlení částice
v daném okamžiku a daném místě:
𝑎0 = 𝐴(𝑥0, 𝑡0) (6)
Z počátečního zrychlení, počáteční rychlosti, počáteční polohy částice a doby pohybu
částice ℎ se spočítá rychlost a poloha částice v čase 𝑡1 = 𝑡0 + ℎ :
𝑥1 = 𝑥0 + ℎ ∙ 𝑣0, (7)
𝑣1 = 𝑣0 + ℎ ∙ 𝑎0. (8)
Tímto způsobem se pokračuje až do předdefinovaného času 𝑡max = 𝑛ℎ, v němž se
výpočet ukončí.
Následující úloha je inspirována úvodním příkladem publikace [5]. Její řešení je
v publikaci provedeno v dostupném Excelu. To by mohl být zajímavý námět
pro středoškolské učitele a pro žáky se zájmem o fyziku, kteří nemají přístup
ke specializovaným programům nebo se nechtějí učit programovacím jazykům.
Zadání:
Modelujte volný pád tělesa z výšky ℎ = 20 metrů s přihlédnutím k odporu vzduchu.
Předpokládejte, že odporová síla se řídí vztahem:
𝐹𝑂 = 𝐾𝑣2.
18
Je známo, že mezní rychlost, při které se odporová síla 𝐹𝑂 vyrovná síle gravitační 𝐹𝐺 ,
je rovna 𝑣M = 10 m s−1. Počítejte s gravitačním zrychlením 𝑔 = 9,8 m s−2.
Řešení:
Zrychlení částice je v každém okamžiku dáno rovnicí
𝑎(𝑡𝑖) =𝐹𝐺−𝐹𝑂(𝑣𝑖)
𝑚= 𝑔 − 𝑠 𝑣𝑖
2. (9)
Konstantu 𝑠 ≡ 𝐾/𝑚 lze spočítat z rovnosti gravitační a odporové síly při mezní
rychlosti:
0 =𝑚𝑔−𝐾𝑣M
2
𝑚= 9,8 − 𝑠 ∙ 102.
Číselně 𝑠 = 0,098.
Nechť je v čase 𝑡𝑖 známa rychlost částice 𝑣𝑖 a její uražená dráha 𝑥𝑖. Zrychlení 𝑎𝑖 je pak
určeno vzorcem (9). Označme časový krok ℎ. Rekurentní vztahy budou vypadat
následovně:
𝑎𝑖 = 𝑔 − 𝑠𝑣𝑖2 = 9,8 − 0,098 ∙ 𝑣𝑖
2 (1-A)
𝑥𝑖+1 = 𝑥𝑖 + 𝑣𝑖 ∙ ℎ (2-R)
𝑣𝑖+1 = 𝑣𝑖 + 𝑎𝑖 ∙ ℎ (3-V)
𝑡𝑖+1 = 𝑡𝑖 + ℎ . (4-T)
Jde opět o pořadí ARVT. Konkrétně pro nulové počáteční hodnoty rychlosti, dráhy a
času a časový krok ℎ = 0,1 bude první iterace vypadat následovně:
𝑎0 = 𝑔 − 𝑠𝑣02 = 9,8 − 0,098 ∙ 02 = 9,8
𝑥1 = 𝑥0 + 𝑣0 ∙ ℎ = 0 + 0 ∙ 0,1 = 0
𝑣1 = 𝑣0 + 𝑎0 ∙ ℎ = 0 + 9,8 ∙ 0,1 = 0,98
𝑡1 = 𝑡0 + ℎ = 0 + 0,1 = 0,1 ,
19
Pokud se jednotlivé kroky svěří Excelu, získají se tyto výsledky:
Tabulka 2 Eulerova metoda realizovaná v Excelu
Podle tabulky tedy těleso spadne z výšky 20 metrů přibližně za 2,7 sekundy. Pokud by
se odpor vzduchu neuvažoval (𝑠 = 0), dopadlo by těleso za 2,04 sekundy.
3.2.6 Verletova metoda a její varianty
Přesnější alternativou k Eulerově metodě je metoda Verletova. Je několik
ekvivalentních způsobů, jak ji rekurentně vyjádřit, několik příkladů lze nalézt
například v [2]. Já zde zmíním její klasickou podobu, verzi nazvanou leap – frog, a
takzvaný rychlostní Verlet.
20
Nejdříve si je třeba uvědomit hlavní zdroj chyb v Eulerově metodě: v časovém
intervalu (𝑡0, 𝑡0 + ℎ) se nahrazuje zrychlený pohyb pohybem rovnoměrným
s počáteční rychlostí 𝑣(𝑡0).
I metoda leap – frog počítá s rovnoměrným pohybem, ale rychlost bere ve středu
časového intervalu ℎ. Pohyb částice mezi časovými okamžiky 𝑡 a 𝑡 + ℎ je tedy chápán
jako rovnoměrný s rychlostí rovnou 𝑣(𝑡 + ℎ/2). Rekurentní formule jsou tak:
𝑣(𝑡 + ℎ/2) = 𝑣(𝑡 − ℎ/2) + ℎ ∙ 𝑎(𝑡)
𝑥(𝑡 + ℎ) = 𝑥(𝑡) + ℎ ∙ 𝑣(𝑡 + ℎ/2).
Počáteční rychlost stanovíme ze vzorce
𝑣(𝑡0 + ℎ/2) =𝑥(𝑡0 + ℎ) − 𝑥(𝑡0)
ℎ ,
kde 𝑥(𝑡0 + ℎ) se spočítá ze vzorce
𝑥(𝑡0 + ℎ) = 𝑥(𝑡0) + ℎ ∙ 𝑣(𝑡0) +ℎ2
2𝑎(𝑡0), (10)
ve kterém pohyb částice v intervalu (𝑡0, 𝑡0 + ℎ) pokládáme za rovnoměrně zrychlený.
Ve verzi „rychlostní Verlet“ se pohyb částice v časovém intervalu (𝑡, 𝑡 + ℎ) také
považuje za rovnoměrně zrychlený:
𝑥(𝑡 + ℎ) = 𝑥(𝑡) + ℎ ∙ 𝑣(𝑡) +ℎ2
2𝑎(𝑡) . (11)
Rychlost částice v okamžiku 𝑡 + ℎ se však nepočítá ze zrychlení 𝑎(𝑡), ale z průměru
zrychlení 𝑎(𝑡) a 𝑎(𝑡 + ℎ),
𝑣(𝑡 + ℎ) = 𝑣(𝑡) + ℎ ∙𝐴(𝑥,𝑡)+𝐴(𝑥,𝑡+ℎ)
2= 𝑣(𝑡) + ℎ ∙
𝑎(𝑡)+𝑎(𝑡+ℎ)
2 . (12)
Rovnice v tomto případě nemohou mít jiné pořadí než nejdříve (11) a pak (12).
Konečně klasická podoba Verletovy metody spočívá ve vyjádření druhé derivace
polohy pomocí diferencí druhého řádu. Pro malá ℎ přibližně platí:
�̇�(𝑡) ≈𝑥(𝑡)−𝑥(𝑡−ℎ)
ℎ, �̇�(𝑡 + ℎ) ≈
𝑥(𝑡+ℎ)−𝑥(𝑡)
ℎ .
21
Na základě rozvoje do Taylorovy řady lze ukázat, že platí
�̈�(𝑡) =�̇�(𝑡+ℎ)−�̇�(𝑡)
ℎ+ 𝑂(ℎ2) =
𝑥(𝑡+ℎ)−2𝑥(𝑡)+𝑥(𝑡−ℎ)
ℎ2 + 𝑂(ℎ2). (13)
Se zanedbáním členu 𝑂(ℎ2), plyne z rovnice (12) vzorec
𝑥(𝑡 + ℎ) = 2𝑥(𝑡) − 𝑥(𝑡 − ℎ) + ℎ2𝐴(𝑥(𝑡), 𝑡) . (14)
Z poloh 𝑥(𝑡) a 𝑥(𝑡 − ℎ) je tak možno spočítat polohu 𝑥(𝑡 + ℎ). Jedinou nevýhodou
oproti Eulerově metodě je skutečnost, že není k dispozici poloha v čase 𝑥(𝑡0 − ℎ). Asi
nejsnazším způsobem, jak tento problém obejít, je spočítat polohu v čase 𝑥(𝑡0 + ℎ)
pomocí vzorce (10) a teprve pro další časové body 𝑡0 + 𝑛ℎ, kde 𝑛 ≥ 2, pokračovat
vzorcem (14).
Jak už bylo řečeno, chyba Eulerovy metody je řádu 𝑂(ℎ2), zatímco u Verletovy
metody je chyba řádu 𝑂(ℎ3), je tedy podstatně přesnější.
22
4 Praktická část
4.1 Problémy řešené metodou Monte Carlo
4.1.1 Určování čísla π
Obrázek 3 Určování Ludolfova čísla metodou MC
Číslo π určím již zmíněnou metodou náhodného generování bodů ve čtverci (strana 5
a 6). Kartézské souřadnice vrcholu 𝐴 čtverce nechť jsou [0,0], vrcholu 𝐶 [1,1], a
souřadnice [𝑥, 𝑦] bodu 𝑃 jsou dvě náhodná čísla s rovnoměrným rozdělením v mezích
0 < 𝑥 < 1 a 0 < 𝑦 < 1.
Ve čtverci zvolím čtvrtkruh 𝐾, který má střed ve vrcholu 𝐴 a poloměr 𝑟 = 1. Pak platí
𝑥2 + 𝑦2 < 1 ⇒ 𝑃 ∈ 𝐾, jinak 𝑃 ∉ 𝐾.
Počet bodů 𝑃, které při náhodném generování padnou do 𝐾, označím 𝑚, počet všech
vygenerovaných náhodných bodů nechť je 𝑁. Z porovnání obsahu čtvrtkruhu a
čtverce vyplývá aproximace
𝑚
𝑁≈
𝜋
4 ⇒ 𝜋 ≈ 4
𝑚
𝑁.
V následující tabulce je 20 krát „změřeno“ číslo 𝜋. Pro porovnání byla první polovina
odhadů určena ze 100 náhodných bodů, druhá polovina pak z 10 000.
23
Ludolfovo číslo začíná 𝜋 = 3,14159 …
Je možné ukázat, že směrodatná odchylka metody Monte Carlo obecně závisí
na počtu pokusů 𝑁 vztahem
𝜎~1
√𝑁 (1)
K tomu, aby počet platných desetinných míst narůstal aritmetickou řadou je tedy
nutné, aby počet potřebných pokusů – rozehrávek (výpočetní čas) narůstal řadou
geometrickou.
Na výše uvedených výsledcích si můžeme tento fakt ověřit: Poměr směrodatných
odchylek pro 10 000 a 100 rozehrávek z tabulky by na základě vzorce (1) měl být
přibližně roven √100/10 000 = 1/10.
Pro 𝑁 = 100 označím jednotlivé odhady čísla 𝜋 symboly 𝑝𝑖, 𝑖 = 1, … 10, pro 𝑁 =
10 000 jednotlivé odhady označím 𝑞𝑖, 𝑖 = 1, … 10. Poměr směrodatných odchylek
v tomto označení je
√∑ (𝑞𝑖 − 𝜋)210𝑖=1
10
√∑ (𝑝𝑖 − 𝜋)210𝑖=1
10
=0.0183
0.1943= 0.094 ≈ 1/10
Zdrojový kód programu pro výpočet čísla 𝜋 uvedenou metodou je uveden na straně
42.
4.1.2 Výpočet určitého integrálu
Naším cílem je nyní metodou MC spočítat integrál
𝐼 = ∫ 𝑓(𝑥) 𝑑𝑥𝑏
𝑎.
K výpočtu je možné zvolit následující jednoduchý geometrický přístup, který je
v principu totožný s řešením předchozí úlohy:
Předpokládejme, že daná funkce 𝑓 je na intervalu (𝑎, 𝑏) omezená a nezáporná. Na
intervalu se odhadne maximum 𝑐 funkce 𝑓 shora a vymezí se obdélník, ohraničený
osou 𝑥, mezemi intervalu, a odhadnutým maximem:
odhad π (N = 100)
3,12 3,16 3,32 3,32 3,44 3,16 2,72 3,04 3,08 3,32
odhad π (N = 10 000)
3,1696 3,1604 3,1688 3,1592 3,1276 3,1604 3,1428 3,146 3,156 3,1224
24
Obrázek 4 Integrace metodou Monte Carlo
Vygeneruje se 𝑁 bodů P o náhodných souřadnicích (𝑥, 𝑦), kde
𝑎 < 𝑥 < 𝑏
0 < 𝑦 < 𝑐 .
Pokud bod 𝑃 padne do plochy omezené křivkou, musí být
𝑦 < 𝑓(𝑥) ⇒ 𝑃 ∈ 𝐼, jinak 𝑃 ∉ 𝐼
Počet všech bodů, které padnou do plochy pod křivkou 𝑓(𝑥), označím 𝑚, počet všech
generovaných bodů nechť je 𝑁. Pak přibližně platí:
𝐼
(𝑏 − 𝑎)𝑐≈
𝑚
𝑁.
V příkladu jsem počítal metodou MC integrál
𝐼 = ∫ sin 𝑥 𝑑𝑥2𝜋
0 .
Jelikož v tomto případě není funkce na celém intervalu kladná, je nutné předchozí
postup modifikovat, příspěvek bodů pod osou 𝑥 a zároveň nad křivkou 𝑓(𝑥) je nutné
odečítat. Označme
𝑚 = |{𝑃}| , {𝑃} = {(𝑥, 𝑦), 𝑎 < 𝑥 < 𝑏, 0 < 𝑦 < 𝑓(𝑥)}
𝑛 = |{𝑃}| , {𝑃} = {(𝑥, 𝑦), 𝑎 < 𝑥 < 𝑏, 𝑓(𝑥) < 𝑦 < 0} .
Nechť minimum (resp. odhad minima) funkce 𝑓 je 𝑑 a maximum (resp. odhad
maxima) nechť je 𝑐. Pak zřejmě platí:
𝐼 ≈ (𝑐 − 𝑑)(𝑏 − 𝑎) ∙𝑚−𝑛
𝑁, kde 𝑁 je celkový počet bodů.
25
Hodnota integrálu byla vypočítána pro 4 různé hodnoty celkového počtu bodů 𝑁,
pro každou hodnotu se výpočet opakoval čtyřikrát. Přesná hodnota integrálu je
samozřejmě nula. Pokud vezmeme za procentuální základ obsah vymezeného
obdélníka, pak rozdíl mezi odhadnutou hodnotou integrace a skutečnou nulovou
hodnotou v jednotlivých pokusech byl:
N 𝐼1 𝐼2 𝐼3 𝐼4 100 9.0 % 1.9 % 1.0 % 0.0 %
1 000 0.5 % 0.1 % 1.7 % 1.2 %
10 000 0.7 % 0.3 % 0.1 % 0.2 %
100 000 0.3 % 0.0 % 0.3 % 0.4 %
Zdrojový kód programu je na straně 43.
Poznámka:
Minimum funkce hledá MATLAB numericky pomocí příkazu fminbnd. Jelikož
analogický příkaz pro nalezení maxima funkce nemá zabudován, je nutné toto
maximum určovat prostřednictvím minima záporně vzaté funkce.
4.1.3 Náhodná procházka
Nejdříve zmíním často uváděný příklad náhodné procházky, příklad chůze „opilého
námořníka“ ([9], str. 82):
Námořník jde z hospody a je stejně pravděpodobné, že udělá krok dopředu, stejně
jako že udělá krok dozadu (kroky do stran zatím nebudu uvažovat). Co je možné říct o
vzdálenosti, kterou urazí po 𝑁 (stejně dlouhých) krocích?
Z důvodu symetrie je zřejmé, že střední vzdálenost ⟨𝑑𝑁⟩ od počátku bude nulová
pro libovolný počet kroků 𝑁. Je však možné učinit predikci pro střední hodnotu
kvadrátu vzdálenosti ⟨𝑑𝑁2 ⟩ ?
Nechť je pohyb námořníka omezen na osu 𝑥. Hodnotu kroku číslo 𝑖 budu značit 𝐿𝑖,
𝐿𝑖 = ±1. Střední hodnota kvadrátu vzdálenosti je obecně dána vztahem
⟨𝑑𝑁2 ⟩ = ⟨ (∑ 𝐿𝑖
𝑁𝑖=1 )2⟩ = (∑ ⟨𝐿𝑖
2⟩𝑁𝑖=1 ) + ∑ ⟨𝐿𝑖𝐿𝑗⟩𝑁
𝑖≠𝑗 (1)
Suma v první závorce je rovna 𝑁. Jelikož součin 𝐿𝑖𝐿𝑗, kde 𝑖 ≠ 𝑗, může být se stejnou
pravděpodobností roven +1 nebo −1, musí být střední hodnota sumy v druhé
závorce rovna nule. Odtud
⟨𝑑𝑁2 ⟩ = 𝑁.
26
Analogicky by se postupovalo v případě, že by se námořník pohyboval v celé rovině a
směr jeho kroku byl zcela náhodný, pouze by se počítalo se se skalárním součinem
vektorů. V případě, že by se i délka kroku námořníka 𝐿 náhodně měnila, byla by
střední hodnota kvadrátu vzdálenosti
⟨𝑑𝑁2 ⟩ = 𝑁 ∙ ⟨𝐿2⟩ , (2)
kde ⟨𝐿2⟩ je průměrná hodnota kvadrátu délky jednoho kroku (nezaměňovat za
kvadrát průměrné délky kroku).
Metodou MC byl modelován náhodný pohyb bodu v rovině 𝑥𝑦. V každém kroku se
bod posunul buď ve směru osy 𝑥 o ±1 nebo ve směru osy 𝑦 o ±1. Osa stejně jako
směr kroku v dané ose byly vybírány náhodně. Pohyb byl zaznamenán do mřížky
s vyznačeným počátečním a koncovým bodem. Následující obrázek zachycuje
výsledný pohyb jednoho pokusu.
Obrázek 5 Náhodná procházka v mřížce
27
Srovnání kvadrátu vzdálenosti od počátku pro konkrétní rozehrávku a teoretické
předpovědi (2) bylo pro pokusy s různou délkou kroků zaznamenáno graficky.
Obrázek 6 Srovnání predikce středního kvadrátu vzdálenosti a vzdálenosti pro jednotlivé rozehrávky
Zdrojový kód je na stranách 44 a 45.
Poznámka:
K určení směru pohybu byl generován náhodný dvousložkový vektor s hodnotami 0
nebo 1. Kódování bylo:
[0,0] – posun −1 v ose 𝑦
[0,1] – posun +1 v ose 𝑦
[1,0] – posun −1 v ose 𝑥
[1,1] – posun +1 v ose 𝑥 .
4.1.4 Modelování Brownova pohybu
Cílem této úlohy je modelovat dráhu částice obecněji. Vzhledem k zobrazení v rovině
jsme se omezili na rovinný pohyb, ovšem rozšíření modelu na pohyb ve třech
dimenzích je přímočaré. Ve srovnání s předchozí úlohou došlo k zobecnění ve dvou
ohledech:
1. Byl generován libovolný náhodný směr v rovině (pohyb nebyl omezen
na pravoúhlou mřížku).
2. Velikost kroku nebyla brána jako konstantní, ale byla dán exponenciálním
rozdělením. Stejným rozdělením se řídí i volná dráha molekul či částic,
vykonávajících Brownův pohyb [10].
28
V programu se v každém kroku vygenerují dvě náhodná čísla z intervalu (0,1). První
náhodné číslo rnd1 se použije k určení velikosti náhodné dráhy 𝐿. Využije se přitom
distribuční funkce, která má pro exponenciální rozdělení tvar ([10], str. 62)
𝐹(𝐿) = 1 − 𝑒−𝐿/𝐿0,
kde 𝐿0 je střední hodnota délky jednoho kroku, resp. „střední dráha molekuly mezi
dvěma srážkami“. Částici, která urazí dráhu přesně 𝐿, odpovídá jednoznačná hodnota
distribuční funkce 𝐹(𝐿) Tu můžeme chápat jako náhodnou veličinu s rovnoměrným
rozdělením z intervalu (0,1) [1]. Odtud
rnd1 = 1 − 𝑒−𝐿/𝐿0 ⇒ 𝐿 = −𝐿0 ∙ ln(1 − rnd1) .
Druhé náhodné číslo rnd2 se použije ke stanovení náhodného úhlu 𝜑, který svírá
směr následujícího pohybu částice s osou 𝑥:
𝜑 = 2𝜋 ∙ rnd2.
Náhodné posunutí částice ∆𝑟 v rovině pak bude
∆𝑟 = (𝐿 cos 𝜑 , 𝐿 sin 𝜑) .
Simulace pohybu, generovaného jedním spuštěním programu, je zachycena
na následujícím grafu.
Obrázek 7 Brownův pohyb metodou Monte Carlo
Zaznamenáno bylo také srovnání teoretické předpovědi (2) střední hodnoty kvadrátu
vzdálenosti uražené od počátku v závislosti na počtu kroků 𝑁 se středními hodnotami
kvadrátů vzdálenosti, získanými z opakovaných simulací.
29
Obrázek 8 Srovnání predikce středního kvadrátu vzdálenosti v závislosti na počtu kroků (červená čára) s průměrem kvadrátů vzdálenosti tisíce konkrétních rozehrávek (modré hvězdy)
Zdrojový kód obou programů (generování pohybu a testování středních hodnot) je
uveden na stranách 46 až 48.
Poznámka:
Pro průměrnou délku „kroku“ ⟨𝐿⟩ = 𝐿0 v případě exponenciálního rozdělení platí
⟨𝐿2⟩ = 2𝐿02 [10], tedy ⟨𝑑𝑁
2 ⟩ = 2𝑁𝐿02 .
4.2 Modelování dějů metodou molekulární dynamiky
4.2.1 Oscilátor
Cílem této úlohy je modelování závislosti výchylky oscilátoru na čase. Pohybová
rovnice je dána vztahem
𝐹 = 𝑚𝑑2𝑥
𝑑𝑡2= −𝑘𝑥 .
Po substituci 𝜔 ≡ √(𝑘/𝑚) má obecné řešení této rovnice tvar
𝑥 = 𝐴0 ∙ cos(𝜔𝑡 + 𝜑0),
kde 𝐴0, 𝜑0 jsou konstanty určené počátečními podmínkami 𝑥0, 𝑣0.
30
Platí pro ně:
𝐴0 = √𝑥02 +
𝑣02
𝜔2 ,
𝜑0 = tan−1 (−𝑣0
𝑥0𝜔) .
V modelu byly počáteční podmínky v čase 𝑡0 = 0 stanoveny takto:
𝑥(𝑡0) = 1, 𝑣(𝑡0) = 0 .
Hodnota 𝜔 = 1. Exaktní řešení za těchto podmínek je
𝑥(𝑡) = cos(𝑡).
Problém byl opět řešen Eulerovou a Verletovou metodou a obě metody se porovnaly
s exaktním řešením.
a. Eulerova metoda
Vyjdeme ze vztahů
𝑎𝑖 = −𝜔2𝑥𝑖 ,
𝑥𝑖+1 = 𝑥𝑖 + 𝑣𝑖ℎ ,
𝑣𝑖+1 = 𝑣𝑖 + 𝑎𝑖ℎ .
Počáteční podmínky jsou
𝑥(0) = 1, 𝑣(0) = 0 .
Časový krok ℎ = 0,01. Výpočet je ukončen po 20 periodách, tedy v čase 20𝑇, kde
𝑇 = 2𝜋/𝜔.
31
První graf zobrazuje závislost výchylky na čase a její chybu:
Obrázek 9 Horní část: srovnání exaktního a numerického řešení. Dolní část: vývoj chyby v čase
Podobně druhý graf zobrazuje závislost rychlosti na čase a její chybu:
Obrázek 10 Horní část: srovnání exaktního a numerického řešení. Dolní část: vývoj chyby v čase
Přestože chyba postupně narůstá, dává Eulerova metoda pro několik prvních period
harmonického oscilátoru velice dobré výsledky. Oscilace numerické řešení stabilizují,
chyby se během jednoho kmitu částečně eliminují.
32
b. Verletova metoda
Nyní vycházíme ze schématu
𝑎(𝑡) = −𝜔2𝑥(𝑡),
𝑣(𝑡 + ℎ/2) = 𝑣(𝑡 − ℎ/2) + 𝑎(𝑡) ℎ,
𝑥(𝑡 + ℎ) = 𝑥(𝑡) + 𝑣(𝑡 + ℎ/2) ℎ,
přičemž
𝑣(𝑡0 − ℎ/2) = 𝑣(𝑡0) − 𝑎(𝑡0) ∙ ℎ/2 .
Počáteční podmínky, časový krok a konečný čas jsou stejné jako v případě Eulerovy
metody.
První graf zobrazuje závislost výchylky na čase:
Obrázek 11 Horní část: srovnání exaktního a numerického řešení. Dolní část: vývoj chyby v čase
33
Druhý graf zobrazuje závislost rychlosti na čase:
Obrázek 12 Horní část: srovnání exaktního a numerického řešení. Dolní část: vývoj chyby v čase
Chyba Verletovy metody je asi o dva řády menší než chyba metody Eulerovy.
Zdrojový kód programu je na stranách 49 až 51.
4.2.2 Pohyb planety v radiálním silovém poli
Pomocí Eulerovy metody a metody Verletovy (varianta leap – frog) byl numericky
simulován pohyb tělesa v radiálním gravitačním poli.
Analytické řešení problému
Nejdříve připomenu základní poznatky o analytickém řešení tohoto problému, viz
např. [11]. Z Newtonova gravitačního zákona lze odvodit, že hmotný bod se
v radiálním poli vždy pohybuje po kuželosečce, jejíž jedno ohnisko leží v místě
centrálního tělesa (mluvím o případu, kdy je centrální těleso mnohonásobně
hmotnější). Nejmenší úniková rychlost 𝑣𝑝 se nazývá parabolická. Je-li rychlost větší,
těleso opisuje hyperbolu, v opačném případě opisuje periodicky elipsu. Ze zákona
zachování energie tělesa lze ukázat:
𝐸 = 𝐸𝑃 + 𝐸𝐾 < 0 – řešením je vždy elipsa,
𝐸 = 𝐸𝑃 + 𝐸𝐾 ≥ 0 – řešením je hyperbola, v případě rovnosti parabola.
Parametry kuželosečky jsou jednoznačně dány celkovou energií 𝐸 a momentem
hybnosti 𝐿 tělesa.
34
Při vhodném natočení souřadnic je rovnice kuželosečky v polárních souřadnicích
(𝑟, 𝜑) dána vztahem
𝑟 =𝑝
1+𝜀 cos 𝜑 , (3)
kde
𝑝 ≡𝐿2
𝐺𝑀𝑚2 , 𝜀 ≡ √1 +
2𝐸𝐿2
(𝐺𝑀)2𝑚3 .
𝑀 a 𝑚 jsou po řadě hmotnosti centrálního a obíhajícího tělesa, 𝐺 je gravitační
konstanta. Konstanta 𝜀 se nazývá číselná excentricita, 𝑟 je vzdálenost od ohniska a 𝜑
úhel, který průvodič 𝑟 svírá s hlavní osou kuželosečky.
V modelu jsem volil počáteční rychlost tělesa kolmo ke spojnici počáteční polohy
tělesa s centrálním tělesem. V tomto případě leží tato spojnice na hlavní ose
kuželosečky.
Hodnoty hlavní poloosy 𝑎 a vedlejší poloosy 𝑏 elipsy lze určit z rovnic ([11], str. 120)
𝑝 =𝑏2
𝑎 , 𝜀 = √1 −
𝑏2
𝑎2 .
Numerické řešení problému
Působiště gravitační síly bylo umístěno do počátku kartézské soustavy. Vektory
počáteční polohy a rychlosti tělesa v čase 𝑡0 = 0 byly zvoleny ve směru os 𝑥 a 𝑦:
𝑟0 = (𝑥0, 0), �⃗�0 = (0, 𝑣0).
Síla působící na těleso je dána Newtonovým gravitačním zákonem
�⃗� = −𝐺𝑀𝑚
|𝑟|3∙ 𝑟 .
Tomu odpovídá zrychlení
𝐴(𝑟, 𝑡) = −𝐾𝑟
|𝑟|3 ,
kde 𝐾 = 𝐺𝑀. Pro výpočet byly v modelu zvoleny hodnoty 𝐾 = 1 a 𝑥0 = 1. Za těchto
podmínek platí pro parabolickou rychlost 𝑣𝑝 a kruhovou rychlost 𝑣𝑘:
𝑣𝑝 = √2𝐾
|𝑥0|= √2 , 𝑣𝑘 = √
𝐾
|𝑥0|= 1.
35
Jelikož MATLAB je tzv. vektorově orientovaný, je možné problém formulovat
od počátku vektorově (není tedy nutné a dokonce ani žádoucí zpracovávat rovnice ve
složkách).
a. Eulerova metoda
Vyjdeme z pořadí rovnic (ARVT), (strana 14)
�⃗�𝑖 = −𝐾𝑟𝑖
|𝑟𝑖|3
𝑟𝑖+1 = 𝑟𝑖 + �⃗�𝑖 ℎ
�⃗�𝑖+1 = �⃗�𝑖 + �⃗�𝑖 ℎ
𝑡𝑖+1 = 𝑡𝑖 + ℎ
Časový krok byl stanoven ℎ = 0,01.
Na ukázku uvádím tři grafické výstupy programu. V každém je numerické řešení,
získané Eulerovou metodou, současně porovnáno s přesným analytickým řešením (1)
pohybové rovnice. První graf byl vytvořen pro počáteční podmínky 𝑥0 = 1, 𝑣0 = 1.5,
což odpovídá hyperbolickému pohybu. Konečný čas výpočtu byl stanoven na 𝑇 = 2.
Obrázek 13 Pohyb tělesa v radiálním gravitačním poli. Numerické a exaktní řešení
Červená přerušovaná čára odpovídá analytickému řešení, modrá numerickému.
Jelikož intenzita síly se vzdáleností velice rychle klesá, nemá smysl zobrazovat
trajektorii pro výrazně delší čas než 𝑇 = 2 – těleso se pro delší časy prakticky
pohybuje po asymptotě k hyperbole.
36
Druhý graf byl vytvořen pro počáteční podmínky 𝑥0 = 1, 𝑣0 = 1, což odpovídá
kruhovému pohybu. Konečný čas výpočtu byl stanoven na 𝑇 = 20.
Obrázek 14 Pohyb tělesa v radiálním gravitačním poli. Numerické a exaktní řešení
Značení je stejné jako v předchozím grafu. Je vidět, že se chyba numerického řešení
kumuluje a rozdíl s exaktním řešením s časem stále narůstá.
Další graf zobrazuje srovnání řešení pomocí Eulerovy metody a exaktního řešení
v případě eliptického pohybu tělesa:
Obrázek 15 Pohyb tělesa v radiálním gravitačním poli. Numerické a exaktní řešení
Na tomto grafu je také vidět rys, typický pro většinu numerických metod. Těleso se
podle numerického řešení vzdaluje od ohniska a získává energii. To je ekvivalentní
postupnému navyšování kinetické energie tělesa. Odtud pochází i název jevu, tzv.
„nefyzikální ohřev“.
37
b. Verletova metoda
Použitá verze je Leap Frog (strana 20). Vycházíme z rekurentních vztahů:
�⃗�(𝑡) = −𝐾𝑟(𝑡)
|𝑟(𝑡)3| ,
�⃗�(𝑡 + ℎ/2) = �⃗�(𝑡 − ℎ/2) + �⃗�(𝑡) ∙ ℎ ,
𝑟(𝑡 + ℎ) = 𝑟(𝑡) + �⃗�(𝑡 + ℎ/2) ℎ .
Pro počáteční hodnotu rychlosti byla použita korekce
�⃗�(𝑡0 − ℎ/2) = �⃗�(𝑡0) − �⃗�(𝑡0) ∙ℎ
2 .
Stejně jako v případě Eulerovy metody byly vytvořeny dva grafy a do každého grafu
bylo zobrazeno také exaktní řešení.
První graf byl vytvořen pro počáteční podmínky 𝑥0 = 1, 𝑣0 = 1.5. Konečný čas
výpočtu 𝑇 = 2.
Obrázek 16 Pohyb tělesa v radiálním gravitačním poli. Numerické a exaktní řešení
38
Druhý graf byl vytvořen pro počáteční podmínky 𝑥0 = 1, 𝑣0 = 1. Konečný čas
výpočtu 𝑇 = 20.
Obrázek 17 Pohyb tělesa v radiálním gravitačním poli. Numerické a exaktní řešení
Následující graf srovnává řešení pomocí Verletovy metody s exaktním řešení
v případě eliptického pohybu tělesa.
Obrázek 18 Pohyb tělesa v radiálním gravitačním poli. Numerické a exaktní řešení
Ze srovnání obou metod je zřejmé, že Verletova je podstatně přesnější, nefyzikální
ohřev se téměř nevyskytuje.
Zdrojový kód programu je na stranách 52 až 54.
39
Závěr Práce je koncipována jako teoretický úvod do počítačového modelování. Jejím cílem
bylo na vybraných úlohách ukázat, jaké druhy problémů je možné řešit. Až na případ
„Brownova pohybu“ (kde se objevilo exponenciální rozdělení) by se všechny
problémy praktické části daly zahrnout do výuky na gymnáziích s matematicko-
fyzikálním zaměřením. Ostatně podobné numerické modely se objevují i v rámci
fyzikální olympiády [5].
U řešených problémů byl uveden stručně jejich teoretický základ, zdrojové kódy
v MATLABu byly navíc opatřeny relativně podrobným komentářem. Ačkoli se čtenář,
rozhodnutý modelovat vlastní problém, bez studia programu MATLAB nad rámec
této práce neobejde, může mu čtení kódů ulehčit cestu. Jak bylo v práci ukázáno, i
v běžném Excelu lze numericky řešit relativně komplikované fyzikální problémy.
Řešené ilustrativní problémy by měly také ukázat na dynamický aspekt Newtonova
vztahu 𝐹 = 𝑚𝑎, který spolu s počátečními podmínkami určuje celou trajektorii
pohybu tělesa v silovém poli. Většina studentů si význam tohoto vztahu jakožto
pohybové rovnice neuvědomuje, chápe jej jenom staticky jako pouhou úměru mezi
silou a zrychlením.
Na závěr pokládám za nutné ještě jednou připomenout, že program MATLAB není
volně dostupný. Je mi známo, že některá gymnázia ho mají, většina ale ne. V takovém
případě čtenáři doporučuji, kromě již zmiňovaného Excelu, především program
Octave (dostupný na webových stránkách [12]), který patří mezi povedené
alternativy MATLABu, ale na rozdíl od něj je zdarma. Jsou i jiné alternativy, např.
v úvodu publikace [5] je zmíněno několik dostupných demoverzí simulačního
programu Coach.
40
Seznam použitých zdrojů
[1] – HRACH, Rudolf. Počítačová fyzika I. Ústí nad Labem: PF UJEP, 2003
[2] – NEZBEDA, KOLAFA, KOTRLA. Úvod do počítačových simulací. Praha: Karolinum,
2003
[3] – https://cs.wikipedia.org/wiki/Probl%C3%A9m_t%C5%99%C3%AD_t%C4%9Bles
[4] – https://en.wikipedia.org/wiki/Stability_of_the_Solar_System
[5] – ŠEDIVÝ, Přemysl. Modelování fyzikálních dějů numerickými metodami.
(Dostupné na stránkách: http://fyzikalniolympiada.cz/studijni-texty)
[6] – https://cs.wikipedia.org/wiki/Buffonova_jehla
[7] – BELLOS, Alex. Alexova dobrodružství v zemi čísel. Dokořán, 2015
[8] – https://cs.wikipedia.org/wiki/Teorie_chaosu
[9] – FEYNMAN, LEIGHTON, SANDS. Feynmanovy přednášky z fyziky. FRAGMENT,
2002
[10] – BLAŽEK, Jiří. Metody matematické statistiky ve fyzice. Diplomová práce,
JCU České Budějovice, 2015.
(Dostupné na stránkách: https://wstag.jcu.cz/portal/studium/prohlizeni.html)
[11] – KVASNICA, HAVRÁNEK, LUKÁČ, SPRUŠIL. Mechanika. Praha: Academia, 1988
[12] – https://www.gnu.org/software/octave
41
Zdrojové kódy v MATLABu
1 function pi_aprox = pi_MC(N) 2 3 % pi_MC vypocet cisla pi metodou Monte Carlo 4 % N: celkovy pocet rozehravek dvojic (x,y) 5 % pi_aprox: aproximace cisla pi 6 % ctverec o strane 1 a ctvrtkruh o polomeru 2 7 8 % pocet "uspesnych" rozehravek 9 m = 0; 10 % nastaveni generatoru podle aktualniho casu11 rng('shuffle'); 12 for i = 1 : N13 x = rand;14 y = rand;15 % lezi bod o souradnicich [x,y] ve ctvrtkruhu?16 if sum(x^2+y^2) < 1 17 m = m+1;18 end19 end20 pi_aprox = 4*m/N;
42
1 function s = intMC(a,b,f,N) 2 3 % intMC integrace funkce f v mezich [a,b] metodou Monte Carlo 4 % a < b 5 % f ... ukazatel na funkci (@) 6 % N ... celkovy pocet rozehravek MC 7 % s ... numericka hodnota integralu 8 9 % implicitni hodnoty vstupnich promennych10 if nargin < 411 N = 100000;12 end13 if nargin < 314 f = @(x) sin(x); % integrovana funkce15 end16 if nargin < 217 b = 2*pi; % horni mez integrace18 end19 if ~nargin20 a = 0; % dolni mez integrace21 end22 23 % ohraniceni funkce obdelnikem [a,b,fMin,fMax]24 [~,fMin] = fminbnd(f,a,b); % fMin = min(f)25 g = @(x) -f(x); % g(x) = -f(x)26 [~,fMax] = fminbnd(g,a,b ); % fMax = -min(g) 27 fMax = -fMax;28 deltaX = b-a;29 deltaY = fMax-fMin;30 31 m = 0; % m = m(f>0) - m(f<0)32 for n = 1 : N33 c = rand(1,2);34 x = a + deltaX*c(1); % nahodne cislo z int. [a,b]35 % nahodne cislo z int. [fMin,fMax]36 y = fMin + deltaY*c(2); 37 fx = f(x);38 if y > 0 && y < fx % test pro kladne hodnoty f 39 m = m+1;40 elseif y < 0 && y > fx % test pro zaporne hodnoty f41 m = m-1;42 end43 end44 45 s = deltaX*deltaY*m/N;
43
1 function [d2,LL] = nahodna_prochazka(N) 2 3 % nahodna_prochazka 2D nahodny pohyb ve dvou kolmych smerech 4 % N: pocet kroku v rovine xy 5 % d2: vektor kvadratu vzdalenosti po n krocich, n = 1,2,...,N 6 % kroky o jednotkove velikosti s = 1, L = <s> = 1, a smeru ... 7 % ... v ose x nebo y 8 % L2: stredni kvadrat drahy jednoho kroku, L2 = <s^2> = 1 9 10 % teoreticka predpoved stredni hodnoty kvadratu vzdalenosti11 % od pocatku drahy po n krocich: <d^2> = n*L2 = n12 13 % implicitne zadany pocet kroku14 if ~nargin15 N = 100;16 end17 18 % parametry jednoho kroku: L = <s>, L2 = <s^2>19 L = 1;20 LL = L^2;21 22 % prealokace poli x,y (poloha po n krocich)23 x = zeros(1,N+1);24 y = zeros(1,N+1);25 26 rng('shuffle'); % nastaveni generatoru podle aktualniho27 % casu28 L2 = 2*L;29 for i = 2 : N+1 % prvni az N-ty krok od pocatku30 % 1. nahodne cislo - posun v ose x nebo y31 % 2. nahodne cislo - posun v kladnem nebo zapornem smeru32 % soucasne generovani dvou nahodnych cisel (0 nebo 1)33 rnd = randi([0,1],1,2); 34 if rnd(1) % posun v ose x35 x(i) = x(i-1) + L2*(rnd(2)-0.5); % posun v ose x: -L nebo +L36 y(i) = y(i-1); % v ose y bez posunu37 else % posun v ose y38 x(i) = x(i-1); % v ose x bez posunu39 y(i) = y(i-1) + L2*(rnd(2)-0.5); % posun v ose y: -L nebo +L40 end41 end42 d2 = x.^2+y.^2;43 44 if ~nargout45 % zobrazeni nahodne cesty46 figure;47 plot(x,y,'bo--');48 hold on
44
49 h(1) = plot(x(1),y(1),'o',...50 'MarkerFaceColor','k','MarkerEdgeColor','k');51 h(2) = plot(x(end),y(end),'o',...52 'MarkerFaceColor','r','MarkerEdgeColor','r');53 grid on;54 legend(h,'pocatek','konec','Location','best');55 axis equal;56 c = axis;57 axis(c+[-0.5,+0.5,-0.5,+0.5]);58 xlabel('x');59 ylabel('y');60 title('nahodna prochazka, [x,y]');61 % zobrazeni kvadratu nahodne vzdalenosti62 figure;63 kroky = 0 : N;64 h = plot(kroky,d2,'.',kroky,LL*kroky,'r--');65 set(h(1),'MarkerSize',10);66 grid on;67 xlabel('pocet kroku');68 ylabel('vzdalenost^2');69 legend('d^{2}','< d^{2}>','Location','best');70 title('nahodna prochazka, < d^{2}>');71 72 clear d2; % bez vystupu73 end
45
1 function [d2,LL] = Brownuv_pohyb(N) 2 3 % simulace Brownova pohybu v rovine xy 4 % kroky o nahodne velikosti s a nahodnem smeru fi 5 % <s> = L, <s^2> = L2 6 % simulace volne drahy a smeru pohybu 7 % N: pocet kroku v rovine xy 8 % d2: vektor kvadratu vzdalenosti po n krocich, n = 1,2,...,N 9 10 % implicitne zadany pocet kroku11 if ~nargin12 N = 100;13 end14 15 % exponencialni rozdeleni volne drahy s16 % hustota pravdepodobnosti: f(s) = 1/L*exp(-s/L)*ds17 % distribucni funkce: F(s) = 1 - exp(-s/L)18 % stredni draha: <s> = integral[s*f(s)*ds] = L19 % stredni kvadrat drahy: <s^2> = integral[s^2*f(s)*ds] = 2*L^2 = LL20 % stredni kvadrat vzdalenosti od pocatku drahy po n krocich:21 % <d^2> = n*2*L^222 L = 1; % L = <s>23 LL = 2*L^2; % LL = <s^2>24 25 % prealokace poli x,y (poloha po n krocich)26 x = zeros(1,N+1);27 y = zeros(1,N+1);28 pi2 = 2*pi;29 30 for n = 2 : N+1 % prvni az N-ty krok od pocatku31 % 1. nahodne cislo - generovani volne drahy s32 % 2. nahodne cislo - generovani uhlu fi33 rnd = rand(1,2);34 s = -L*log(1-rnd(1));35 fi = pi2*rnd(2);36 x(n) = x(n-1)+s*cos(fi);37 y(n) = y(n-1)+s*sin(fi);38 end39 % d2(n) ... kvadrat vzdalenosti od pocatku po n krocich, n = 1,2,...,N40 d2 = x.^2+y.^2;41 42 if ~nargout43 % zobrazeni nahodne cesty44 figure;45 plot(x,y,'b.--','MarkerSize',12);46 hold on47 h(1) = plot(x(1),y(1),...48 'o','MarkerFaceColor','k','MarkerEdgeColor','k');
46
49 h(2) = plot(x(end),y(end),...50 'o','MarkerFaceColor','r','MarkerEdgeColor','r');51 grid on;52 legend(h,'pocatek','konec','Location','best');53 axis equal;54 c = axis;55 axis(c+[-0.5,+0.5,-0.5,+0.5]);56 xlabel('x');57 ylabel('y');58 title('Brownuv pohyb, [x,y]');59 % zobrazeni kvadratu nahodne vzdalenosti a porovnani se60 % stredni hodnotou: <d^2> = (pocet kroku)*<s^2>,61 % <d2(n)> = n*L2, n = 1,2,...,N62 figure;63 kroky = 0 : N;64 h = plot(kroky,d2,'.',kroky,LL*kroky,'r--');65 set(h(1),'MarkerSize',10); 66 grid on;67 xlabel('pocet kroku');68 ylabel('d^2');69 legend('d^{2}','< d^{2}>','Location','NorthWest');70 title('Brownuv pohyb, < d^2>');71 72 clear d2; % bez vystupu73 end
47
1 function test_nahodny_pohyb(K,N) 2 3 % test_nahodny_pohyb <vzdalenost^2> = 4 % = (pocet kroku)*<(delka kroku)^2> ? 5 % K: pocet pokusu, ktere se streduji 6 % N: pocek kroku v jednom pokusu 7 8 if ~exist('K','var') 9 K = 1000;10 end11 if ~exist('N','var')12 N = 10;13 end14 15 % testovana varianta nahodneho pohybu16 f = @nahodna_prochazka; % nahodna_prochazka, Brownuv_pohyb17 popis = 'nahodna prochazka'; % nahodna prochazka, Brownuv pohyb18 [~,LL] = f(0); % LL = <s^2>19 20 kroky = 0 : N;21 d2Stredni = zeros(1,N+1);22 23 for k = 1 : K24 d2Stredni = d2Stredni + f(N);25 end26 d2Stredni = d2Stredni/K;27 28 figure;29 plot(kroky,d2Stredni,'*',kroky,LL*kroky,'r:');30 grid on;31 xlabel('kroky');32 ylabel('<vzdalenost>^{2}');33 title([popis, ', < d^{2}>, pocet pokusu: ',int2str(K)]);34 legend('simulace','teorie','Location','NorthWest');35
48
1 function oscilator(x0,v0) 2 3 % oscilator reseni rovnice d2x/dt2 = -omega^2*x 4 % x0,v0: poloha a rychlost v okamziku t = 0 5 % funkce volana bez vstupnich parametru => implicitni hodnoty 6 % 7 % soustava rovnic 1. radu a poc. podminky: 8 % dx/dt = v 9 % dv/dt = a = -omega^2*x 10 % x(0) = x0, v(0) = v0 11 12 % implicitni vstupni parametry 13 if nargin == 0 14 x0 = 1; 15 v0 = 0; 16 end 17 18 % uhlova rychlost a perioda kmitu 19 omega = 1; 20 T = 2*pi/omega; 21 omega2 = omega^2; 22 23 tKon = 20*T; % konecny cas integrace 24 dt = 0.01; % % krok integrace 25 t = 0 : dt : tKon; 26 lt = length(t); 27 28 29 % numericka integrace: Euler 30 % v(t+dt) = v(t) + a(t)*dt 31 % x(t+dt) = x(t) + v(t)*dt 32 % prealokace poli x(t), v(t) 33 xEuler = zeros(1,lt); 34 vEuler = zeros(1,lt); 35 % pocatecni podminky 36 xEuler(1) = x0; 37 vEuler(1) = v0; 38 for i = 2 : lt 39 vEuler(i) = vEuler(i-1) - omega2*xEuler(i-1)*dt; 40 xEuler(i) = xEuler(i-1) + vEuler(i-1)*dt; 41 end 42 43 % numericka integrace: Verlet, verze leap-frog 44 % v(t+dt/2) = v(t-dt/2) + a(t)*dt 45 % x(t+dt) = x(t) + v(t+dt/2)*dt 46 % v(t0-dt/2) = v(t0) - a(t0)*dt/2 47 % prealokace poli x(t), v(t) 48 x = zeros(1,lt);
49
49 v = zeros(1,lt); 50 % pocatecni podminky 51 xVerlet(1) = x0; 52 vVerlet(1) = v0+omega2*x0*dt/2; 53 for i = 2 : lt 54 vVerlet(i) = vVerlet(i-1) - omega2*xVerlet(i-1)*dt; 55 xVerlet(i) = xVerlet(i-1) + vVerlet(i)*dt; 56 end 57 58 % exaktni reseni 59 % x = A*cos(omega*t+fi) 60 % v = -A*omega*sin(omega*t+fi) 61 % A = sqrt[x0^2+(v0/omega)^2], tg(fi) = -v0/(omega*x0) 62 A = sqrt(x0^2+(v0/omega)^2); 63 fi = atan2(-v0/omega,x0); 64 xExakt = A*cos(omega*t+fi); 65 vExakt = -A*omega*sin(omega*t+fi); 66 67 titulek = ['Eulerova metoda, dt = ',num2str(dt)]; 68 grafy(t,xEuler,vEuler,xExakt,vExakt,titulek); 69 titulek = ['Verletova metoda, dt = ',num2str(dt)]; 70 grafy(t,xVerlet,vVerlet,xExakt,vExakt,titulek); 71 72 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 73 74 function grafy(t,x,v,xExakt,vExakt,titulek) 75 76 % grafy x(t), x(t)-x_exakt(t) 77 figure; 78 subplot(2,1,1); 79 h = plot(t,x,'b',t,xExakt,'r--'); 80 set(h(2),'LineWidth',2); 81 % legend('numericke reseni','exaktni reseni','Location','best'); 82 grid on; 83 ylabel('x'); 84 title([titulek,', x']); 85 subplot(2,1,2); 86 plot(t,x-xExakt); 87 grid on; 88 xlabel('t'); 89 ylabel('x_{num} -- x_{exakt}'); 90 title([titulek, ', \Deltax']); 91 92 % grafy v(t), v(t)-v_exakt(t) 93 figure; 94 subplot(2,1,1); 95 h = plot(t,v,'b',t,vExakt,'r--'); 96 set(h(2),'LineWidth',2);
50
97 % legend('numericke reseni','exaktni reseni','Location','best'); 98 grid on; 99 ylabel('v');100 title([titulek,', v']);101 subplot(2,1,2);102 plot(t,v-vExakt);103 grid on;104 xlabel('t');105 ylabel('v_{num} -- v_{exakt}');106 title([titulek, ', \Deltav']);
51
1 function planetarni_pohyb(x0,vy0) 2 3 % planetarni_pohyb pohyb v radialnim silovem poli 4 % resena pohybova rovnice: d2r/dt^2 = -K*r/|r|^3 5 % gravitacni pole: K = G*M 6 % pohybova rovnice jako soustava rovnic 1. radu: 7 % dv/dt = -K*r/|r|^3 8 % dr/dt = v 9 % r: vektor poloh, r(t) = [x(t); y(t)] 10 % v: vektor rychlosti, v(t) = [vx(t); vy(t)] 11 % pocatecni poloha a rychlost: r0 = [x0,0], v0 = [0,vy0] 12 13 K = 1; 14 if ~nargin 15 x0 = 1; 16 % kruhovy pohyb: vy0 = sqrt(K/abs(x0)) 17 % parabolicky pohyb: vy0 = sqrt(2*K/abs(x0)) 18 vy0 = 1; 19 end 20 21 tEnd = 6; % konecny cas integrace 22 dt = 0.01; 23 t = 0 : dt : tEnd; 24 lt = length(t); 25 26 % exaktni reseni, r = p / [1+e*cos(fi)] 27 % 28 % parametry kuzelosecky ze zakonu zachovani 29 % plosne rychlosti sigma (resp. momentu hybnosti L = 2m*sigma) 30 % a energie E 31 sigma2 = x0*vy0; % sigma2 = 2*sigma 32 Em = vy0^2/2 - K/abs(x0); % Em = E/m; 33 p = sigma2^2/K; 34 e = sqrt(1 + 2*Em*sigma2^2/K^2); 35 36 % numericka integrace: Euler 37 % v(t+dt) = v(t) + a(t)*dt 38 % r(t+dt) = r(t) + v(t)*dt 39 vEuler = zeros(2,lt); 40 rEuler = zeros(2,lt); 41 vEuler(:,1) = [0;vy0]; 42 rEuler(:,1) = [x0;0]; 43 for j = 2 : lt 44 v = vEuler(:,j-1); 45 r = rEuler(:,j-1); 46 a = -K*r/((r'*r)^(3/2)); 47 vEuler(:,j) = v + a*dt; 48 rEuler(:,j) = r + v*dt;
52
49 end 50 51 % numericka integrace: Verlet, verze leap-frog 52 % v(t+dt/2) = v(t-dt/2) + a(t)*dt 53 % r(t+dt) = r(t) + v(t+dt/2)*dt 54 % v(t0-dt/2) = v(t0) - a(t0)*dt/2 55 vVerlet = zeros(2,lt); 56 rVerlet = zeros(2,lt); 57 v0 = [0;vy0]; 58 r0 = [x0;0]; 59 a0 = -K*r0/((r0'*r0)^(3/2)); 60 vVerlet(:,1) = v0-a0*dt/2; 61 rVerlet(:,1) = r0; 62 for j = 2 : lt 63 v = vVerlet(:,j-1); 64 r = rVerlet(:,j-1); 65 a = -K*r/((r'*r)^(3/2)); 66 v = v + a*dt; 67 vVerlet(:,j) = v; 68 rVerlet(:,j) = r + v*dt; 69 end 70 71 % exaktni tvar trajektorie 72 if Em < -8e-16 % elipsa, 8e-16 ~ 73 % numericka nula 74 kuzelosecka = 'elipsa'; 75 % rychlost mensi nez pro kruhovy pohyb => afelium, jinak perihelium 76 if abs(vy0) < sqrt(K/abs(x0)) 77 e = -e; % afelium v bode [x0,0] 78 end 79 fiMax = pi; % max. hodnota polarniho uhlu 80 elseif Em > 8e-16 % hyperbola, 8e-16 ~ 81 % numericka nula 82 kuzelosecka = 'hyperbola'; 83 fiMax = atan2(rEuler(2,end),rEuler(1,end)); % rozevreni hyperboly 84 else 85 kuzelosecka = 'parabola'; 86 fiMax = atan2(rEuler(2,end),rEuler(1,end)); % rozevreni paraboly 87 end 88 fi = -fiMax : fiMax/100 : fiMax; 89 r = p./(1+e*cos(fi)); 90 rExakt = [r.*cos(fi);r.*sin(fi)]; % rExakt = [x(fi);y(fi)] 91 92 titulek = ['Eulerova metoda, dt = ',num2str(dt),', ',kuzelosecka]; 93 grafy(rEuler,rExakt,titulek); 94 titulek = ['Verletova metoda, dt = ',num2str(dt),', ',kuzelosecka]; 95 grafy(rVerlet,rExakt,titulek); 96
53
97 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 98 99 function grafy(r,rExakt,titulek)100 figure;101 hold on;102 plot(r(1,:),r(2,:),'b','LineWidth',2);103 h(1) = plot(r(1,1),r(2,1),'ko','MarkerfaceColor','k','MarkerSize',8);104 h(2) = plot(r(1,end),r(2,end),'go','MarkerfaceColor',...105 'g','MarkerSize',8);106 h(3) = plot(0,0,'r*','MarkerSize',8,'MarkerFaceColor','r');107 plot(rExakt(1,:),rExakt(2,:),'r--','LineWidth',2);108 legend(h,'zacatek','konec','ohnisko','Location','best');109 % rozsireni rozsahu os 110 c = axis;111 dx = c(2)-c(1);112 dy = c(4)-c(3);113 c = c + [-dx/20, dx/20, -dy/20, dy/20];114 axis(c); axis equal;115 grid on;116 xlabel('x');117 ylabel('y');118 title(titulek);119
54