Pavel Stránský
Contact: Contact
Česky English
Last updated: 15.3.2019

Použití PC ve fyzice

Akademický rok 2018-2019

Cíl cvičení

Účelem cvičení je pohrát si s jednoduchými fyzikálními problémy a vyzkoušet si různé způsoby jejich řešení (i triviální řešení je řešení) a zobrazení výsledků. Většina příkladů bude demonstrována v populárním programovacím jazyce Python, ale dojde i na základy psaní textů v LaTeXu, software Mathematica nebo na kancelářský Excel. Další informace k předmětu jsou na stránce SISu.

Ve cvičení nebude probíhat systematická výuka žádného programovacího jazyka ani numerických algoritmů. K tomu jsou určeny specializované přednášky na oboru fyzika, například

NEVF523 - Numerické metody počítačové fyziky
NPRF050 - Programování v Pythonu
NEVF107 - C++ pro fyziky
NPRF020 - Úvod do programování v prostředí MATLAB, Octave a Scilab
NPRF006 - Pokročilé metody programování
NTMF048 - Použití systémů počítačové algebry ve fyzice
NJSF081 - Software a zpracování dat ve fyzice částic

a nepřeberně přednášek na oboru informatika.

Zápočet

Tři možné cesty, jak získat zápočet (seřazeno od té nejupřednostňovanější):

1. Naprogramujete řešení nějakého jednoduchého fyzikálního problému (o složitosti srovnatelné s příklady procvičenými během hodin), který si zvolíte podle svých vlastních zájmů a zálib. Hotový program mi představíte a vysvětlíte buď na posledním cvičení semestru, nebo kdykoliv po domluvě. Program by neměl být totožný s těmi, za které jste (byli, budete) klasifikováni v jiných předmětech. Doporučuji vám, abyste se mnou zadání konzultovali, než se pustíte do práce.
2. Pokud vás nic, ale opravdu nic nenapadne, zadám na posledním cvičení semestru jednoduchý problém vycházející z procvičených příkladů, který během dvouhodinovky vyřešíte a předvedete.
3. Pokud se nebudete moci dostavit v zápočtovém týdnu na cvičení (nebo se dostavíte, ale zápočtovou úlohu se vám nepodaří vyřešit), kontaktujete mě a já vám zadám úlohu na doma. Až ji naprogramujete, řešení mi předvedete (nejpozději do poloviny září 2019).

Ačkoliv převážná část předmětu bude demonstrována příklady v programovacím jazyce Python 3.7, rozhodně není nutné, abyste zápočtový program psali v tomto jazyce. Zvolte si sami, jaký jazyk či vývojové prostředí jsou vám sympatické.

Literatura

Na webu existuje nepřeberné množství tutoriálů a návodů k Pythonu a jeho knihovnám, které vám pomůžou s konkrétními problémy. Zde uvádím spíš monografie pro pokročilejší, v nichž naleznete seriózní příklady využití tohoto programovacího jazyka ve vědě.

[1]P.R. Turner, T. Arildsen, K. Kavanagh, Applied Scientific Computing With Python (Springer 2018)
[2]R. Johansson, Numerical Python: Scientific Computing and Data Science Applications with Numpy, SciPy and Matplotlib (Springer 2019)
[3]S. Nagar, Introduction to Python for Engineers and Scientists (Springer 2018)
[4]S. Lynch, Dynamical Systems with Applications using Python (Springer 2018)
[5]B.J. Korites, Python Graphics: A Reference for Creating 2D and 3D images (Springer 2018)

Poznámky a zdrojové kódy

(Pozor: řešení uvedená v přiložených kódech zdaleka nejsou jediná možná a mohou obsahovat chyby. Vždy dejte na vlastní hlavu.)

1. cvičení

Stíhací křivka

Křivka, po které se pohybuje pes, když se v každém okamžiku pohybuje směrem k myslivci. Předpokládáme, že velikost rychlosti psa i myslivce jsou konstantní.

Zatímco analytické řešení je celkem zdlouhavé a lze ho provést pouze v případě, že se myslivec pohybuje po přímce (řešení najdete například v monografii Viktor Trkal, Mechanika hmotných bodů a tuhého tělesa, ČSAV 1956, str. 279), numerické řešení je jednoduché (a to i v případě vrávorajícího myslivce).

Objekt Turtle v Pythonu

Objekt Turtle je kurzor, který můžete jednoduchými příkazy posouvat po obrazovce a vykreslovat jím křivky.

Referenční příručka k objektu Turtle: https://docs.python.org/3/library/turtle.html.

Zdrojový kód naprogramované stíhací křivky: StihaciKrivka.py.

Vyzkoušejte si: 1. Různé velikosti časového kroku. Čím je krok kratší, tím získáme přesnější křivku, ale výpočet trvá déle.
2. Myslivec chodí po složitějších křivkách (kruh, sinusovka).
3. Rychlost psa je menší než rychlost myslivce.

2. cvičení

Objekty a obsluha událostí v Pythonu

Stíhací křivka naprogramovaná objektově, přičemž 1) pohyb myslivce lze ovládat kurzorovými šipkami a 2) program lze rozšířit i pro více psů zároveň.

Zdrojový kód: StihaciKrivkaO.py.

Vyzkoušejte si: Více psů na přímce a na kružnici (jako příklad poslouží funkce Primka(nPes, vMyslivec, vPes, dt) a Kruznice(nPes, vMyslivec, vPes, dt), kde nPes je počet psů). Sledujte, jak se vyvíjí "obalová křivka". Pozor, pro velké množství psů a krátký časový krok dt může být výpočet velmi pomalý. Mějte trpělivost.

3. cvičení

Zrychlení psa

Směr rychlosti psa se mění, takže pes se pohybuje se zrychlením. Velikost rychlosti psa se nemění, takže zrychlení je "dostředivé", kolmé v každém okamžiku na rychlost. Zrychlení psa budeme počítat přímo ve funkci Pes.Krok.

Knihovna matplotlib a zobrazení grafů v Pythonu

Zrychlení zobrazíme v grafu pomocí knihovny matplotlib. Zrychlení se bude zobrazovat v reálném čase. Kladné (záporné) znaménko zrychlení značí, že pes zatáčí vlevo (vpravo).

Zdrojový kód: StihaciKrivkaZrychleni.py. Oproti předchozím kódům počítáme s úhlovou proměnnou v radiánech, čehož se docílí voláním metody radians() třídy Turtle. Je nutné upravit všechny části kódu, ve kterých jsme doposud uvažovali úhly ve stupních (například při zatáčení myslivce).

Pozor! Knihovna matplotlib není s instalací Pythonu nainstalována automaticky. K jejímu doinstalování spusťte na svých počítačích v adresáři s Pythonem verze, kterou používáte, příkaz python -m pip install matplotlib.

Omezení velikosti zrychlení psa

Pes má konečnou sílu nebo se pohybuje po povrchu, který klouže. Jak se změní stíhací křivka, pokud zrychlení psa nemůže překročit nějakou maximální velikost?

Zdrojový kód: StihaciKrivkaZrychleniLimit.py.

Vyzkoušejte si: Pokud je aMax velmi malé (představte si myslivce a psa na zamrzlém rybníce), pes myslivce jdoucího rovně nedoběhne, ani když se sám pohybuje výrazně rychleji (velká rychlost psa je pak spíš na překážku). Nalezněte takovou kombinaci parametrů.
Zobrazení okamžitého zrychlení

Zrychlení můžeme zobrazit také pomocí úseček přímo do okna se želvičkami. Zdrojový kód: StihaciKrivkaZrychleniLimitN.py.

4. cvičení

Funkce sinus jako řešení diferenciální rovnice

Jedna z možností, jak vykreslit funkci sinus, je řešením pohybové rovnice pro harmonický oscilátor s odpovídajícími počátečními podmínkami. Nejtriviálnější explicitní Eulerova metoda integrace diferenciální rovnice (funkce SinusEuler) dává přesný výsledek pouze při použití velmi krátkého kroku. Je to metoda prvního řádu, a tak k desetinásobnému zlepšení přesnosti (jedna platná cifra navíc) potřebujeme desetkrát menší krok. Vylepšení Eulerovy metody spočívají v lepším odhadu směru, ve kterém děláme krok (funkce SinusEuler2, což je metoda 2. řádu). Jednokrokové explicitní metody se obecně nazývají Runge-Kuttovy metody (RK) a nejčastěji se používají RK 4. řádu.

Další třídou metod jsou symplektické metody, které jsou navržené pro řešení pohybových rovnic konzervativních systémů. Jejich výhodou je to, že s velkou přesností zachovávají energii (zatímco při použití jiných metod energie systému roste). Nejznámější symplektická metoda je Verletův algoritmus, který vychází z Eulerovy metody 2. řádu (funkce SinusVerlet). Lze však jednoduchým zásahem docílit, aby i Eulerova metoda 1. řádu byla symplektickým algoritmem (funkce SinusEuler1a a SinusEuler1b).

Zdrojový kód: Sinus.py.

Využití knihovny scipy

Knihovna scipy Pythonu obsahuje dvě možnosti řešení diferenciálních rovnic: integrate.odeint (LSODA řešitel knihovny ODEPACK, který podle typu rovnice volí Adamsovu prediktor-korektor metodu nebo BDF metodu) a integrate.ode (více možných řešitelů včetně RK metod; řešitele lze explicitně vybrat). Ve zdrojovém kódu jsou uvedeny příklady obou dvou postupů (funkce SinusOdeint a SinusOde).

Vyzkoušejte si: 1. Porovnejte si přesnost všech metod. Doporučuji volit parametry dx=0.01, xMax=100. Pro metody vyšších řádů zvolte krok větší.
2. Přesvědčte se, že u algoritmů 1. řádu chyba opravdu závisí přímo úměrně na velikosti kroku, zatímco u algoritmů vyšších řádů klesá se zmenšujícím se krokem rychleji. Zkuste odhadnout řád metod knihovny scipy.