DYNAMICKÉ MODELOVÁNÍ V PROGRAMU GNU OCTAVE Lukáš Richterek Katedra experimenta´lnı´ fyziky PrˇF UP Olomouc 2
0,3
1,5
0,2
1
v/cm⋅s-1
0,1
0,5
0
0 –0,1
–0,5
–0,2
–1
–0,3
–1,5
–0,4 0
20
40
60
80
100 t/s
120
140
160
180
–2 –2 –1,5 –1 –0,5 0 0,5 1 1,5 2
Poslednı´ u´pravy: 18. za´rˇ´ı 2007
Obsah
´ vod U
5
1
Program GNU Octave 1.1 GNU a GPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Program GNU Octave . . . . . . . . . . . . . . . . . . . . . . . 1.3 Procˇ (ne)pouzˇ´ıvat GNU Octave . . . . . . . . . . . . . . . . . .
6 6 8 9
2
Prvnı´ kroky s programem 2.1 Prˇ´ıkazovy´ rˇa´dek a termina´l . 2.2 Za´kladnı´ funkce a prˇ´ıkazy . 2.3 Neˇktere´ matematicke´ funkce 2.4 Pra´ce se soubory . . . . . . 2.5 Kreslı´me obra´zky . . . . . .
. . . . .
11 11 13 16 19 23
3
Pokrocˇilejsˇ´ı funkce 3.1 Numericke´ rˇesˇenı´ algebraicky´ch rovnic . . . . . . . . . . . . . 3.2 Numericke´ rˇesˇenı´ diferencia´lnı´ch rovnic . . . . . . . . . . . . .
37 37 44
4
Prˇ´ıklady jednoduchy´ch dynamicky´ch modelu˚ 4.1 Modely vyuzˇ´ıvajı´cı´ Eulerovu metodu . . . . . . . . . . . . . . 4.2 Modely vyuzˇ´ıvajı´cı´ Rungovy-Kuttovy metody . . . . . . . . . . 4.3 Modely vyuzˇ´ıvajı´cı´ funkce lsode . . . . . . . . . . . . . . . .
51 51 58 68
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Literatura
72
Seznam prˇ´ıkazu˚ pouzˇity´ch v textu
74
3
Úvod
Rˇesˇenı´ fyzika´lnı´ u´lohy ma´ obvykle dveˇ samostatne´ cˇa´sti – obecnou a numerickou. V obecne´ cˇa´sti sestavı´me na za´kladeˇ vhodny´ch fyzika´lnı´ch za´konu˚ potrˇebne´ rovnice a z nich matematicky´mi u´pravami dojdeme ke vztahu˚m, ktere´ vyjadrˇujı´ hledane´ velicˇiny pomocı´ velicˇin dany´ch a ru˚zny´ch konstant. U jednodusˇsˇ´ıch u´loh pak v numericke´ cˇa´sti do teˇchto vztahu˚ dosadı´me cˇ´ıselne´ hodnoty dany´ch velicˇin a konstant a zı´ska´me cˇ´ıselne´ hodnoty hledany´ch velicˇin, ktere´ doplnı´me prˇ´ıslusˇny´mi jednotkami, u slozˇiteˇjsˇ´ıch neˇkdy prova´dı´me rozmeˇrovou zkousˇku. V praxi se vsˇak cˇasto setka´va´me se zda´nliveˇ jednoduchy´mi u´lohami, jejichzˇ rˇesˇenı´ vede k transcendentnı´m nebo diferencia´lnı´m rovnicı´m, jezˇ bud’ neumı´me rˇesˇit elementa´rnı´mi prostrˇedky (analyticky), nebo je toto rˇesˇenı´ – zejme´na na u´rovni strˇednı´ sˇkoly – velmi obtı´zˇne´. Takove´ u´lohy pak musı´me rˇesˇit prˇiblizˇny´mi numericky´mi metodami. Dnes, v dobeˇ sˇiroke´ho rozsˇ´ırˇenı´ osobnı´ch pocˇ´ıtacˇu˚ a programovatelny´ch kalkula´toru˚ a bohate´ nabı´dky vyuzˇitelne´ho software, se otevı´rajı´ mozˇnosti pro vyuzˇitı´ teˇchto metod prakticky vsˇem za´jemcu˚m. Problematika numericke´ho rˇesˇenı´ fyzika´lnı´ch u´loh na u´rovni strˇednı´ sˇkoly nenı´ zcela nova´. Tento text proto navazuje na materia´ly [12, 18, 19] vyuzˇ´ıvajı´cı´ cˇesky´ program FAMULUS, ktery´ si v minuly´ch letech zı´skal relativneˇ velkou popularitu na sˇkola´ch. Jeho vazba na operacˇnı´ syste´m MS DOS a hlavneˇ rˇada programu˚ podobne´ho zameˇrˇenı´ vedly k tomu, zˇe jizˇ nenı´ da´le vyvı´jen, i kdyzˇ za´jemci si jej sta´le mohou sta´hnout a nainstalovat naprˇ. z adresy http://kdf.mff.cuni.cz/veletrh/sbornik/software/software.html. Cı´lem toho textu je nabı´dnout jednu z mozˇny´ch volneˇ dostupny´ch alternativ tohoto programu, konkre´tneˇ GNU Octave (domovska´ stra´nka http://www.octave.org/). Vzhledem k omezene´mu rozsahu zde nemu˚zˇeme nahradit podrobny´ uzˇivatelsky´ manua´l k programu, namı´sto systematicke´ho vy´kladu se s nı´m budeme seznamovat prostrˇednictvı´m konkre´tnı´ch prˇ´ıkladu˚. Zameˇrˇ´ıme se na za´kladnı´ prˇehled zahrnujı´cı´ nejdu˚lezˇiteˇjsˇ´ı vlastnosti programu, jeho vy´hody a prˇ´ıpadne´ nevy´hody (na veˇtsˇinu z nich a mozˇna´ i na dalsˇ´ı prˇijdou jisteˇ uzˇivatele´ sami) a na konkre´tnı´ch u´loha´ch si uka´zˇeme neˇkolik mozˇnostı´ rˇesˇenı´ transcendentnı´ch i jednoduchy´ch diferencia´lnı´ch rovnic. Vı´ce u´loh spojeny´ch veˇtsˇinou s fyzika´lnı´ olympia´dou najdou za´jemci v diplomove´ pra´ci [9].
5
Část 1 Program GNU Octave Jak napovı´da´ sa´m na´zev programu, je GNU Octave soucˇa´stı´ projektu GNU (http://www.gnu.cz/), ktery´ patrˇ´ı k symbolu˚m svobodne´ho software. Zahrnuje celou sˇka´lu programu˚ s ru˚zny´m vyuzˇitı´m. Prˇipomenˇme nejprve za´kladnı´ principy projektu a s nı´m spojene´ licencˇnı´ podmı´nky, ktere´ se vztahujı´ i na software GNU Octave.
1.1
GNU a GPL
1.1.1
Projekt GNU
Projekt GNU byl zalozˇen v roce 1984 s cı´lem vytvorˇit klon operacˇnı´ho syste´mu UNIX, ktery´ by byl sˇ´ırˇen jako svobodny´ software (angl. free software). Odtud pocha´zı´ i na´zev – GNU je rekurzivnı´ akronym pro „GNU’s Not UNIX“ a vyslovuje se [gnu˚]. V na´vaznosti na tento projekt byla v roce 1985 zalozˇena Nadace pro svobodny´ software (Free Software Foundation) s cı´lem podporovat pra´va uzˇivatelu˚ pocˇ´ıtacˇu˚ pouzˇ´ıvat, studovat, kopı´rovat, modifikovat a redistribuovat pocˇ´ıtacˇove´ programy. Nadace podporuje Obr. 1.1: Logo GNU vy´voj svobodne´ho softwaru, jmenoviteˇ pak operacˇprojektu nı´ho syste´mu GNU. Dnes jsou hojneˇ pouzˇ´ıva´ny ru˚zne´ varianty operacˇnı´ho syste´mu GNU s kernelem Linux; acˇkoliv se teˇmto syste´mu˚m cˇasto rˇ´ıka´ Linux, prˇesneˇjsˇ´ı pojmenova´nı´ pro neˇ je GNU/Linux. Za´kladem filosofie projektu GNU je prˇesveˇdcˇenı´, zˇe svobodny´ software je za´lezˇitost svobody: lide´ by meˇli mı´t svobodu vyuzˇ´ıvat software vsˇemi zpu˚soby, ktere´ prˇina´sˇejı´ neˇjaky´ spolecˇensky´ uzˇitek. Software se lisˇ´ı od hmotny´ch objektu˚ (zˇidle, sendvicˇe nebo benzı´nu) v tom, zˇe mu˚zˇe by´t mnohem snadneˇji kopı´rova´n a modifikova´n a uzˇivatelu˚m se da´va´ mozˇnost Obr. 1.2: Richard – u programu˚ patrˇ´ıcı´ch do GNU projektu – tuto vy´Matthew Stallman hodu maxima´lneˇ vyuzˇ´ıt. Zakladatelem a u´strˇednı´ po(pr ˇ evzato z [1]) stavou hnutı´ je Richard Matthew Stallman (obr. 1.2, osobnı´ stra´nka http://http://www.stallman.org/); pu˚vodneˇ absolvent ba-
6
kala´rˇske´ho studia fyziky na Harvardoveˇ univerziteˇ je zna´m prˇedevsˇ´ım jako autor editoru GNU Emacs a prˇekladacˇe gcc. FSF/UNESCO adresa´rˇ svobodne´ho softwaru (FSF/UNESCO Free Software Directory, http://directory.fsf.org/) dnes zahrnuje vı´ce nezˇ 4000 balı´cˇku˚ svobodne´ho softwaru poskytuje. Pro podporu sˇ´ırˇenı´ svobodne´ho softwaru, GNU projekty i non-GNU projekty, poskytuje FSF FTP servery (ftp://ftp.gnu.org/) ktere´ jsou zrcadleny po cele´m sveˇteˇ. Pro vy´voja´rˇe mnoha GNU i non-GNU projektu˚ poskytuje Free Software Foundation CVS server Savannah (http://savannah.gnu.org/). 1.1.2
GPL – General Public Licence
Na vsˇechny softwarove´ balı´cˇky zarˇazene´ do projektu GNU (vcˇetneˇ programu GNU Octave) se vztahuje vsˇeobecna´ verˇejna´ licence GNU (v origina´le GNU General Public Licence) oznacˇovana´ nejcˇasteˇji zkratkou GNU GPL[6] poprˇ´ıpadeˇ neˇktera´ z jejı´ch slabsˇ´ıch verzı´ (naprˇ. GNU LGPL). Podle svy´ch principu˚ a v kontrastu s beˇzˇneˇ zna´my´m copyrightem by´va´ tato licence oznacˇova´na jako copyleft. Jejı´m cı´lem je zarucˇit: • svobodu ke sdı´lenı´ a u´prava´m svobodne´ho softwaru; • pra´vo spousˇteˇt program za jaky´mkoliv u´cˇelem; • pra´vo studovat, jak program pracuje, a prˇizpu˚sobit ho svy´m potrˇeba´m (prˇedpokladem k tomu je prˇ´ıstup ke zdrojove´mu ko´du, nejen k k programu samotne´mu); • pra´vo redistribuovat kopie dle svobodne´ vu˚le; • pra´vo vylepsˇovat program a zverˇejnˇovat zlepsˇenı´, aby z nich mohla mı´t prospeˇch cela´ komunita (prˇedpokladem je opeˇt prˇ´ıstup ke zdrojove´mu ko´du). V tomto smyslu je svobodny´ (free) software takovy´, k neˇmuzˇ je k dispozici take´ zdrojovy´ ko´d, spolu s pra´vem tento software pouzˇ´ıvat, modifikovat a distribuovat. Naprosta´ veˇtsˇina svobodne´ho software je zdarma, acˇkoliv to podle licence nenı´ podmı´nkou. Svobodny´ software neznamena´ nekomercˇnı´, komercˇnı´ vy´voj svobodne´ho software nenı´ nicˇ´ım neobvykly´m. Za zı´ska´nı´ kopiı´ svobodne´ho software mu˚zˇete platit, nebo je obdrzˇet zdarma, ovsˇem bez ohledu na zpu˚sob, jak jste je zı´skali, ma´te vzˇdy svobodu kopı´rovat a meˇnit software, dokonce proda´vat nebo darovat jeho kopie nebo pozmeˇneˇne´ verze. Copyleft licence tak rˇ´ıka´, zˇe pokud redistribuujete origina´lnı´ nebo pozmeˇneˇnou verzi programu, musı´te tuto verzi redistribuovat pod stejnou licencı´ pod jakou jste zı´skali pu˚vodnı´ program, nesmı´te prˇidat zˇa´dna´ omezenı´, abyste tak neodeprˇeli zmı´neˇne´ za´kladnı´ svobody ostatnı´m. Kromeˇ toho by´va´ zvykem, zˇe jednotlive´ programove´ balı´cˇky majı´ sve´ vlastnı´ internetove´ stra´nky, odkud je nejen mozˇne´ si program sta´hnout, ale uzˇivatele´ tam najdou i manua´ly (standardnı´ by´va´ anglicˇtina, prˇeklady do dalsˇ´ıch jazyku˚ za´visı´ veˇtsˇinou na mnozˇstvı´ uzˇivatelu˚ a dobrovolny´ch prˇekladatelu˚ v dane´ jazykove´ 7
oblasti) a diskusnı´ mailove´ skupiny, kam je mozˇne´ posı´lat dotazy ohledneˇ pouzˇ´ıva´nı´ programu a poucˇit se na konkre´tnı´ch proble´mech u zkusˇeneˇjsˇ´ıch uzˇivatelu˚ cˇi prˇ´ımo autoru˚ programu. Pro zdatne´ programa´tory se take´ otevı´ra´ mozˇnost prˇ´ımo se na vy´voji cˇi vylepsˇova´nı´ programu podı´let (cozˇ deˇla´ i beˇzˇny´ uzˇivatel, pokud hla´sı´ autoru˚m chyby, s nimizˇ se prˇi sve´ pra´ci setkal – kazˇdy´, i sebedokonalejsˇ´ı program je koneckoncu˚ jen lidsky´m vy´tvorem). S pojem svobodne´ho software volneˇ souvisejı´ (a neˇkdy jsou ne zcela spra´vneˇ zameˇnˇova´ny) take´ freeware a open source. Termı´n „freeware“ nema´ jasnou a prˇijatelnou definici, ale je beˇzˇneˇ pouzˇ´ıva´n pro balı´ky programu˚, u ktery´ch je dovolena distribuce a pouzˇ´ıva´nı´, ale ne modifikace (zdrojove´ ko´dy nejsou dostupne´), mezi svobodny´ software proto nepatrˇ´ı. Termı´n „open source“ je cˇasto pouzˇ´ıva´n k oznacˇenı´ vı´ceme´neˇ ty´chzˇ veˇcı´ jako svobodny´ software, i kdyzˇ jeho licence nemusı´ zarucˇovat tolik svobod jako GPL. Podrobneˇjsˇ´ı popis jednotlivy´ch kategoriı´ najdeme naprˇ. na stra´nka´ch http://www.gnu.org/philosophy/categories.cs.html. Jak jizˇ bylo zmı´neˇno, do kategorie svobodne´ho software dnes patrˇ´ı cela´ rˇada programu, ktere´ pra´veˇ dı´ky sve´ volne´ dostupnosti mohou by´t pra´veˇ ve sˇkolstvı´ vhodnou alternativou komercˇneˇ proda´vany´ch proprieta´rnı´ch programu˚. Zminˇme naprˇ. program pro vykreslova´nı´ a zna´zornˇova´nı´ dat GNUplot (domovska´ stra´nka http://www.gnuplot.info/, uka´zky grafu˚ http://gnuplot.sourceforge.net/demo/), ktery´ pouzˇ´ıva´ ke graficke´mu zna´zorneˇnı´ i GNU Octave, balı´k pro symbolicke´ vy´pocˇty (tzv. pocˇ´ıtacˇova´ algebra) GNUMaxima1 (domovska´ stra´nka http://maxima.sourceforge.net/) nebo program pro graficke´ u´pravy obra´zku˚ a fotografiı´ Gimp (GNU Image Manipulation Program; domovska´ stra´nka http://www.gimp.org/, cˇeske´ stra´nky http://www.gimp.cz).
1.2
Program GNU Octave
GNU Octave prˇedstavuje vysˇsˇ´ı programovacı´ jazyk („jazyk pro neprograma´tory“) zameˇrˇeny´ na numericke´ operace podobny´ pomeˇrneˇ rozsˇ´ırˇene´mu Matlabur firmy The Mathworks (http://www.mathworks.com/). Jeho autor John W. Eaton – pocˇ´ıtacˇovy´ administra´tor skupiny chemicke´ho inzˇeny´rstvı´ na University of Wisconsin, ktera´ se mimo jine´ zaby´va´ i na´vrhy chemicky´ch reaktoru˚ 1 Maxima vychází z projektu Macsyma, jenž byl vyvíjen v MIT (Massachusetts Institute of Technology) a financován United States Department of Energy a dalšími vládními organizacemi. O vývoj jedné z verzí Macsyma se staral od roku 1982 až do své smrti v roce 2001 Bill Schelter, jenž v roce 1998 získal svolení uveřejnit svou verzi pod GPL. Tuto verzi nazývanou Maxima nyní udržuje nezávislá komunita vývojářů a uživatelů.
8
– tento jazyk vytvorˇil roce 1988 jako pomu˚cku pro studenty, aby nemuseli zvla´dnout beˇzˇne´ programovacı´ jazyky Fortran nebo C++. Samotne´ jme´no „Octave“ pry´ pocha´zı´ ze jme´na autorova by´vale´ho ucˇitele, ktery´ proslul svou schopnostı´ deˇlat rychle´ kalkulace na kouscı´ch papı´rku˚. Program je podobneˇ jako Matlabr zalozˇen na efektivnı´m pocˇ´ıta´nı´ s maticemi, pracovat mu˚zˇeme bud’to interaktivneˇ (postupne´ zada´va´nı´ prˇ´ıkazu˚) nebo spousˇteˇnı´m delsˇ´ıch prˇedem prˇipraveny´ch skriptu˚. Historie zadany´ch prˇ´ıkazu˚ se zaznamena´va´ a je mozˇne´ se k nim postupneˇ vracet nebo si historii ulozˇit jako hotovy´ skript. Zada´vat lze i komplexnı´ cˇ´ısla, k dispozici jsou da´le goniometricke´, hyperbolicke´ funkce, logaritmy, logicke´ funkce, cykly, statisticke´ funkce, polynomy, algoritmy pro numericke´ rˇesˇenı´ diferencia´lnı´ch rovnic, numerickou integraci, konverzi (a rozklad) obrazovy´ch i audio dat, zpracova´nı´ signa´lu˚ atd. Jak jizˇ bylo rˇecˇeno, pro zobrazova´nı´ graficky´ch vy´sledku˚ se automaticky vola´ program GNUplot, z neˇhozˇ lze obra´zek ulozˇit v ru˚zny´ch forma´tech (postscript, png apod.). V soucˇasne´ dobeˇ (za´rˇ´ı 2007) jsou k dispozici dveˇ verze programu – stabilnı´ (cˇ´ıslo 2.1.xx) pouzˇ´ıvana´ v tomto textu a beta-verze (cˇ´ıslo 2.9.xx), ktera´ je zejme´na v oblasti pra´ce s 2D i 3D grafikou blizˇsˇ´ı Matlabur a lze ji v omezene´ podobeˇ spousˇteˇt prˇ´ımo z CDROMu˚ nebo flashdisku˚. Na du˚lezˇite´ rozdı´ly v textu upozornı´me.
1.3
Proč (ne)používat GNU Octave
Volba programu, ktery´ bude pouzˇ´ıvat, patrˇ´ı vzˇdy k vy´sostny´m za´lezˇitostem uzˇivatele. V oblasti matematicky orientovany´ch programu˚ je dnes k dispozici velke´ mnozˇstvı´ balı´ku˚, od komercˇnı´ch proprieta´rnı´ch (naprˇ. Matlabr , Mapler nebo Mathematicar ) azˇ pro freeware nebo svobodny´ software (naprˇ. Scilab nebo GNU Maxima). Nabı´zı´ se proto ota´zka, jake´ vy´hody cˇi nevy´hody jsou spojeny s pouzˇ´ıva´nı´m programu GNU Octave a procˇ si (ne)vybrat pra´veˇ tento balı´k. Kromeˇ ceny (je zdarma, takzˇe oproti vy´sˇe zmı´neˇny´m proprieta´rnı´m programu˚m vycha´zı´ jedna licence asi o 30 000,- Kcˇ levneˇji) bychom meˇli prˇipomenout a zva´zˇit na´sledujı´cı´ klady („+“) a za´pory („−“): − K efektivnı´mu pouzˇ´ıva´nı´ musı´me zvla´dnout alesponˇ za´klady programovacı´ho jazyka, cozˇ ale platı´ pro veˇtsˇinu matematicke´ho software. − Za´kladem vy´pocˇtu˚ jsou manipulace s maticemi, cozˇ v neˇktery´ch situacı´ch vyzˇaduje zvla´sˇtnı´ syntax (vı´ce v na´sledujı´cı´ kapitole). − Program nema´ propracovana´ graficke´ prostrˇedı´ a proto „nenı´ moc o klika´nı´ “; veˇtsˇinu u´konu˚ ovla´da´me pomocı´ kla´vesnice z prˇ´ıkazove´ rˇa´dky. ± GNU Octave nenı´ vy´ukovy´ program, proto se nezameˇrˇuje ani na graficke´ ovla´da´nı´ cˇi pohyblive´ simulace. Tı´m se na druhe´ straneˇ vı´ce blı´zˇ´ı programu˚m cˇasto uzˇ´ıvany´m v rea´lne´ technicke´ praxi.
9
± Vyuzˇitı´ programu se neomezuje zdaleka jen na dynamicke´ modelova´nı´, jemuzˇ je prˇeva´zˇneˇ veˇnova´n tento text. Dı´ky tomu se mu˚zˇe zda´t pro jeden dany´ u´cˇel pouzˇitı´ prˇ´ılisˇ robustnı´ a slozˇity´, na druhou stranu – pokud si na program uzˇ jednou zvykneme – mu˚zˇeme v jednou prostrˇedı´ rˇesˇit hodneˇ proble´mu˚. ± Jde o mezina´rodnı´ projekt, veˇtsˇina materia´lu˚ a manua´lu˚ i diskusnı´ skupina pouzˇ´ıva´ anglicˇtinu, jejı´zˇ znalost je bezesporu vy´hodou. Na druhou stranu je velmi pravdeˇpodobne´, zˇe v sˇiroke´ komuniteˇ neˇkdo rˇesˇil a uzˇ vyrˇesˇil podobny´ proble´m jako my a bude na´m umeˇt poradit. Veˇtsˇ´ı pocˇet uzˇivatelu˚ take´ rychleji odhalı´ prˇ´ıpadne´ chyby a nedostatky programu. + Programovacı´ jazyk pouzˇ´ıvany´ GNU Octave ma´ syntaxi velmi podobnou (i kdyzˇ ne 100% kompatibilnı´) v praxi sˇiroce pouzˇ´ıvane´mu Matlabur . Pokud si na´sˇ student zvykne na za´kladnı´ principy a filozofii, prˇ´ıpadny´ pozdeˇjsˇ´ı prˇechod mezi programy nenı´ obtı´zˇny´. + GNU Octave je multiplatformnı´m programem, lze ho pouzˇ´ıvat jak v operacˇnı´m syste´mu Windows, tak ve veˇtsˇineˇ verzı´ Linuxu (v rˇadeˇ distribucı´ jsou i prˇedkompilova´ny instalacˇnı´ balı´cˇky). Prˇiznejme, zˇe pouzˇ´ıva´nı´ pod Linuxem je v soucˇasne´ dobeˇ pohodlneˇjsˇ´ı. + Za´kladnı´ manua´ly – na rozdı´l naprˇ. od Scilabu (pokud je na´m zna´mo) – jsou k dispozici i v cˇesˇtineˇ ([11, 15]). + S pouzˇitı´m GNU Octave se setka´me na rˇadeˇ mı´st ve Wikipedii [1] a pokud s programem umı´me pracovat, mu˚zˇeme si prˇ´ımo spustit skripty, ktere´ tam nalezneme. V soucˇasne´ dobeˇ roste popularita java-appletu˚ a take´ simulacˇnı´ch programu˚ typu Interactive PhysicsTM (domovska´ stra´nka v anglicˇtineˇ ma´ adresu http://www.design-simulation.com/IP/index.php, informace v cˇesˇtineˇ najdeme naprˇ. na http://www.ictphysics.upol.cz/ nebo http://www.gjwprostejov.cz/projekty/sipvz03/). Zatı´mco pro tvorbu vlastnı´ch appletu˚ musı´me zvla´dnout objektoveˇ orientovany´ programovacı´ jazyk Java vyvinuty´ firmou Sun Microsystems se vsˇ´ım, co k tomu patrˇ´ı, vy´hodou „interaktivnı´ fyziky“ je bezesporu propracovane´ graficke´ prostrˇedı´ umozˇnˇujı´cı´ pomeˇrneˇ snadno vytva´rˇet velmi pu˚sobive´ simulace rea´lny´ch fyzika´lnı´ch deˇju˚. Jak jizˇ bylo rˇecˇeno v prvnı´ cˇa´sti textu, rˇada prˇeddefinovany´ch faktoru˚ prˇitom jednak cˇa´stecˇneˇ omezuje oblast pouzˇitı´ a jednak cˇa´st fyzika´lnı´ch vlastnostı´ zu˚sta´va´ prˇed zvı´davy´m zˇa´kem skryta. Proto jsme prˇesveˇdcˇeni, zˇe i dnes ma´ smysl se dynamicky´m modelova´nı´m zaby´vat, nebot’prˇi neˇm ma´me pod kontrolou vsˇechny parametry a procedury. A hlavneˇ – radost z dobrˇe napsane´ho a fungujı´cı´ho skriptu urcˇiteˇ stojı´ za to!
10
Část 2 První kroky s programem 2.1
Příkazový řádek a terminál
Jizˇ jsme zmı´nili, zˇe za´kladnı´m pracovnı´m prostrˇedı´m programu je termina´l s prˇ´ıkazovy´m rˇa´dkem (obr. 2.1), pomocı´ neˇhozˇ zada´va´me programu jednotlive´ prˇ´ıkazy. K jednou zadany´m prˇ´ıkazu˚m se mu˚zˇeme vracet pomocı´ kla´vesy „se sˇipkou nahoru“, takzˇe je nenı´ nutne´ vypisovat znovu. Termina´l je take´ schopen doplnˇovat jme´na prˇ´ıkazu˚, definovany´ch funkcı´ a jmen souboru v aktua´lnı´m adresa´rˇi pomocı´ kla´vesy Tab (tabula´tor); pokud naprˇ. napı´sˇeme octave:1> ta a stiskneme tabula´tor, program nabı´dne mozˇna´ doplneˇnı´ table
tabulate
tan
tanh
taylorcoef
Obr. 2.1: Terminálové okno s příkazovým řádkem ve Windows XP I kdyzˇ je mozˇne´ historii prˇ´ıkazu˚ ukla´dat, delsˇ´ı posloupnosti prˇ´ıkazu˚ se bezesporu vyplatı´ ulozˇit do souboru a volat vsˇechny prˇ´ıkazy v tomto souboru (tj. 11
cely´ ulozˇeny´ skript) jednı´m prˇ´ıkazem, odpovı´dajı´cı´m jme´nu ulozˇene´ho souboru. Podobneˇ jako u Matlabur soubory ukla´da´me s prˇ´ıponou *.m, seznam souboru v aktua´lnı´m adresa´rˇi zjistı´me prˇ´ıkazem1 octave:3> ls jehozˇ odpoveˇd’ mu˚zˇe vypadat naprˇ. na´sledovneˇ baliste.m balist.m foucault.m
grafika.m grafika2.m haleboop.m
liss.m lyzarfv.m matice.m
micek.m oscilb.m parasut.m
pruzkyv.m raketa.m skladkmitf.m
Soubory s prˇ´ıponou *.m mu˚zˇeme prˇ´ımo spustit, z vy´sˇe uvedene´ho vy´pisu trˇeba octave:4> foucault spustı´ model kmitu˚ Foucaultova kyvadla popsany´ v cˇa´sti 4.3.2. Aktua´lnı´ adresa´rˇ, v neˇmzˇ momenta´lneˇ GNU Octave pracuje, zı´ska´me prˇ´ıkazem octave:5> pwd a do jine´ho adresa´rˇe (slozˇky) se prˇepneme prˇ´ıkazem2 octave:6> cd K psanı´ cˇi na´sledne´ editaci vlastnı´ch skriptu˚ lze vyuzˇ´ıt veˇtsˇinu textovy´ch editoru˚, naprˇ. Pozna´mkovy´ blok (Notepad), ktery´ je soucˇa´stı´ instalace operacˇnı´ho syste´mu Windows. Pı´sˇeme-li vsˇak skriptu˚ vı´ce, patrneˇ ocenı´me mozˇnosti pokrocˇilejsˇ´ıch editoru˚, ktere´ umı´ cˇ´ıslovat rˇa´dky, barevneˇ odlisˇovat komenta´rˇe, prˇ´ıkazy, funkce i cˇ´ıselne´ konstanty (tzv. syntax highlighting neboli zvy´raznˇova´nı´ syntaxe). veˇtsˇinu teˇchto editoru˚ lze vyuzˇ´ıt i pro jine´ programovacı´ jazyky, psanı´ dokumentu˚ v TEXu nebo editaci ko´du www-stra´nek. I v te´to kategorii je nabı´dka freewarovy´ch programu˚ pomeˇrneˇ sˇiroka´ – prˇ´ımo s instalacı´ GNU Octave pro Windows se nainstaluje editor Scite (http://www.scintilla.org/SciTE.html), z dalsˇ´ıch stojı´ za zmı´nku naprˇ. pu˚vodem cˇesky´ PSPad autora Jana Fialy (http://www.pspad.com/cz/), ktery´ lze do syste´mu i integrovat jako na´hradu azˇ prˇ´ılisˇ jednoduche´ho Pozna´mkove´ho bloku. U obou zmı´neˇny´ch programu˚ lze nastavit rˇadu parametru˚, vcˇetneˇ fontu˚ a barev tak, jak to uzˇivateli subjektivneˇ nejle´pe vyhovuje.3 Nastavı´me-li, aby se dany´ typ souboru otevı´ral vzˇdy ve vybrane´m editoru, mu˚zˇeme se pustit do psanı´ prvnı´ch programu˚. 1 Modifikací ls -l získáme podrobný výpis souborů s jejich velikostí a datem poslední změny. 2 I k němu existuje řada možných parametrů např. cd / přepíná do hlavního adresáře (složky), jimž v OS Windows většinou bývá disk C:. Obsahují-li jména adresářů mezery, musíme dát název do uvozovek, tj. cd "/Documents and Settings". 3 V současné verzi PSPadu používáme stejný zvýrazňovač pro GNU Octave i Matlab r označený jako MATLAB13.
12
2.2
Základní funkce a příkazy
Nynı´ jsme prˇipraveni vyzkousˇet prvnı´ kroky s programem. Podobneˇ jako Matlabr vypisuje GNU Octave cˇ´ısla v ru˚zny´ch forma´tech. V za´kladnı´m nastavenı´ vypisuje dveˇ notoricky zna´me´ za´kladnı´ konstanty ve tvaru octave:1> pi, e pi = 3.1416 e = 2.7183 Chceme-li si vy´stup na vı´ce desetinny´ch mı´st, pouzˇijeme octave:2> format long octave:3> pi, e pi = 3.14159265358979 e = 2.71828182845905 k pu˚vodnı´mu nastavenı´ se vra´tı´me pomocı´ format short. Zdu˚razneˇme, zˇe tı´m neovlivnˇujeme prˇesnost, s jakou GNU Octave pouzˇ´ıva´ cˇ´ısla prˇi vy´pocˇtech. Maxima´lnı´ pocˇet desetinny´ch mı´st, ktera´ mu˚zˇeme zobrazit je 424 ; dosa´hneme toho prˇ´ıkazem. octave:4> printf ("%.42f\n", pi); kde \n znacˇ´ı prˇechod √ na novy´ rˇa´dek po vykona´nı´ prˇ´ıkazu. Podobneˇ si mu˚zˇeme nechat vypsat naprˇ. 10 octave:5> printf ("%.42f\n", sqrt(10)); 3.162277660168379522787063251598738133907318 Za´kladnı´mi objekty, s nimizˇ program efektivneˇ pracuje, jsou matice, i cˇ´ıselne´ konstanty cha´pe jako matice s jednı´m prvkem. Jednorˇa´dkovou matici (rˇa´dkovy´ vektor) zada´me ve tvaru octave:6> m=[1 2 3 4 5 6] m = 1
2
3
4
5
6
4 Chceme-li
např. Ludolfovo číslo p na 1 000 desetinných míst, musíme použít program pro symbolické výpočty (např. GNU Maxima) nebo alespoň nainstalovat k programu GNU Octave knihovnu pro symbolické výpočty, s níž bude v takových případech spolupracovat (např. GiNaC ). V beta-verzi GNU Octave 2.9.xx tuto knihovnu najdeme, v linuxovských distribucích většinou stačí doinstalovat balíček octave-forge. Potom lze použít: digits(1000); a Pi.
13
matici k nı´ transponovanou (tj. sloupcovy´ vektor) octave:7> m’ ans = 1 2 3 4 5 6 cozˇ lze dosa´hnout i prˇ´ımo zada´nı´m (rˇa´dky matice ukoncˇujeme strˇednı´kem) octave:8> m =
m=[1; 2; 3; 4; 5; 6]
1 2 3 4 5 6 Ukoncˇ´ıme-li rˇa´dek strˇednı´kem, matice se vytvorˇ´ı, ale nevypı´sˇe na obrazovce, cozˇ je uzˇitecˇne´ u velky´ch matic s mnoha prvky octave:9>
m=[1; 2; 3; 4; 5; 6];
Vyjdeme-li z pu˚vodnı´ rˇa´dkove´ matice m=[1 2 3 4 5 6], mu˚zˇeme na´sobenı´ ˇra´dkove´ a sloupcove´ matice zapsat octave:10> m*m’ ans = 91 P z matematicke´ho hlediska jde o soucˇet i m2i . Protozˇe u na´sobenı´ matic za´visı´ na porˇadı´ (nenı´ komutativnı´), za´meˇnou matice m a matice transponovane´ zı´ska´me matici octave:11> A=m’*m A = 1 2
2 4
3 6
4 8
5 10
6 12 14
3 4 5 6
6 8 10 12
9 12 15 18
12 16 20 24
15 20 25 30
18 24 30 36
neboli matici s prvky Aij = mi mj . Prˇi na´sobenı´ a umocnˇova´nı´ matic proto musı´me da´t pozor! Chceme-li umocnit prvky matice naprˇ. na druhou, nemu˚zˇeme napsat pouze m^2 – chybova´ hla´sˇka na´m napovı´da´, zˇe GNU Octave se snazˇ´ı umocnit matici jako celek a to lze jen v prˇ´ıpadeˇ cˇtvercove´ matice octave:12> m^2 error: for A^b, A must be square error: evaluating binary operator ‘^’ near line 11, column 2 Chceme-li zı´skat matici s jednotlivy´mi prvky m2i (tj. umocneˇnou „cˇlen po cˇlenu“), musı´me napsat octave:12> m.^2 ans = 1
4
9
16
25
36
nebo pomocı´ na´sobenı´ m.*m. Toto opomenutı´ by´va´ prˇ´ıcˇinou mnoha chybovy´ch hla´sˇek, u cˇtvercovy´ch matic, kdy se chybova´ hla´sˇka neobjevı´, mu˚zˇe ve´st ke sˇpatne´mu vy´sledku. Dodejme, zˇe na stejny´ za´pis a „nepohodlı´“ si musı´ zvyknout i uzˇivatele´ Matlabur . Kromeˇ tisˇteˇny´ch manua´lu˚ cˇi na´vodu˚ na internetu mu˚zˇeme za´kladnı´ na´vody a informace zı´skat prˇ´ımo pomocı´ programu prˇ´ıkazem octave:13> help hleda´me-li pomoc ke konkre´tnı´mu prˇ´ıkazu, prˇipojı´me jeho jme´no octave:14> help plot V termina´lu se na´m objevı´ popis, jı´mzˇ mu˚zˇeme postupneˇ listovat, opustı´me ho kla´vesou „q“, po jejı´mzˇ stisknutı´ mu˚zˇeme zada´vat dalsˇ´ı prˇ´ıkazy. V prˇ´ıpadeˇ potrˇeby mu˚zˇeme vy´pis termina´love´ho okna vymazat prˇ´ıkazem octave:15> clc nadefinovane´ konstanty a promeˇnne´ vymazˇeme prˇ´ıkazem octave:16> clear
15
pouze matici m vymazˇeme prˇ´ıkazem clear m. Hla´sˇky vypisovane´ na obrazovku a komunikujı´cı´ s uzˇivatelem zada´va´me pomocı´ prˇ´ıkazu printf nebo fprintf, naprˇ. octave:17> fprintf ("Stisknete libovolnou klavesu...\n"); Vy´znam to ma´ zejme´na, pokud prˇipravujeme programy, jezˇ bude spousˇteˇt i neˇkdo jiny´ (trˇeba nasˇi studenti). Chceme-li v duchu prˇedchozı´ uka´zky do skriptu zarˇadit prˇerusˇenı´ beˇhu programu s cˇeka´nı´m na stisk libovolne´ kla´vesy uzˇivatelem, pouzˇijeme pause.
2.3
Některé matematické funkce
Z hlediska strˇedosˇkolske´ matematiky a fyziky ma´ GNU Octave prˇeddefinova´no neˇkolik zajı´mavy´ch funkcı´ a procedur. Naprˇ. rˇesˇenı´ soustavy linea´rnı´ch rovnic 4x + 3y − 2z 6x − 5y − 3z 3x + 2y + 5z snadno najdeme pomocı´ matice soustavy octave:1> A=[4 3 -2;6 -5 3;3 2 5] A = 4 6 3
3 -5 2
-2 3 5
a matice sestavene´ z pravy´ch stran octave:2> B=[40;50;220] B = 40 50 220 podı´lem matic
16
= 40 = 50 = 220
octave:3> A\B ans = 10.000 20.000 30.000 urcˇujı´cı´m rˇesˇenı´ x = 10, y = 20 a z = 30. Na tomto lze demonstrovat dvojı´ typ deˇlenı´ matic. Vy´sˇe pouzˇita´ operace A\B5 matematicky odpovı´da´ na´sobenı´ inverznı´ maticı´ zleva A−1 B. Beˇzˇneˇ uzˇ´ıvany´ znak deˇlenı´ A/B pak reprezentuje vy´raz AB −1 , ktery´ ovsˇem pro nasˇe konkre´tnı´ matice nelze vypocˇ´ıtat pro nekompatibilnı´ pocˇet rˇa´dku˚ a sloupcu˚ matic A a B. Rozdı´l mezi obeˇma deˇlenı´mi pak uka´zˇeme na pomocı´ matice B, srovna´me-li vy´razy6 octave:4> B\B, B/B ans = 1.0000 ans = 0.030476 0.038095 0.167619
0.038095 0.047619 0.209524
0.167619 0.209524 0.921905
Podobneˇ jako prˇi na´sobenı´ musı´me da´vat pozor, chceme-li deˇlit jednotlive´ prvky matice, kde je opeˇt trˇeba vlozˇit tecˇku octave:5> B./B ans = 1 1 1 Na matici A si mu˚zˇeme uka´zat vy´beˇr jejı´ch jednotlivy´ch prvku˚. Naprˇ. prvek A23 vyvola´me prˇ´ıkazem, octave:6> A(2,3) ans = 3 5 Znak \ používáme také v jiném významu – rozdělujeme jím příkaz na více řádků, pokud je z nějakých důvodů jejich délka omezena jako např. při sazbě tohoto textu. Potom za ním ale následuje přechod na nový řádek. 6 Dodejme, že pojem inverzní matice zavádíme přesně vzato pouze u matic čtvercových, z ukázky vidíme, že dvojí typ dělení umožňuje GNU Octave i pro některé matice jiného typu.
17
3. rˇa´dek a 2. sloupec pak postupneˇ octave:7> A(3,:), A(:,2) ans = 3
2
5
ans = 3 -5 2 Soucˇet rˇa´dkove´ nebo sloupcove´ matice (vektoru) zı´ska´me jednodusˇe prˇ´ıkazem octave:8> sum(B) ans = 310 podobneˇ determinant matice A octave:9> det(A) ans = -241 Na prˇ´ıkladu kvadraticke´ 4x2 + x − 3 = 0 rovnice mu˚zˇeme demonstrovat schopnost hledat korˇeny polynomu. Z koeficientu˚ polynomu sestavı´me matici v porˇadı´ od nejvysˇsˇ´ıho k nejnizˇsˇ´ımu octave:10> koeficienty=[4 1 -3] koeficienty = 4
1
-3
Kvadraticky´ polynom na leve´ straneˇ mu˚zˇeme pro kontrolu nechat vypsat ve zvolene´ promeˇnne´ (v tomto prˇ´ıpadeˇ x) octave:11> polyout(koeficienty, ’x’) 4*x^2 + 1*x^1 - 3 Hledane´ rˇesˇenı´ – korˇen polynomu – vracı´ funkce matice koeficientu˚ octave:12> roots(koeficienty) ans = -1.00000 0.75000 18
Zı´ska´va´me tak rˇesˇenı´ x1 = −1 a x2 = 0,75. Rˇesˇit mu˚zˇeme i u´lohu opacˇnou – najı´t mnohocˇlen ke zna´my´m korˇenu˚m. Naprˇ. pro hodnoty x1 = −0,7, x2 = 0,9 jsou korˇeny polynomu s koeficienty octave:13> poly([-.7, .9]) ans = 1.00000
-0.20000
-0.63000
tj. x2 − 0,2x − 0,63. Program umozˇnˇuje nale´zt jak soucˇin, tak podı´l dvou polynomu˚ opeˇt pomocı´ matic jejich koeficientu˚. Naprˇ. pro polynomy x4 − 8x3 + 16x2 − 7x − 2 a x2 − − 3x + 2 vytvorˇ´ıme matice koef1=[1 -8 16 -7 -2]; koef2=[1 -3 2];. Koeficienty soucˇinu obou polynomu˚ zı´ska´me prˇ´ıkazem octave:15> conv(koef1,koef2) ans = 1
-11
42
-71
51
-8
-4
a koeficienty podı´lu octave:16> podil=deconv(koef1,koef2) podil = 1
-5
-1
Pote´ mu˚zˇeme vypsat i odpovı´dajı´cı´ polynom naprˇ. v promeˇnne´ y octave:17> polyout(podil,’y’) 1*y^2 - 5*y^1 - 1 neboli y 2 − 5y − 1.
2.4
Práce se soubory
Nutnou podmı´nku pra´ce s jaky´mkoli programem prˇedstavuje mozˇnost ukla´dat informace do souboru˚ na pevne´m disku, sı´ti cˇi prˇenosne´m me´diu. Neˇktere´ za´kladnı´ funkce jako zjisˇteˇnı´ aktua´lnı´ho adresa´rˇe cˇi vy´pis souboru˚ v neˇm jizˇ byly zmı´neˇny v cˇa´sti 2.1. Nynı´ zadefinujeme matici prvku˚ po jedne´ od 1 do 10 (tj. s krokem rovny´m 1); protozˇe pro na´s bude vy´hodneˇjsˇ´ı sloupcova´ matice namı´sto rˇa´dkove´, pouzˇijeme operaci transponova´nı´ matice ’
19
octave:1> mereni=[1:1:10]’ mereni = 1 2 3 4 5 6 7 8 9 10 Nynı´ k te´zˇe matici prˇidejme sloupec s (pseudo)na´hodny´mi hodnotami okolo 5. Pouzˇijeme k tomu genera´tor (pseudo)na´hodny´ch cˇ´ısel rand(i,j), ktery´ vracı´ matici i × j pseudona´hodny´ch cˇ´ısel v intervalu h0,1i, vyna´sobenı´m cˇ´ıslem 0,1 docı´lı´me toho, zˇe cˇ´ısla v druhe´m sloupci se budou od 5 lisˇit azˇ na druhe´m desetinne´m cˇ´ısle. Vy´sledna´ dvousloupcova´ matice tak prˇipomı´na´ vy´sledek deseti meˇrˇenı´ neˇjake´ velicˇiny (tı´m jsme se inspirovali i pro na´zev promeˇnne´) octave:2> mereni=[mereni [5+.1*rand(10,1)]] mereni = 1.0000 2.0000 3.0000 4.0000 5.0000 6.0000 7.0000 8.0000 9.0000 10.0000
5.0124 5.0323 5.0559 5.0607 5.0124 5.0832 5.0341 5.0759 5.0659 5.0149
K te´zˇe matici mu˚zˇeme prˇidat dalsˇ´ı sloupec (dveˇma na´hodny´mi cˇ´ısly zveˇtsˇujeme na´hodne´ „rozmaza´nı´“ hodnot ve trˇetı´m sloupci) octave:3> mereni=[mereni [9.81*12.5+0.05*rand(10,1)-0.07*rand(10,1)]]
mereni = 1.0000
5.0124
122.6048 20
2.0000 3.0000 4.0000 5.0000 6.0000 7.0000 8.0000 9.0000 10.0000
5.0323 5.0559 5.0607 5.0124 5.0832 5.0341 5.0759 5.0659 5.0149
122.6408 122.5813 122.6648 122.6527 122.6507 122.5876 122.6040 122.6187 122.6318
Zı´skanou matici mereni nynı´ ulozˇ´ıme do souboru mereni.txt jako cˇisty´ text (ne v bina´rnı´m forma´tu), aby ji bylo mozˇne´ nacˇ´ıst i jiny´m programem (naprˇ. tabulkovy´m kalkula´torem Excel) octave:4> save -text mereni.txt mereni Po vymaza´nı´ promeˇnne´ z pameˇti octave:5> clear mereni ji mu˚zˇeme nacˇ´ıst ze souboru (jme´no nacˇtene´ promeˇnne´ bude odpovı´dat jme´nu souboru bez prˇ´ıpony) octave:6> load mereni.txt Zkonstruovanou matici vyuzˇijeme k uka´zce mozˇnosti, jak s pomocı´ GNU Octave zpracovat vy´sledky meˇrˇenı´. Podı´va´me-li se na hodnoty v matici, vidı´me, zˇe prvnı´ sloupec by mohl odpovı´dat cˇ´ıslu meˇrˇenı´, druhy´ cˇasu t ≈ 5 s a trˇetı´ dra´ze volne´ho pa´du s ≈ gt2 /2. Vybereme-li z nacˇtene´ matice jednotlive´ sloupce a ulozˇ´ıme je do promeˇnny´ch octave:7> pokus=mereni(:,1); cas=mereni(:,2); draha=mereni(:,3); Pn lze vypocˇ´ıtat aritmeticke´ pru˚meˇry x ¯ = 1/n i=1 xi octave:8> [mean(cas) mean(draha)] ans = 5.0448
122.6237
odchylky x − x ¯ octave:9> [center(cas) center(draha)] ans =
21
-0.0323554 -0.0124431 0.0111785 0.0159147 -0.0323656 0.0384046 -0.0106577 0.0310966 0.0211222 -0.0298949
-0.0189170 0.0171056 -0.0424311 0.0410511 0.0289959 0.0269348 -0.0361146 -0.0197190 -0.0050090 0.0081032 qP n 2 a standardnı´ odchylky ¯) /(n − 1) i=1 (x − x octave:10> [var(cas) var(draha)] ans = 0.00072476
0.00083179
S problematikou meˇrˇenı´ souvisı´ i regrese – hleda´nı´ za´vislosti mezi velicˇinami. Zatı´mco naprˇ. Excel standardneˇ umozˇnˇuje pouze regresi linea´rnı´, GNU Octave umozˇnˇuje velicˇinami prolozˇit polynom pozˇadovane´ho stupneˇ, v nasˇ´ı uka´zce zvolı´me 2. Zadefinujme nejprve velicˇiny x a y jako jednorˇa´dkove´ matice (vektory) octave:11> x=1:1:10, y=x.^2+x+3+0.5*rand(1,10)-0.3*rand(1,10) x = 1
2
3
4
5
6
7
8
9
10
y = Columns 1 through 8: 5.1096
9.1916
15.0361
23.0593 44.8745
33.1781 59.1035
75.3419
Columns 9 and 10: 92.9817
112.8734
Koeficienty kvadraticke´ho polynomu vyhovujı´cı´ podmı´nce nejmensˇ´ıch cˇtvercu˚ najdeme prˇ´ıkazem octave:12> polyfit(x,y,2) 22
ans = 0.99685
1.02112
3.08015
Nejlepsˇ´ı aproximacı´ 2. stupneˇ je tedy polynom y = 0,99685x2 + 1,02112x + + 3,08015. Na za´veˇr uved’me, jak lze vypsat naprˇ. poslednı´ch 10 zadany´ch prˇ´ıkazu˚ octave:13> history 10
2.5
Kreslíme obrázky
Nezbytnou soucˇa´stı´ dynamicke´ho modelova´nı´ je i vykreslenı´ vypocˇteny´ch hodnot a funkcˇnı´ch za´vislostı´. Veˇnujme se proto na za´veˇr kapitoly za´kladnı´m prˇ´ıkazu˚m dvourozmeˇrne´ a trˇ´ırozmeˇrne´ grafiky.
Obr. 2.2: Okno s obrázkem vykresleným programem GNUplot Jak jizˇ bylo rˇecˇeno, GNU Octave pro vykreslova´nı´ grafu˚ automaticky vola´ GNUplot, v OS Windows se na panelu ve spodnı´ cˇa´sti obrazovky objevı´ dveˇ nove´ polozˇky (viz. obr. 2.2). Zatı´mco okno s vlastnı´m grafem mu˚zˇeme bez proble´mu˚ zavrˇ´ıt a prˇi dalsˇ´ım pozˇadavku se na´m vykreslı´ novy´ graf (nebo prˇekreslı´ sta´vajı´cı´ 23
s novy´mi parametry), druhe´ prˇ´ıkazove´ okno samotne´ho GNUplotu (na obr. 2.2 je vyznacˇeno) zavrˇ´ıt nesmı´me; pokud se to stane, prˇerusˇ´ı se komunikace (pipeline) mezi GNU Octave a GNUplotem a zˇa´dny´ dalsˇ´ı obra´zek se jizˇ nevykreslı´ – je nutno GNU Octave restartovat.7 2.5.1
Dvourozměrná grafika
Jednoduchy´ graf funkce y = sin x pro x ∈ h0,10i vykreslı´me pomocı´ prˇ´ıkazu˚8 octave:1>
x=0:pi/4:10; plot(x,sin(x))
Nejprve definujeme hodnoty neza´visle promeˇnne´ x od 0 do 10 s krokem p/4 a pote´ vykreslı´me prˇ´ıslusˇnou za´vislost. Pokud se na´m jako v tomto prˇ´ıpadeˇ zda´ graf prˇ´ılisˇ hranaty´ (program spojuje jednotlive´ body u´secˇkami, i kdyzˇ lze pouzˇ´ıt i splajny), musı´me zjemnit deˇlenı´ naprˇ. zjemneˇnı´m kroku na p/100. Rozsah neza´visle promeˇnne´ mu˚zˇeme zadat i volbou pocˇa´tecˇnı´ a konecˇne´ hodnoty spolu s pocˇtem deˇlicı´ch bodu˚. Chceme-li naprˇ. vy´sˇe pouzˇity´ interval rozdeˇlit na sto intervalu˚ (mezi 101 body), pouzˇijeme octave:2>
x=linspace(0,10,101); plot(x,sin(x))
K prˇ´ıkazu plot mu˚zˇeme zadat i dalsˇ´ı nepovinne´ parametry, naprˇ. vykreslit i body se spocˇ´ıtany´mi funkcˇnı´mi hodnotami parametrem -o (cozˇ mu˚zˇe by´t uzˇitecˇne´ prˇi zna´zornˇova´nı´ diskre´tnı´ch dat) octave:3>
x=linspace(0,10,11); plot(x,sin(x),’-o’)
nebo zmeˇnit barvu octave:4>
x=linspace(0,10,11); plot(x,sin(x),’-b’)
poprˇ. vykreslit neˇkolik grafu˚ najednou s ru˚zny´mi parametry pro kazˇdy´ z nich octave:5> octave:6>
x=linspace(0,10,41); plot(x,sin(x),’-*’,x,cos(x),’ob’)
vy´sledek vidı´me na obr. 2.3, jinou volbu octave:7> plot(x,-sin(x),’^’,x,cos(x),’-ob;kosinus;’, \ x,-sin(x).^2+.5,’mL;schody;’)
24
1
1
0.8
0.8
0.6
0.6
0.4
0.4
0.2
0.2
0
0
-0.2
-0.2
-0.4
-0.4
-0.6
-0.6
-0.8
-0.8
kosinus schody
-1
-1 0
2
4
6
8
0
10
Obr. 2.3: Dva grafy v jednom obrázku s různými parametry
2
4
6
8
10
Obr. 2.4: Totéž s jinou volbou parametrů příkazu plot
pak na obr. 2.4. Nezada´me-li parametry zˇa´dne´, budou grafy vykresleny cˇarami (u´secˇkami spojujı´cı´mi jednotlive´ body), jejichzˇ barva, resp. typ prˇerusˇovane´ cˇa´ry u cˇernobı´le´ho vy´stupu, se budou automaticky pro jednotlive´ cˇa´ry lisˇit v za´vislosti na typu vy´stupu (obrazovka, postscriptovy´ soubor, obra´zek png apod.)9 Kazˇde´mu lze urcˇiteˇ doporucˇit, aby se neba´l s volbami experimentovat a sa´m si nasˇel kombinaci parametru˚, ktera´ jemu nejvı´ce vyhovuje. Z prˇedchozı´ch uka´zek vidı´me, zˇe jimi pro kazˇdy´ z grafu˚ mu˚zˇeme definovat: • typ grafu cˇa´rovy´ (vy´chozı´, -), tecˇkovany´ (.), schodovity´ (L) nebo vyna´sˇecı´ (^). • barvu a to bud’ pı´smenem r, g, b, m, c cˇi w nebo cˇ´ısly 1–6, tj. v uvedene´m porˇadı´ cˇervena´ (red), zelena´ (green), modra´ (blue), purpurova´ (magenta), azurova´ (cyan) a bı´la´ (white). Vyzkousˇenı´m se prˇesveˇdcˇ´ıme, zˇe i cˇ´ıslu˚m 7–9 jsou barvy prˇirˇazeny ovsˇem bez komenta´rˇe v manua´lu. • bodovy´ graf neboli vykreslenı´ bodu˚ bud’prˇ´ımo uvedenı´m symbolu, ktery´ se ma´ v dane´m bodeˇ vykreslit jako *, +, o, x, nebo dvojciferny´m cˇ´ıslem, v neˇmzˇ prvnı´ cifra urcˇuje barvu a druha´ symbol, opeˇt lze experimentovat s cˇ´ısly 1–9). Z uvedeny´ch uka´zek vidı´me, zˇe vyznacˇenı´ bodu˚ lze kombinovat s vykreslenı´m cˇar, naprˇ. -*. 7 V operačním systému Linux se toto druhé okno vůbec neotevírá, pouze samotný graf, takže se s tímto problémem nesetkáme. 8 Z důvodu úspory místa zde nebudeme reprodukovat všechny grafy, předpokládáme, že čtenář má možnost si výstup jednotlivých příkazů bezprostředně ověřit přímým zadáním do programu. 9 Nastavení terminálu, tj. typu čar a bodů lze zjistit v programu GNUplot příkazem test.
25
• popisek uva´dı´me mezi strˇednı´ky, naprˇ. ;kosinus;, strˇednı´k na konci popisku nesmı´ chybeˇt. Vy´chozı´ popisky majı´ tvar „line 1“, „line 2“ atd. Pokud je navı´c zapnut mo´d mouse (v OS Windows automaticky ve vy´chozı´m nastavenı´), vidı´me aktua´lnı´ hodnoty sourˇadnic bodu˚, nad nimizˇ se pohybujeme mysˇ´ı, v leve´m dolnı´m rohu obrazovky. Stisknutı´m prostrˇednı´ho tlacˇ´ıtka mu˚zˇeme znacˇku zvolene´ho bodu s teˇmito hodnotami prˇidat do grafu, tahem prˇi stisknute´m prave´m tlacˇ´ıtku mu˚zˇeme vybrat detailnı´ vy´beˇr neˇjake´ cˇa´sti grafu (pak ale prˇed dalsˇ´ım obra´zkem musı´me anulovat vesˇkera´ nastavenı´ obra´zku). Tento doplneˇk, dostupny´ pouze v noveˇjsˇ´ıch verzı´ch, lze kdykoli zapnout prˇ´ıkazem gnuplot set mouse a naopak inaktivovat gnuplot set nomouse. Chceme-li vykreslene´ obra´zky vytisknout poprˇ. zarˇadit do textu, uvı´ta´me mozˇnost meˇnit vzhled os, jejich popisek, pomeˇru stran obra´zku apod. U rˇady obra´zku˚ mu˚zˇe by´t ko´d (posloupnost prˇ´ıkazu˚) pro tyto zmeˇny stejneˇ dlouhy´ jako ko´d pro samotny´ vy´pocˇet hodnot. Uzˇivatele´ Matlabur majı´ k dispozici neˇktere´ prˇ´ıkazy typu axis, nejvı´ce mozˇnostı´ prozatı´m sky´ta´ zada´va´nı´ prˇ´ıkazu samotne´ho GNUplotu, ktere´ by´vajı´ uvozeny __gnuplot_set__ nebo __gnuplot_raw__. V nasˇem textu se omezı´me jen na neˇkolik nejdu˚lezˇiteˇjsˇ´ıch mozˇnostı´, podrobny´ popis by nutneˇ suploval manua´l k programu GNUplot (viz naprˇ. [25]). Dodejme, zˇe ve starsˇ´ıch verzı´ch programu se namı´sto uvedeny´ch prˇ´ıkazu˚ pouzˇ´ıval tvar gset resp. graw, ktere´ sice zu˚sta´vajı´ sta´le implementova´ny, ale prˇi jejich prvnı´m vola´nı´ na´s varovna´ hla´sˇka upozornı´, zˇe se s nimi v dalsˇ´ım vy´voji jizˇ nepocˇ´ıta´ a pro zacˇ´ınajı´cı´ho uzˇivatele nema´ tudı´zˇ smysl si na neˇ zvykat. Naopak v beta-verzi 2.9.xx jizˇ nejsou k dispozici ani prˇ´ıkazy typu __gnuplot_set__ a prˇ´ıpadne´ omezene´ u´pravy lze prove´zt vy´hradneˇ pomocı´ funkcı´ axis, grid apod. analogicky´ch jejich matlabovsky´m proteˇjsˇku˚m (ale ne s nimi zcela kompatibilnı´ch). Ukazˇme si je na prˇ´ıkladu funkce prˇirozene´ho logaritmu ln x.10 Graf logaritmicke´ funkce pro x ∈ h0,10i vykreslı´me prˇ´ıkazem octave:8> x=linspace(0,10,101); plot(x,log(x)); jehozˇ vy´sledek na obr 2.5 na´s urcˇiteˇ neuspokojı´. Zavrˇeme proto okno s obra´zkem (ale ne s programem GNUplot!) a zmeˇnı´me rozsah vykresleny´ch hodnot na ose y na hodnoty y = −10 (to musı´me udeˇlat veˇtsˇinou, pokud funkce ma´ ve zobrazovane´m intervalu singula´rnı´ bod, v neˇmzˇ hodnoty rostou nebo klesajı´ k ±∞) nastavenı´m parametru yrange. Da´le prˇida´me sourˇadnicovou sı´t’(grid), vypneme popisek v prave´m hornı´m rohu (nokey) a zmeˇnı´me smeˇr znacˇek na osa´ch smeˇrem 10 Musíme dát pozor, že pro přirozený logaritmus o základu e čísla b, tj. pro ln b použijeme příkaz log(b), zatímco pro dekadický logaritmus o základu 10 log b příkaz log10(b). Logaritmus o libovolném základě pak získáme podílem logaritmů jednoho z těchto typů podle známých vztahů loga b = ln b/ ln a = log b/ log a.
26
ven z obra´zku (tics out). Nakonec obra´zek prˇekreslı´me s novy´m nastavenı´m pomocı´ prˇ´ıkazu replot. Cela´ posloupnost prˇ´ıkazu˚ pak vypada´ na´sledovneˇ11 octave:9> __gnuplot_set__ yrange [-10:] octave:10> __gnuplot_set__ grid octave:11> __gnuplot_set__ nokey octave:12> __gnuplot_set__ tics out octave:13> replot jejı´ vy´stup je na obr. 2.6. K dispozici jsou i logaritmicka´ meˇrˇ´ıtka na osa´ch, bud’ 4
2e+305
line 1
0
2
-2e+305 0
-4e+305 -2
-6e+305 -8e+305
-4
-1e+306 -6
-1.2e+306 -1.4e+306
-8
-1.6e+306 -10
-1.8e+306 0
2
4
6
8
0
10
2
4
6
8
10
Obr. 2.6: Upravený graf logaritmické funkce
Obr. 2.5: Graf logaritmické funkce v základním nastavení na ose x nebo y prˇ´ıp. na osa´ch obou octave:14> octave:15> octave:16>
semilogx(x,log(x)) semilogy(x,log(x)) loglog(x,log(x))
Da´le mu˚zˇeme pochopitelneˇ upravit rozsah hodnot zobrazeny´ch na ose x12 nastavenı´m parametru xrange a pouzˇ´ıt desetinne´ cˇa´rky namı´sto tecˇky parametrem decimalsign octave:17> octave:18>
__gnuplot_set__ xrange [0.1:] __gnuplot_set__ decimalsign ’,’
11 V beta-verzi 2.9.xx souřadnicovou síť aktivujeme pomocí grid on, deaktivujeme pomocí grid off, rozsahy na osách zadáváme jako parametr funkce axis. 12 Označení xrange resp. yrange či v trojrozměrném případě zrange se nezmění, ani když pracujeme s jinými proměnnými než x,y,z.
27
Vsˇechna nastavenı´ anulujeme na vy´chozı´ prˇ´ıkazem gnuplot raw ("reset;"). Ve veˇtsˇineˇ prˇ´ıpadu˚ se tı´m aktivuje vykreslova´nı´ pouhy´ch bodu˚ (ne cˇar), ktere´ musı´me opeˇt zapnout. Cela´ dvojice prˇ´ıkazu˚ pak vypada´ octave:19> __gnuplot_raw__ ("reset;") octave:20> __gnuplot_set__ data style lines; Vykreslit lze i parametricky definovane´ krˇivky, musı´me vsˇak da´t pozor, aby matice definujı´cı´ parametry meˇly stejny´ rozmeˇr, tj. stejny´ pocˇet prvku˚, v nasˇem prˇ´ıpadeˇ 361. Pro ϕ ∈ h0,8pi a r ∈ h0,2i nakreslı´me spira´lu s rostoucı´m polomeˇrem o rovnicı´ch x = r cos ϕ, y = r sin ϕ a take´ krˇivku popsanou v pola´rnı´ch sourˇadnicı´ch rovnicı´ r = 2 sin (2ϕ), tj. x = 2 sin (2ϕ) cos ϕ, y = 2 sin (2ϕ) sin ϕ. Pouzˇijeme postupneˇ prˇ´ıkazy octave:21> phi=linspace(0,8*pi,361); octave:22> r=linspace(0,2,361); octave:23> plot(r.*cos(phi),r.*sin(phi),\ 2*sin(2*phi).*cos(phi),2*sin(2*phi).*sin(phi)); Spra´vny´ tvar krˇivek vyzˇaduje stejne´ meˇrˇ´ıtko na obou osa´ch octave:24> axis(’equal’), replot zobrazenı´ os mu˚zˇeme i vypnout octave:25> axis(’off’), replot nebo zapnout zobrazenı´ os procha´zejı´cı´ch pocˇa´tkem sourˇadnic prˇ´ıslusˇny´m typem cˇa´ry (v nasˇem prˇ´ıpadeˇ plna´ tenka´ cˇa´ra linetype -113 ) octave:26> __gnuplot_set__ xzeroaxis lt -1 octave:27> __gnuplot_set__ yzeroaxis lt -1 octave:28> replot a nevykreslovat ra´m okolo grafu octave:29> __gnuplot_set__ noborder octave:30> replot V poslednı´ uka´zce vyplnı´me barvou oblast mezi grafem funkce a osou x o rovnici y = 0. Nejprve opeˇt pro jistotu vymazˇeme prˇedchozı´ nastavenı´ grafu˚ 13 Číslování čar a dalších parametrů nastíněno spolu s parametry příkazu plot na str. 25, hodnotě −1 odpovídá tenká plná čára.
28
octave:31> __gnuplot_raw__ ("reset;") octave:32> __gnuplot_set__ data style lines; Pro hodnoty x ∈ h0,10i opeˇt vykreslı´me graf funkce sin x. Zmeˇnı´me styl vykreslova´nı´ na vyplnˇova´nı´ ohranicˇene´ osou x (y1=0) octave:33> __gnuplot_set__ style data filledcurves y1=0 octave:34> x=linspace(0,10,51)’; plot(x,sin(x)) Vyplnit mu˚zˇeme i uzavrˇene´ krˇivky, pro jednoduchost zvolı´me jednotkovy´ kruh s hranicı´ x = cos ϕ, y = sin ϕ, prˇitom musı´me opeˇt nastavit stejne´ meˇrˇ´ıtko na obou osa´ch octave:35> octave:36> octave:37> octave:38>
phi=linspace(0,2*pi,51); __gnuplot_set__ style data filledcurves closed axis(’equal’) plot(cos(phi)’, sin(phi)’);
Vy´sledky pak vidı´me na obr. 2.7 a 2.8. Je zrˇejme´, zˇe implementace te´to mozˇnosti 1 line 1 0.8 1
0.6
line 1 0.8 0.6
0.4
0.4
0.2
0.2
0
0
-0.2 -0.2 -0.4
-0.4
-0.6
-0.6
-0.8
-0.8
-1 0
2
4
6
8
-1
10
-1
Obr. 2.7: Vyplněná oblast ohraničená grafem funkce
-0.5
0
0.5
1
Obr. 2.8: Vyplněný kruh
je prozatı´m spı´sˇe v pocˇa´tcı´ch (vı´ce je rozvinuta jizˇ v beta-verzi GNUplotu). Uzˇivatele´, kterˇ´ı by chteˇli vyplnˇovat oblasti zvoleny´mi barvami a kombinovat vyplnˇova´nı´ s kreslenı´m krˇivek mohou doinstalovat balı´k EpsTk (http://www.epstk.de/). Ten vyuzˇ´ıva´ mozˇnostı´ postscriptu a je pomeˇrneˇ dobrˇe a snadno pouzˇitelny´ v operacˇnı´m syste´mu Linux. Prˇed dalsˇ´ım kreslenı´m nesmı´me zapomenout vra´tit se k vy´chozı´mu nastavenı´ 29
octave:39> __gnuplot_raw__ ("reset;") octave:40> __gnuplot_set__ style data lines; octave:41> __gnuplot_set__ data style lines; nebo restartovat GNU Octave. 2.5.2
3D grafika
K snadne´ uka´zce trojrozmeˇrny´ch grafu˚ mu˚zˇeme pouzˇ´ıt demonstracˇnı´ch funkcı´ sombrero(n) a peaks(n), kde n urcˇuje hustotu sı´teˇ bodu˚, v nichzˇ budou spocˇ´ıta´ny funkcˇnı´ hodnoty (mnozˇstvı´ intervalu˚ pode´l os x a y, tj. poslednı´ argument funkce linspace). Funkce odpovı´dajı´ za´vislostem p sin x2 + y 2 p sombrero (x,y) = , x,y ∈ h−8,8i x2 + y 2 h i 2 2 peaks (x,y) = 3 (1 − x) exp −x2 − (y + 1) − x −10 − x3 − y 5 exp −x2 − y 2 − 5 h i 1 2 − exp − (x + 1) − y 2 , x,y ∈ h−3,3i 3 Vy´stup prˇ´ıkazu˚ octave:1> sombrero(51) octave:2> peaks(51) vidı´me na obra´zcı´ch 2.9 a 2.10. Zadefinujme si nynı´ postupneˇ vlastnı´ funkci dvou promeˇnny´ch. Jak jizˇ bylo naznacˇeno, pro vy´pocˇet jejı´ch funkcˇnı´ch hodnot musı´me vytvorˇit „sı´t’“ bodu˚ (meshgrid) se vsˇemi mozˇny´mi kombinacemi hodnot neza´visle promeˇnny´ch, v nasˇem prˇ´ıpadeˇ x a y. Pro x,y ∈ h−2,2i k tomu pouzˇijeme prˇ´ıkaz meshgrid s tı´m, zˇe deˇlenı´ na osa´ch samotny´ch definujeme podobneˇ jako u dvourozmeˇrny´ch grafu˚ pomocı´ linspace (nebo pomocı´ kroku ve zvolene´m intervalu, naprˇ. -2:.1:2 – snadno oveˇrˇ´ıme, v cˇem nejsou definice stejne´). Pro funkci h i h i 2 2 z = (x − 0,3) + y 2 exp −x2 − (y − 0,2) zada´me octave:3> [x,y]=meshgrid(linspace(-2,2,41),linspace(-2,2,41)); octave:4> z=((x-.3).^2+y.^2).*exp(-x.^2-(y-.2).^2); octave:5> mesh(x,y,z); 30
line 1
line 1
1 0.8 0.6 0.4 0.2 0 -0.2 -0.4
-8
-6
-4
-2
0
2
4
6
8 -8
-6
-4
-2
0
2
4
6
10 8 6 4 2 0 -2 -4 -6 -8
8
3 2 1 -3
Obr. 2.9: sombrero(51)
-2
0 -1
0
-1 1
2
-2 3 -3
Obr. 2.10: peaks(51)
Prˇipomenˇme, zˇe strˇednı´kem na konci rˇa´dku jsme zaka´zali vy´pis delsˇ´ıch matic na obrazovku a vlastnı´ vykreslenı´ provedl prˇ´ıkaz mesh, jehozˇ argumentem jsou matice jednotlivy´ch promeˇnny´ch (x a y prˇitom musı´ tvorˇit sı´t’ „meshgrid“). Pro zachova´nı´ kompatibility s Matlabemr je te´hozˇ vy´sledku dosa´hnout take´ prˇ´ıkazem surf(x,y,z), ale plocha se – na rozdı´l od Matlabur – veˇtsˇinou nevyplnı´ barvami (viz nı´zˇe). Nynı´ mu˚zˇeme opeˇt graf upravovat zmeˇnou patrˇicˇny´ch parametru˚. Zobrazenı´ „vrstevnic“ tj. cˇar spojujı´cı´ch body se stejnou hodnotou z aktivujeme parametrem contour, jejich hustotu zvy´sˇ´ıme na 30 vrstevnic mezi minimem a maximem parametrem cntrparam, pote´ jizˇ vy´sˇe zmı´neˇny´m zpu˚sobem nahradı´me desetinnou tecˇku cˇa´rkou parametrem decimalsign a nakonec obra´zek prˇekreslı´me v nove´m nastavenı´ pomocı´ replot octave:6> octave:7> octave:8> octave:9>
__gnuplot_set__ decimalsign "," __gnuplot_set__ contour __gnuplot_set__ cntrparam level auto 30 replot
Vy´sledek vidı´me na 2.11. Pokud bychom chteˇli vykreslit vrstevnice odpovı´gnuplot set cntrparam dajı´cı´ konkre´tnı´m hodnota´m, pouzˇijeme naprˇ. levels discrete .1, .5, .9 pro hodnoty z = 0,1, z = 0,5 a z = 0,9. Prˇed dalsˇ´ımi u´pravami zopakujeme nastavenı´ vyzkousˇena´ jizˇ u dvourozmeˇrny´ch obra´zku˚ – deaktivujeme popisky parametrem nokey a zmeˇnı´me smeˇr znacˇek na osa´ch tics out. Potom naopak zapneme barevne´ stı´nova´nı´ plochy parametrem pm3d a zmeˇnı´me pouzˇite´ barvy pomocı´ palette.14 14 Doporučujeme za každou změnou provést překreslení příkazem replot, aby se čtenář sám přesvědčil, jaké změny jednotlivé kroky s grafem způsobí. Funkce spojené se stínováním jsou dostupné až v novějších verzích GNUplotu.
31
0,8 0,7 0,6 0,5 0,4 0,3 0,2 0,1 0 -2
line 1 0.7 0.65 0.6 0.55 0.5 0.45 0.4 0.35 0.3 0.25 1,5 2 0.21 0,5 00.15 -1,5 -1 -0,5 0 -1-0,5 0.1 0,5 1 -1,5 1,5 2 -2 0.05
-2 -1,5 -1 -0,5 0
Obr. 2.11: Graf spolu s vrstevnicemi
octave:10> octave:11> octave:12> octave:13>
__gnuplot_set__ __gnuplot_set__ __gnuplot_set__ __gnuplot_set__ ( 0 "blue", 3 octave:14> replot
0,8 0,7 0,6 0,5 0,4 0,3 0,2 0,1 0
0,8 0,7 0,6 0,5 0,4 0,3 0,2 0,1 0
0,5
1
1,5
-0,5 -1 -1,5 2 -2
0
0,5
1
1,5
2
Obr. 2.12: Vrstevnice spolu s barevným stínováním plochy
nokey tics out pm3d palette defined \ "green", 6 "yellow", 10 "red" )
vy´sledek zna´zornˇuje obr. 2.12. Pokud nechceme vykreslovat barevny´ obde´lnı´k v prave´ cˇa´sti zna´zornˇujı´cı´ prˇirˇazenı´ barev hodnota´m z, stacˇ´ı zadat octave:15> __gnuplot_set__ nocolorbox octave:16> replot K dispozici je mnoho barevny´ch „palet“, jezˇ si mu˚zˇe uzˇivatel nadefinovat pouzˇitı´m nejru˚zneˇjsˇ´ıch kombinacı´, z uka´zky vidı´me, zˇe prˇirˇazujeme barvy relativnı´m pozicı´m hodnot z mezi minimem (0) a maximem (10) na desetistupnˇove´ sˇka´le.15 Spektrum od modre´ po cˇervenou lze zı´skat naprˇ. prˇ´ıkazy octave:17> __gnuplot_set__ palette defined \ ( 0 "dark-blue", 1 "blue", 2 "cyan", \ 3 "yellow", 4 "red" , 5 "dark-red" ) octave:18> replot nebo octave:19> __gnuplot_set__ palette rgbformulae 33,13,10; octave:20> replot 15 Hodnoty
0 a 10 neodpovídají skutečným hodnotám z, jde o relativní stupnici.
32
Pro cˇernobı´le´ obra´zky vystacˇ´ıme pouze se stupni sˇede´, naprˇ. octave:21> __gnuplot_set__ palette defined \ ( 0 "dark-grey", 1 "white") octave:22> replot nebo octave:23> __gnuplot_set__ palette defined \ ( 0.5 0.5 0.5 0.5, 1 1 1 1) octave:24> replot K dalsˇ´ım na internetu doporucˇovany´m paleta´m patrˇ´ı take´ kombinace rgbformulae 21,22,23 (odpovı´da´ „hot“ prˇechodu cˇerna´-cˇervena´-zˇluta´-bı´la´). Pokud chceme zmeˇnit polohu plochy vu˚cˇi za´kladnı´ rovineˇ xy, musı´me zmeˇnit parametr ticslevel, uda´vajı´cı´ polohu nejnizˇsˇ´ıch bodu˚ plochy relativneˇ k cele´mu rozsahu osy z. Volbou octave:25> __gnuplot_set__ ticslevel 0 „prˇilepı´me“ plochu na za´kladnu (obr. 2.13). Za´porna´ cˇ´ısla majı´ za na´sledek vyzdvizˇenı´ za´kladny nad graf (nebo jeho cˇa´st), jak vidı´me z obr. 2.14.
0,8 0,7 0,6 0,5 0,4 0,3 0,2 0,1 1,5 2 0 0,5 1 0 -2 -1,5 -0,5 -1 -0,5 0 0,5 -1,5-1 1 1,5 2 -2
0,8 0,7 0,6 2 0,5 1 1,5 0,4 0 0,5 0,3-2 -1,5 -1 -0,5 -0,5 0 0,5 0,2 -1,5-1 1 1,5 2 -2 0,1 0
Obr. 2.13: Volba ticslevel 0
Obr. 2.14: Volba ticslevel -0.5
Dalsˇ´ı promeˇnnou, kterou lze nastavit, je pohled na vykreslenou plochu prostrˇednictvı´m parametru view. Ma´ celkem cˇtyrˇi argumenty – u´hel ϑ ∈ h0,180◦ i rotace okolo osy x, u´hel ϕ ∈ h0,360◦ i rotace okolo osy z, meˇrˇ´ıtko os v za´kladnı´ rovineˇ a konecˇneˇ meˇrˇ´ıtko svisle´ osy z. Prˇednastavene´ hodnoty jsou 60, 30, 1, 1. Na na´sˇ obra´zek zkusme aplikovat naprˇ. octave:26> __gnuplot_set__ view 15, 135, 1, 4
33
Pokud je zapnut mo´d mouse (v OS Windows ve vy´chozı´m nastavenı´), vidı´me aktua´lnı´ hodnoty parametru view v leve´m dolnı´m rohu obrazovky a meˇnit je mu˚zˇeme pomocı´ mysˇi – prˇi stisknute´m leve´m tlacˇ´ıtku obra´zkem ota´cˇ´ıme, prˇi stisknute´m prostrˇednı´m meˇnı´me meˇrˇ´ıtko ve smeˇru osy z. Jak bylo rˇecˇeno, tento doplneˇk, dostupny´ podobneˇ jako barevne´ stı´novanı´ v noveˇjsˇ´ıch verzı´ch, lze kdykoli zapnout prˇ´ıkazem gnuplot set mouse. Specia´lnı´m a hodneˇ uzˇ´ıvany´m je pohled „ze shora“ s vrstevnicemi vykresleny´mi prˇes barevne´ stı´nova´nı´. Dosa´hneme toho nastavenı´m octave:27> __gnuplot_set__ view map Protozˇe hodnoty x i y lezˇ´ı ve stejne´m intervalu, nastavı´me opeˇt stejne´ meˇrˇ´ıtko na osa´ch axis(’equal’). Ukazˇme si take´ zmeˇnu popisu os, k cˇemuzˇ slouzˇ´ı postupneˇ parametry xtics, mxtics a xlabel pro osu x a obdobne´ parametry (naprˇ. mytics nebo zlabel pro osy zby´vajı´cı´)16 . V nasˇ´ı uka´zce umı´stı´me pode´l osy x hlavnı´ znacˇky automaticky od −2 s krokem 0,5 a na ose y konkretnı´ popisky do zvoleny´ch bodu˚ octave:28> __gnuplot_set__ xtics -2, 0.5 octave:29> __gnuplot_set__ ytics \ ("1. bod" -2, "2. bod" 0, "3. bod" 1) Da´le aktivujeme mensˇ´ı znacˇky tak, zˇe urcˇ´ıme jejich pocˇet mezi znacˇkami hlavnı´mi (cozˇ jde, pokud se opakujı´ podle neˇjake´ho algoritmu, jako v prˇ´ıpadeˇ nasˇ´ı osy x) octave:30>
__gnuplot_set__ mxtics 10
Nynı´ jesˇteˇ doplnı´me oznacˇenı´ os, u neˇhozˇ mu˚zˇeme zvolit i jiny´ font. V nasˇem prˇ´ıpadeˇ pouzˇijeme pro osu y standardnı´ font Symbol pro psanı´ symbolu˚ a rˇecky´ch pı´smen, pro osu x skloneˇne´ pı´smo Times-Italic o velikost 30 bodu˚.17 octave:31> octave:32> octave:33>
__gnuplot_set__ xlabel "{/Times-Italic=30 osa x}" __gnuplot_set__ ylabel "{/Symbol abc}" replot
Vy´sledek posloupnosti prˇ´ıkazu˚ je uveden na obr. 2.15. Chceme-li podobneˇ jako v Matlabur vykreslit stı´novanou plochu spolu s cˇarami spojujı´cı´mi body na nı´, pouzˇijeme posloupnost prˇ´ıkazu˚ 16 Opět
platí, že názvy se nezmění, i když pracujeme s jinými proměnnými. fontů se nemusí projevit v každém prostředí, např. na obrazovce počítače nebo v obrázku png. V postscriptových souborech ji ale lze použít téměř vždy, užití speciálních, třeba TEX-ovských fontů (většinou v tomto textu), závisí na konkrétní instalaci prohlížeče postscriptu. 17 Změna
34
αβχ
3. bod 2. bod
0,8 0,7 0,6 0,5 0,4 0,3 0,2 0,1 0 -2 -1,5 -1 -0,5
1. bod -2 -1,5 -1 -0,5 0 0,5 1 1,5 2
osa x
Obr. 2.15: Pohled ze shora s upravenými popisky
octave:1> octave:2> octave:3> octave:4> octave:5>
0
0,5
1
1,5
-0,5 -1 -1,5 2 -2
0
0,5
1
1,5
2
Obr. 2.16: Barevné stínování spolu s vykreslením čar.
[x,y]=meshgrid(linspace(-2,2,41),linspace(-2,2,41)); z=((x-.3).^2+y.^2).*exp(-x.^2-(y-.2).^2); global gnuplot_has_pm3d=1; gnuplot_has_pm3d=1; surf(x,y,z)
Protozˇe funkce surf nastavuje prˇ´ıslusˇne´ parametry pro mesh, budou se pote´ opeˇt obeˇ funkce chovat stejneˇ. Stejne´ho efektu docı´lı´me i postupny´mi kroky octave:1> octave:2> octave:3> octave:4> octave:5> octave:6> octave:7>
[x,y]=meshgrid(linspace(-2,2,41),linspace(-2,2,41)); z=((x-.3).^2+y.^2).*exp(-x.^2-(y-.2).^2); __gnuplot_set__ pm3d at s hidden3d 1 __gnuplot_set__ nohidden3d __gnuplot_set__ nosurf __gnuplot_set__ line style 1 lt 1 lw 1 mesh(x,y,z)
Vy´sledek po u´praveˇ dalsˇ´ıch zna´my´ch parametru˚ octave:8> __gnuplot_set__ nokey octave:9> __gnuplot_set__ nocolorbox octave:10> __gnuplot_set__ tics out octave:11> __gnuplot_set__ decimalsign "," octave:12> __gnuplot_set__ palette rgbformulae 33,13,10 octave:13> __gnuplot_set__ ticslevel 0
35
vidı´me na obr. 2.16. Zby´va´ uve´st, jak vykreslene´ grafy ulozˇit pro dalsˇ´ı pouzˇitı´. Z mnoha dostupny´ch forma´tu˚, z nichzˇ mnohe´ jsou velmi specia´lnı´ se zameˇrˇ´ıme na trˇi. Jako prvnı´ uved’me PNG (Portable Network Graphics), ktery´ postupneˇ i na internetu nahrazuje forma´t GIF dostupny´ ve starsˇ´ıch verzı´ch prˇi zachova´nı´ jeho vlastnostı´. K exportu nasˇeho obra´zku do souboru pokus.png postupneˇ zada´me: octave:14> __gnuplot_set__ term png large octave:15> __gnuplot_set__ output ’pokus.png’ octave:16> replot prˇicˇemzˇ nepovinny´ u´daj large v prvnı´m rˇa´dku pozˇaduje veˇtsˇ´ı pı´smo popisek os. Obr. 2.16 byl zı´ska´n exportem do postscriptove´ho souboru pokus.eps (prˇesneˇji jde Encapsulated PostScript vyvinuty´ firmou Adobe Systems), u neˇhozˇ navı´c pozˇadujeme pro vsˇechny popisky font „Times-Roman“ o velikosti 25 bodu˚ octave:17> __gnuplot_set__ term post eps enh "Times-Roman" 25 octave:18> __gnuplot_set__ output ’pokus.eps’ octave:19> replot Z dalsˇ´ıch mozˇnostı´ uved’me forma´t SVG (Scalable Vector Graphics – sˇka´lovatelna´ vektorova´ grafika neboli znacˇkovacı´ jazyk popisujı´cı´ dvojrozmeˇrnou vektorovou grafiku pomocı´ XML), ktery´ by se meˇl v budoucnu sta´t za´kladnı´m otevrˇeny´m forma´tem pro vektorovou grafiku na internetu (veˇtsˇina pouzˇ´ıvany´ch forma´tu˚ jako GIF, JPG nebo vy´sˇe zmı´neˇne´ PNG jsou forma´ty pro rastrovou grafiku). Cˇtena´rˇ jisteˇ sa´m doplnı´, zˇe v takove´m prˇ´ıpadeˇ by prˇedcha´zejı´cı´ prˇ´ıkazy obsahovaly term svg a naprˇ. output "pokus.svg". Tento forma´t je take´ doporucˇova´n pro na´cˇrtky a grafy v prˇ´ıspeˇvcı´ch do Wikipedie [1]. Protozˇe nastavenı´ pro jeden obra´zek mohou by´t zcela nezˇa´doucı´ pro obra´zky jine´, bude v uka´zka´ch v prˇ´ısˇtı´ kapitole vzˇdy na pocˇa´tku vymaza´nı´ vesˇkery´ch promeˇnny´ch prˇ´ıkazem clear, vymaza´n termina´l prˇ´ıkazem clc a zrusˇeno nastavenı´ graficke´ho vy´stupu octave:1> octave:2> octave:3> octave:4>
clear; clc; __gnuplot_raw__ ("reset;") __gnuplot_set__ data style lines;
Na´sˇ strucˇny´ prˇehled za´kladnı´ch funkcı´ nenı´ zdaleka vycˇerpa´vajı´cı´ a slouzˇ´ı prˇedevsˇ´ım k lepsˇ´ımu pochopenı´ programu˚ a procedur uvedeny´ch v na´sledujı´cı´ch kapitola´ch. Vı´ce informacı´ najde cˇtena´rˇ bud’ v [11, 15] poprˇ. v jiny´ch internetovy´ch zdrojı´ch.
36
Část 3 Pokročilejší funkce Ke studiu a sestavenı´ dynamicky´ch modelu˚ potrˇebujeme jesˇteˇ cykly a logicke´ promeˇnne´ (rozhodova´nı´), jezˇ patrˇ´ı k nezbytne´mu arzena´lu kazˇde´ho programovacı´ho jazyka. Jejich pouzˇitı´ si postupneˇ vysveˇtlı´me na algoritmech pro numericke´ rˇesˇenı´ algebraicky´ch rovnic v te´to kapitole a diferencia´lnı´ch rovnic v kapitole na´sledujı´cı´. Popsane´ skripty budou jednoduchou alternativou k prˇeddefinovany´m procedura´m, ktere´ k teˇmto u´cˇelu˚m program prˇ´ımo nabı´zı´ a jezˇ by take´ rozhodneˇ nemeˇly uniknout nasˇ´ı pozornosti.
3.1
Numerické řešení algebraických rovnic
Pod numericky´m rˇesˇenı´m algebraicky´ch rovnic rozumı´me prˇiblizˇny´ vy´pocˇet rea´lne´ho korˇene (poprˇ. korˇenu˚) rovnice f (x) = 0 na urcˇite´m intervalu (a,b). Za´kladem vsˇech metod je Bolzanova veˇta1 , zarucˇujı´cı´ existenci hledane´ho rˇesˇenı´: Bolzanova veˇta: Necht’ f je funkce spojita´ na intervalu ha,bi. Majı´-li cˇ´ısla f (a) a f (b) ru˚zna´ zname´nka, tj. f (a)·f (b) < 0, pak existuje alesponˇ jeden bod x∗ ∈ (a,b) v neˇmzˇ platı´ f (x∗ ) = 0. Pokud bude zarucˇeno, zˇe dana´ funkce je na intervalu ha,bi rostoucı´ nebo klesajı´cı´, existuje takovy´ bod x∗ pra´veˇ jeden. Pouzˇ´ıvane´ metody se lisˇ´ı zpu˚sobem sestavenı´ tzv. iteracˇnı´ posloupnosti {xn } takove´, zˇe lim xn = x∗ . Absolutneˇ prˇesny´ vy´pocˇet te´to limity vsˇak veˇtsˇinou nenı´ mozˇny´ a proto se spokojujeme s k-ty´m cˇlenem iteracˇnı´ posloupnosti |x∗ − xk | < ε, kde ε je prˇedem dane´ kladne´ cˇ´ıslo – pozˇadovana´ prˇesnost rˇesˇenı´ rovnice. Vy´beˇr konkre´tnı´ metody za´visı´ na vlastnostech funkce f na intervalu (a,b). Jednı´m z du˚lezˇity´ch kriteriı´ je i rychlost konvergence – kolik cˇlenu˚ posloupnosti je zapotrˇebı´ k dosazˇenı´ pozˇadovane´ prˇesnosti. K nejpouzˇ´ıvaneˇjsˇ´ım metoda´m patrˇ´ı: 1. Metoda pu˚lenı´ intervalu (metoda bisekce), jejı´zˇ vy´hodou je jednoducha´ konstrukce zmı´neˇne´ posloupnosti (strˇedy intervalu˚) a minima´lnı´ pozˇadavky na funkci f , nevy´hodou je v neˇktery´ch prˇ´ıpadech pomala´ konvergence. 1 Zatímco na internetu najdeme Bolzanovu větu poměrně snadno (viz např. [13]), klasické učebnice matematické analýzy jako [10] popř. známá přehledná publikace [17] ji uvádí jen jako jednu z bezejmenných vět o vlastnostech spojitých funkcí.
37
2. Metoda teˇtiv (regula falsi, linea´rnı´ interpolace), kde princip vytva´rˇenı´ iteracˇnı´ posloupnosti spocˇ´ıva´ postupne´m nahrazova´nı´ funkce f (x) na prˇ´ıslusˇne´m intervalu u´secˇkami a hleda´nı´ pru˚secˇ´ıku˚ teˇchto u´secˇek s osou x. 3. Metoda tecˇen (Newtonova metoda), v nı´zˇ jsou kladeny veˇtsˇ´ı pozˇadavky na funkci f (existence spojite´ prvnı´ i druhe´ derivace), ale jejı´ vy´hodou je veˇtsˇ´ı rychlost konvergence iteracˇnı´ posloupnosti, du˚lezˇite´ je vsˇak spra´vna´ volba intervalu (a,b), jinak se dokonce mu˚zˇe sta´t, zˇe posloupnost k hledane´ limiteˇ x∗ nebude vu˚bec konvergovat. Mohli bychom zmı´nit i naprˇ. metodu proste´ iterace, z hlediska studentu˚ strˇednı´ch sˇkol na´m vsˇak prˇipadajı´ nejschu˚dneˇjsˇ´ı metoda pu˚lenı´ intervalu a metoda regula falsi. Program GNU Octave ma´ k tomuto u´cˇelu i nadefinovanou proceduru fsolve vyuzˇ´ıvajı´cı´ modifikovanou Newtonovu iteracˇnı´ metodu. Podrobneˇjsˇ´ı informace vcˇetneˇ odvozenı´ potrˇebny´ch vztahu˚ lze najı´t naprˇ. v [3, 9, 14, 18]. Zde si ukazˇme jejich pouzˇitı´ na konkre´tnı´ u´loze prˇevzate´ z [20], kde je pouzˇit program FAMULUS. 3.1.1
Úloha: kometa Hale-Bopp
Kometa Hale-Bopp objevena´ 23. cˇervence 1995 prole´tla 1. dubna 1997 periheliem ve vzda´lenosti rp = 0,9141 AU od Slunce. Hlavnı´ poloosa jejı´ trajektorie meˇrˇ´ı a = 187,8 AU. Nasˇ´ım u´kolem je urcˇit, v jake´ vzda´lenosti od Slunce se nacha´zela v dobeˇ objevenı´ a jakou rychlostı´ se prˇitom pohybovala? Urcˇova´nı´ poloh astronomicky´ch teˇles v konkre´tnı´m cˇase patrˇ´ı v astronomii k za´kladnı´m u´loha´m. Pro pohyb po elipticke´ trajektorii lze odvodit Keplerovu rovnici (viz. naprˇ. [9, 20]) r e κM E − sin E − t = 0, (3.1) a a3 kde E tzv. je excentricka´ anoma´lie uda´vana´ v radia´nech, κ = = 6,67·10−11 m3 ·s−2 ·kg−1 gravitacˇnı´ konstanta, M ≈ 1,989·1030 kg hmotnost Slunce, a = 2,809 5·1013 m a e hlavnı´ poloosa a excentricita elipticke´ trajektorie. Snadno vypocˇ´ıta´me relativnı´ excentricitu√ε = e/a = (a − rp )/a = 0,995 13 a de´lku vedlejsˇ´ı poloosy trajektorie b = a2 − e2 = 18,51 AU. Pro karte´zske´ sourˇadnice polohy komety s pocˇa´tkem ve strˇedu Slunce pak platı´ b a sin E = b sin E, (3.2) a p x2 + y 2 . Podle zada´nı´ od objepro vzda´lenost komety od Slunce r = venı´ komety do pru˚letu periheliem uplynulo 618 dnů neboli 618·24·3 600 = x = a cos E − e,
y=
38
= 53 395 200 s. Tento cˇas a zby´vajı´cı´ hodnoty dosadı´me do Keplerovy rovnice (3.1) a upravı´me ji na tvar E − 0,99513 sin E − 0,00413 = 0
(3.3)
Jde o transcendentnı´ rovnici, kterou neumı´me vyrˇesˇit elementa´rnı´mi prostrˇedky (analyticky), Keplerovou rovnicı´ (3.3) je excentricka´ anoma´lie urcˇena implicitneˇ. Jedna´ se o rovnici typu f (t,E) = 0 a jejı´ rˇesˇenı´ pro zvolene´ t musı´me prove´st neˇkterou z prˇiblizˇny´ch numericky p ´ch metod. Pro t ∈ h0,T i, kde T odpovı´da´ periodeˇ obeˇhu komety, je vy´raz κM/a3 t z intervalu h0,2pi a take´ E je v intervalu h0,2pi. Jakmile zna´me E, vypocˇ´ıta´me sourˇadnice bodu˚ trajektorie v cˇase t podle vztahu˚ (3.2). Jak jizˇ bylo rˇesˇeno, k zı´ska´nı´ numericke´ho rˇesˇenı´ se nabı´zı´ neˇkolik zpu˚sobu˚. Řešení pomocí předdefinované funkce fsolve Nejprve musı´me zadefinovat vlastnı´ funkci (oznacˇme ji f) odpovı´dajı´cı´ leve´ straneˇ rovnice (3.3).2 Definice bude ohranicˇena prˇ´ıkazy function a endfunction. Pote´ do argumentu prˇ´ıkazu fsolve uvedeme na´zev funkce a pocˇa´tecˇnı´ bod, tj. hodnotu, od nı´zˇ ma´ algoritmus rˇesˇenı´ hledat; v nasˇem prˇ´ıpadeˇ 0. Cely´ vy´pis pouzˇity´ch kroku˚ pak vypada´ na´sledujı´cı´m zpu˚sobem 1 2 3 4
octave:1> function y=f(E) > y=E-0.99513*sin(E)-0.0041307; > endfunction octave:2> E=fsolve("f",0)
Prˇedcha´zejı´cı´ rˇa´dky lze samozrˇejmeˇ ulozˇit, naprˇ. do souboru halebp.m a posloupnost prˇ´ıkazu˚ volat prˇ´ıkazem halebp. Volana´ funkce fsolve vypı´sˇe hledane´ rˇesˇenı´ 5
E = 0.25891
Hledana´ hodnota je E = 0,25891 rad. Uvedeny´ postup je sice velmi jednoduchy´ (zada´nı´ zabı´ra´ pouhe´ 4 rˇa´dky), ale neumozˇnˇuje na´m zcela nahle´dnout do algoritmu, jaky´m GNU Octave k tomuto vy´sledku dosˇel a mı´t pod kontrolou vsˇechny parametry.3 Chceme-li pouzˇ´ıt konkre´tnı´ metodu, musı´me zadat prˇesny´ postup vy´pocˇtu. Ma´me-li za´jem o vy´pis veˇtsˇ´ıho pocˇtu desetinny´ch mı´st, zapneme 2 Na rozdíl od Matlabu r nemusí být definice uživatelské funkce uložena v samostatném souboru. 3 K dispozici je ještě analogická funkce fzero, která má více parametrů a umožňuje zadat i požadovanou přesnost.
39
format long, fsolve pak vracı´ E = 0.258914801661345. Abychom nemuseli vypisovat cely´ algoritmus pokazˇde´ znova, je vhodne´ si na kazˇdou metodu vytvorˇit samostatny´ soubor. Prˇipomenˇme, zˇe ho stacˇ´ı napsat v libovolne´m textove´m editoru a ulozˇit s prˇ´ıponou *.m do adresa´rˇe, v neˇmzˇ budeme s GNU Octave pracovat (prˇepneme se do neˇj pomocı´ prˇ´ıkazu cd). Cely´ program pak vola´me jme´nem souboru bez prˇ´ıpony. Řešení metodou půlení intervalu Mozˇna´ podoba programu ulozˇena´ ve zvla´sˇtnı´m souboru (naprˇ. halboppi.m) je na´sledujı´cı´ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
# --- Metoda puleni intervalu pro reseni Keplerovy rovnice # --- Vymazeme hodnoty promennych z~predchazejicich vypoctu clear; # --- a obsah terminalu clc; # --- zadani konstant a=187.8*1.4959787e11; rp=0.9141*1.4959787e11; kappa=6.672e-11; M=1.9891e30; t=618*24*3600; # --- Definice funkce function y=f(E) y=E-0.99513*sin(E)-0.00413; endfunction # --- Pozadovana presnost presnost=1e-6; # --- Zaciname merit dobu vypoctu t0=clock(); # --- Krajni body a stred intervalu x1=0; # levy okraj x2=pi; # pravy okraj f1=f(x1); # leva funkcni hodnota f2=f(x2); # prava funkcni hodnota k=1; # krok vypoctu xk=0.5*(x1+x2); # stred intervalu fk=f(xk); # hodnota funkce ve stredu intervalu # --- Formatovany vypis hodnot printf("k=%f xk=%f f(xk)=%.20f\n", [k,xk,fk]); # --- Cyklus, ktery se opakuje do dosazeni pozadovane presnosti while abs(x1-xk)>2*presnost if (f1*fk<0) x2=xk; else
40
35 36 37 38 39 40 41 42 43 44 45 46 47
x1=xk; endif k=k+1; xk=0.5*(x1+x2); fk=f(xk); # --- Formatovany vypis hodnot printf("k=%f xk=%f f(xk)=%.20f\n", [k,xk,fk]); endwhile # --- Ukoncime mereni trvani vypoctu a vypiseme cas potrebny na beh cyklu casvypoctu=etime(clock(),t0) # --- Vypocteme polohu a rychlost v~pozadovanem okamziku r=sqrt((a*cos(xk)-(a-rp))^2+(sqrt(a^2-(a-rp)^2)*sin(xk))^2)/1.5e11 v=sqrt(kappa*M*(2/(r*1.5e11)-1/a))/1e3
Protozˇe jednotlive´ cˇa´sti jsou okomentova´ny a meˇlo by by´t zrˇejme´, jaky´ u´cˇel jednotlive´ cˇa´sti majı´, doplnˇme jen pa´r pozna´mek. Komenta´rˇe, tj. rˇa´dky, ktere´ nebude GNU Octave prova´deˇt a interpretovat, mohou by´t uvozeny bud’ znakem #, nebo % (z du˚vodu kompatibility s Matlabemr ). Psanı´ komenta´rˇu˚ lze podobneˇ jako u jiny´ch programovacı´ch jazyku˚ vrˇele doporucˇit. Cˇinı´ ko´d prˇehledneˇjsˇ´ım a srozumitelneˇjsˇ´ım jak pro jine´ uzˇivatele, tak pro samotne´ho autora, pokud se k programu vracı´ po delsˇ´ı dobeˇ. Ota´zkou volby je pouzˇitı´ diakritiky v komenta´rˇ´ıch, zde se jı´ z du˚vodu prˇenositelnosti mezi ru˚zny´mi operacˇnı´mi syste´my s ru˚zny´m ko´dova´nı´m cˇesˇtiny vyhy´ba´me. Zada´va´me-li vstupnı´ hodnoty (rˇa´dky 7–11) veˇtsˇinou nepozˇadujeme jejich vypsa´nı´ na obrazovku, proto jsou ukoncˇeny znakem ;. Naopak poslednı´ rˇa´dky tento ukoncˇovacı´ znak nemajı´, nebot’chceme vypocˇtene´ hodnoty s 2 h i2 q 2 2 a cos xk − (a − rp ) + a − (a − rp ) sin xk r = s v
=
κM
2 1 − r a
vypsat, prˇitom je prˇ´ımo prˇeva´dı´me na astronomicke´ jednotky AU resp. na km·s−1 . Prˇi beˇhu cyklu chceme, aby program postupneˇ vypisoval jak cˇ´ıslo kroku k iteracˇnı´ posloupnosti, strˇed intervalu v tomto kroku xk (momenta´lnı´ aproximaci hledane´ho rˇesˇenı´) a hodnotu funkce v tomto bodeˇ f (xk ) (posledneˇ jmenovanou na 20 desetinny´ch mı´st) prˇ´ıkazem printf. V programu se setka´va´me s trˇemi novy´mi prvky, o nichzˇ jesˇteˇ nebyla v textu rˇecˇ. Jde jednak o meˇrˇenı´ cˇasu, ktery´ pocˇ´ıtacˇ spotrˇebuje na provedenı´ vy´pocˇtu nebo neˇktere´ jeho cˇa´sti. Slouzˇ´ı k tomu prˇ´ıkaz etime, ktery´ spocˇte rozdı´l dvou cˇasovy´ch u´daju˚ zadany´ch jako jeho argumenty. Syste´movy´ cˇas pak vracı´ funkce clock() jako vektor se slozˇkami odpovı´dajı´cı´mi roku, meˇsı´ci, dni, hodineˇ, minuta´m a 41
sekunda´m. Cˇas potrˇebny´ na provedenı´ vy´pocˇtu je orientacˇnı´, nebot’za´visı´ nejen na hardwarove´ konfiguraci (procesor, operacˇnı´ pameˇt’apod.), ale i na procesech beˇzˇ´ıcı´ch momenta´lneˇ v pocˇ´ıtacˇi na pozadı´. Proto se u´daj i u dvou bezprostrˇedneˇ na´sledujı´cı´ch stejny´ch vy´pocˇtech mu˚zˇe o neˇco lisˇit (azˇ v rˇa´du sekund). Dalsˇ´ım novy´m prvkem je rozhodovacı´ podmı´nka if (32.–36. rˇa´dek) veˇtvı´cı´ vy´pocˇet na za´kladeˇ vyhodnocenı´ neˇjake´ho logicke´ho vy´razu, veˇtvenı´ je uzavrˇeno vy´razem endif, obeˇ mozˇnosti oddeˇluje else. Prvnı´ cˇa´st se provede, pokud je podmı´nka veˇtvenı´ splneˇna, druha´ pokud splneˇna nenı´. V nasˇem prˇ´ıpadeˇ jde o rozhodutı´, v ktere´m z intervalu˚ hx1 ,xk i nebo hxk ,x2 i bude vy´pocˇet pokracˇovat. Vybrat musı´me ten, v neˇmzˇ lezˇ´ı nulovy´ bod; v neˇm musı´ mı´t funkcˇnı´ hodnoty opacˇna´ zname´nka, tj. jejich soucˇin bude za´porny´. Lezˇ´ı-li v hx1 ,xk i bude v dalsˇ´ım kroku xk hornı´, v opacˇne´m prˇ´ıpadeˇ dolnı´ hranicı´ studovane´ho intervalu. Poslednı´m prvkem, o neˇmzˇ se zmı´nı´me, je cyklus typu while (31.–42. rˇa´dek) probı´hajı´cı´ tak dlouho, dokud je splneˇna zadana´ podmı´nka, a ukoncˇeny´ vy´razem endwhile. V nasˇem prˇ´ıpadeˇ jde o dosazˇenı´ prˇesnosti vy´sledku – chceme, aby se poslednı´ nalezene´ xk od skutecˇne´ho rˇesˇenı´ lisˇilo me´neˇ nezˇ o zvolene´ ε. Protozˇe prˇi poslednı´m kroku najdeme jesˇteˇ strˇed intervalu, stacˇ´ı testovat, zda je xk od jednoho z krajnı´ch bodu˚ (zde x1 ) vzda´leno vı´ce nezˇ 2ε. Po zada´nı´ prˇ´ıkazu halboppi se na obrazovce objevı´ vy´pis 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
k=1.000000 xk=1.570796 f(xk)=0.57153632679489663193 k=2.000000 xk=0.785398 f(xk)=0.07760499223527936308 k=3.000000 xk=0.392699 f(xk)=0.00774931764925237444 k=4.000000 xk=0.196350 f(xk)=-0.00192069129854763841 k=5.000000 xk=0.294524 f(xk)=0.00152332039781002439 k=6.000000 xk=0.245437 f(xk)=-0.00048994036543237827 k=7.000000 xk=0.269981 f(xk)=0.00043675232187719883 k=8.000000 xk=0.257709 f(xk)=-0.00004569147745284684 k=9.000000 xk=0.263845 f(xk)=0.00019064495530215532 k=10.000000 xk=0.260777 f(xk)=0.00007126924592972851 k=11.000000 xk=0.259243 f(xk)=0.00001248874645650745 k=12.000000 xk=0.258476 f(xk)=-0.00001667618293280625 k=13.000000 xk=0.258859 f(xk)=-0.00000211244972662082 k=14.000000 xk=0.259051 f(xk)=0.00000518346210189903 k=15.000000 xk=0.258955 f(xk)=0.00000153433504570567 k=16.000000 xk=0.258907 f(xk)=-0.00000028935007293472 k=17.000000 xk=0.258931 f(xk)=0.00000062241929662567 k=18.000000 xk=0.258919 f(xk)=0.00000016651631525900 k=19.000000 xk=0.258913 f(xk)=-0.00000006142145290121 k=20.000000 xk=0.258916 f(xk)=0.00000005254628767694 k=21.000000 xk=0.258915 f(xk)=-0.00000000443786849456 casvypoctu = 0.012676 r = 7.1242 v = 15.610
42
Vidı´me, zˇe funkcˇnı´ hodnota f (xk ) v nalezeny´ch bodech se ve 3. sloupci sta´le vı´ce blı´zˇ´ı 0, hledanou cˇ´ıselnou aproximacı´ rˇesˇenı´ je poslednı´ hodnota E = xk = = (0,258 915 ± 10−6 ) rad. K dosazˇenı´ te´to prˇesnosti aproximace x∗ z Bolzanovy veˇty (viz s. 37) jsme potrˇebovali k = 21 kroku˚. Řešení metodou tětiv Vy´pis programu pro rˇesˇenı´ Keplerovy rovnice metodou teˇtiv mu˚zˇe by´t trˇeba v souboru halbopte.m na´sledujı´cı´ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
# --- Metoda tetiv pro reseni Keplerovy rovnice # --- Vymazeme hodnoty promennych z~predchazejicich vypoctu clear; # --- a obsah terminalu clc; # --- Definice funkce function y=f(E) y=E-0.99513*sin(E)-0.00413; endfunction # --- Pozadovana presnost presnost=1e-8; # --- Zaciname merit dobu vypoctu t0=clock(); # --- Krajní body a=0; # levy okraj b=pi; # pravy okraj fa=f(a); # leva funkcni hodnota fb=f(b); # prava funkcni hodnota k=1; # krok vypoctu x(k)=(a*fb-b*fa)/(fb-fa); # aproximace řešení fk=f(x(k)); # hodnota funkce ve stredu intervalu # --- Formátovaný výstup hodnot printf("k=%f x(k)=%f f(xk)=%.20f\n", [k,x(k),fk]); # --- Cyklus while abs(f(x(k)))>presnost k=k+1; if (f(a)*f(x(k-1))<0) x(k)=(a*f(x(k-1))-x(k-1)*fa)/(f(x(k-1))-fa); else x(k)=(x(k-1)*fb-b*f(x(k-1)))/(fb-f(x(k-1))); endif fk=f(x(k)); # --- Formátovaný výstup hodnot printf("k=%f xk=%f f(xk)=%.20f\n", [k,x(k),fk]); endwhile casvypoctu=etime(clock(),t0)
43
Zde v testovacı´ podmı´nce cyklu while na 25. rˇa´dku testujeme, zda se hodnota funkce v hledane´m bodeˇ f (xk ) lisˇ´ı od 0 vı´ce nezˇ je pozˇadovana´ prˇesnost. Vidı´me, zˇe od prˇedcha´zejı´cı´ metody se program skutecˇneˇ lisˇ´ı jen konstrukcı´ bodu xk . Prˇ´ıkaz halbopte pak vypı´sˇe k=1.000000 x(k)=0.004130 f(xk)=-0.00410987521635498669 k=2.000000 xk=0.008234 f(xk)=-0.00408980538600391998 ... k=416.000000 xk=0.258915 f(xk)=-0.00000001033584787723 k=417.000000 xk=0.258915 f(xk)=-0.00000000997460833894 casvypoctu = 0.26952
Pro danou rovnici je metoda regula falsi evidentneˇ me´neˇ efektivnı´, nebot’ prˇi stejne´ prˇesnosti potrˇebujeme prˇes 400 kroku˚. Vidı´me, zˇe vsˇemi zpu˚soby dosta´va´me E ≈ (0,258 915 ± 10−6 ) rad. Dosazenı´m do vztahu˚ (3.2) dostaneme vzda´lenost komety od Slunce v dobeˇ jejı´ho objevenı´ e vzda´lenost komety od Slunce r = 7,12 AU a rychlost v tomto okamzˇiku v = 15,6 km·s−1 . Za´jemce o dalsˇ´ı strˇedosˇkolske´ u´lohy rˇesˇene´ pomocı´ GNU Octave lze odka´zat na pra´ci [9], podobne´ u´lohy rˇesˇene´ programem FAMULUS najde v textu [18].
3.2
Numerické řešení diferenciálních rovnic
Numericke´ rˇesˇenı´ soustavy diferencia´lnı´ch rovnic je ja´drem dynamicke´ho modelova´nı´. V programu GNU Octave ma´me na vy´beˇr, zda sestavı´me cyklus odpovı´dajı´cı´ neˇktere´ z Eulerovy´ch metod cˇi metod Rungova-Kuttova typu nebo zda vyuzˇijeme prˇeddefinovane´ funkce lsode.4 Jejı´ pouzˇitı´ ilustrujeme na dvou konkre´tnı´ch prˇ´ıkladech. 4 Jde také o algoritmus patřící mezi Rungovy-Kuttovy metody nazvané původně po německých matematicích Carlu Davidu Tolmé Rungovi (1856–1927) a Martinu Wilhelmu Kuttovi (1867-1944). Na nějaké variantě Rungových-Kutových metod jsou vesměs založeny procedury pro řešení obyčejných diferenciálních rovnic ve většině matematických programů FAMULUS nevyjímaje. Pro uživatele znalé Matlabu jsou v GNU Octave navíc funkce ode23, ode45, ode78 a rk2fixed, rk4fixed, rk8fixed pro Rungovy-Kutovy metody naznačeného řádu s proměnným, resp. fixovaným (pevným) krokem, jejichž autorem je Marc Compere. Zde se přidržíme pouze funkce lsode. Název samotný je akronymem k „Livermore Solver for ODEsÿ a vychází z fortranovského balíčku Alana Hindmarshe (http://www.netlib.org/odepack/). V podstatě jde opět o variantu Rungovy-Kuttovy metody 4. řádu s tím, že konkrétní podmetodu (Adamsovu apod.) lze volit parametrem funkce lsode options.
44
3.2.1
Van der Polův oscilátor
Van der Polu˚v oscila´tor sehra´l vy´znamnou u´lohu ve vy´voji nelinea´rnı´ dynamiky. Z matematicke´ho hlediska je popsa´n van der Polovou rovnicı´ dy d2 y + µ y2 − 1 + y = 0, 2 dt dt
(3.4)
kde µ = 0 je konstantnı´ parametr. Rovnice tohoto typu se objevila prˇi studiu nelinea´rnı´ch elektricky´ch obvodu˚ v prvnı´ch radioprˇijı´macˇ´ıch v roce 1926 holandsky´m inzˇeny´rem B. van der Polem, podobnou rovnicı´ se zaby´val uzˇ lord Rayleigh okolo roku 1880 v souvislosti s nelinea´rnı´mi vibracemi [7, 21]. Rovnice (3.4) se od rovnice harmonicke´ho oscila ´ toru lisˇ´ı prostrˇednı´m cˇlenem odpovı´dajı´cı´m nelinea´rnı´mu tlumenı´ µ y 2 − 1 dy/dt. Pro |y| > 1 vede ke skutecˇne´mu kladne´mu tlumenı´, naopak pro |y| < 1 prˇedstavuje negativnı´ tlumenı´ (buzenı´) syste´mu. Jiny´mi slovy, tlumı´ velke´ a budı´ male´ vy´chylky. Lze odhadnout, zˇe syste´m mu˚zˇe prˇejı´t do stavu, kdy se oba procesy vyrovnajı´ a z obecneˇjsˇ´ıch veˇt lze uka´zat [21], zˇe pro kazˇde´ µ > 0 ma´ rovnice jednoznacˇneˇ urcˇeny´ limitnı´ periodicky´ rezˇim. Jak uka´zˇeme, s rostoucı´m µ se tyto limitnı´ kmity vı´c a vı´ce lisˇ´ı od kmitu˚ harmonicky´ch. Pro pouzˇitı´ funkce lsode rozdeˇlı´me diferencia´lnı´ rovnici 2. rˇa´du na soustavu rovnic 1. rˇa´du dy dt d2 y d dy = dt2 dt dt
= x2 , dy = −µ y 2 − 1 − y = −µ x21 − 1 x2 − x1 . dt
Takto zapsana´ na´m umozˇnˇuje zave´st dveˇ matice (vektory). Jedna, jizˇ oznacˇ´ıme x obsahuje v prvnı´m rˇa´dku x(1) hodnoty y a ve druhe´m x(2) hodnoty 1. derivace dy/dt. Druha´ matice xdot se skla´da´ z derivacı´ v matice prvnı´, tj. z prvnı´ a druhe´ derivace y. Soustavu proto lze prˇepsat ve tvaru xdot(1)
= x(2),
xdot(2)
= −µ x(1)2 − 1 x(2) − x(1).
Soubor vanderpol.m pak mu˚zˇe mı´t na´sledujı´cı´ podobu 1 2 3 4 5
# --- van der Poluv oscillator # --- Vymazeme hodnoty promennych z~predchazejicich vypoctu clear # --- a obsah terminalu clc;
45
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
global mu mu=.1; # --- pocatecni podminky x0=[0.5; 0]; # --- definice diferencialni rovnice function xdot = vdpol(x,t) global mu; xdot = [x(2); -mu*(x(1).^2-1).*x(2)-x(1)]; endfunction # --- oblast integrace t=linspace(0,100,5000); # --- reseni soustavy rovnic vdp=lsode( "vdpol",x0, t); % vykresleni zavislosti plot(t,vdp(:,1)) % vykresleni rychlosti v zavislosti na poloze ("fazovy prostor") plot(vdp(:,1),vdp(:,2))
Vsˇimneˇme si, zˇe pokud prˇirˇazujeme hodnotu neˇjake´ konstanteˇ, kterou potom vyuzˇ´ıva´me v definici funkce (v nasˇem prˇ´ıpadeˇ jde o parametr µ = 0,1), musı´me ji deklarovat jako globa´lnı´ konstantu prˇ´ıkazem global na pocˇa´tku prˇed prˇirˇazenı´m hodnoty (6. rˇa´dek) i v teˇle funkce (12. rˇa´dek). Pokud se vyskytuje pouze v definici funkce, mohli bychom se tomu vyhnout tak, zˇe bychom pouze v definici funkce nahradili 12. rˇa´dek za mu=0.1. Vzhledem k tomu, zˇe jde o rovnici 2. rˇa´du (nebo po provedene´ u´praveˇ soustavu dvou rovnic 1. rˇa´du), zada´va´me na 9. rˇa´dku pocˇa´tecˇnı´ podmı´nky jako vektor x0, jehozˇ slozˇky odpovı´dajı´ volbeˇ y0 = 0,5 a v0 = dy/dt|0 = 0. Cˇasovy´ interval, v neˇmzˇ bude provedena integrace pak zada´va´me na 16. rˇa´dku pomocı´ na´m jizˇ zna´me´ho prˇ´ıkazu linspace; zde konkre´tneˇ t ∈ h0,100i s a interval je rozdeˇlen na 5000 bodu˚. Tı´mto deˇlenı´m urcˇujeme integracˇnı´ krok a tı´m i prˇesnost vy´sledku poprˇ. hladkost vykresleny´ch krˇivek – pokud je deˇlenı´ jemne´, trva´ vy´pocˇet de´le, pokud je ale prˇ´ılisˇ hrube´, namı´sto krˇivek dostaneme lomene´ cˇa´ry a vy´sledek nebude dostatecˇneˇ prˇesny´. Samotna´ procedura lsode, ktera´ prova´dı´ vlastnı´ numerickou integraci, vracı´ matici (zde pojmenovanou vdp), jejı´zˇ sloupce postupneˇ odpovı´dajı´ velicˇina´m x(1) a x(2), tj. v nasˇem prˇ´ıpadeˇ hodnota´m y a prvnı´ derivace dy/dt. Chceme-li potom pouze hodnoty y, vybı´ra´me na 20. rˇa´dku pouze prvnı´ sloupec te´to matice vdp(:,1), chceme-li druhy´, pouzˇijeme vdp(:,2). Za´vislosti y = y(t) a v = = dy/dt = v(y) jsou pro µ = 0,1 a uvedene´ pocˇa´tecˇnı´ podmı´nky zna´zorneˇny na obr. 3.1 a 3.2. Dodejme, zˇe ve vy´pisu programu nejsou uvedeny prˇ´ıkazy ovlivnˇujı´cı´ vlastnosti grafu popsane´ v cˇa´sti 2.5. Vidı´me, zˇe pru˚beˇh kmitu˚ prˇipomı´na´ harmonicky´ pohyb. Z trajektorie pohybu ve fa´zove´m prostoru y − v je zrˇejma´ odlisˇnost, nebot’ harmonicky´m kmitu˚m by odpovı´dala elipsa, zatı´mco v nasˇem prˇ´ıpadeˇ limitnı´ fa´zova´ trajektorie prˇipomı´na´ elipsu poneˇkud deformovanou. 46
2,5
2
2 1,5
1
1
0,5
0,5
v/cm⋅s-1
y/cm
1,5
0 –0,5
0 –0,5 –1
–1
–1,5
–1,5
–2
–2
–2,5 0
20
40
60
80
–2
100
–1,5
–1
–0,5
t/s
Obr. 3.1: Závislost y = y(t) pro µ = 0,1
0 y/cm
0,5
1
1,5
2
Obr. 3.2: Závislost v = v(y) pro µ = 0,1
Pro vysˇsˇ´ı hodnoty parametru µ vynikne odlisˇnost od harmonicke´ho pohybu jesˇteˇ vı´ce, cozˇ obra´zˇejı´ obr. 3.3 a 3.4 vykreslene´ pro stejne´ pocˇa´tecˇnı´ podmı´nky. Cˇtena´rˇ si mu˚zˇe sa´m oveˇrˇit, zˇe limitnı´ kmity oscila´toru za´visejı´ pouze na parametru 15
2,5 2
10
1,5
5
0,5
v/m⋅s-1
y/cm
1 0 –0,5
0 –5
–1 –1,5
–10
–2
–15 –2,5 –2 –1,5 –1 –0,5
–2,5 0
20
40
60
80
100
t/s
Obr. 3.3: Závislost y = y(t) pro µ = 10
0 0,5 y/cm
1
1,5
2
2,5
Obr. 3.4: Závislost v = v(y) pro µ = 10
µ a nikoli na zvoleny´ch pocˇa´tecˇnı´ch podmı´nka´ch (s vy´jimkou prˇ´ıpadu˚, kdy ke kmitu˚m vu˚bec nedojde jako u trivia´lnı´ volby y0 = v0 = 0). 3.2.2
Lorenzův atraktor
Na za´veˇr kapitoly si ukazˇme pouzˇitı´ procedury \lsode u soustavy 3 obycˇejny´ch diferencia´lnı´ch rovnic. Jako model takove´ soustavy pouzˇijeme zna´my´
47
Lorenzu˚v atraktor, ktery´ se stal jednı´m ze symbolu˚ nelinea´rnı´ dynamiky a teorie chaosu. Je nazva´n po meteorologovi Edwardu Nortonu Lorenzovi, jenzˇ v roce 1963 z hydrodynamicky´ch rovnic vynucene´ konvekce v atmosfe´rˇe za silneˇ zjednodusˇeny´ch prˇedpokladu˚ odvodil syste´m trˇ´ı prova´zany´ch nelinea´rnı´ch diferencia´lnı´ch rovnic. Numericke´ rˇesˇenı´ pak odhalilo typicky chaoticke´ chova´nı´ – silnou za´vislost na pocˇa´tecˇnı´ch podmı´nka´ch, ktera´ komplikuje prˇedpoveˇd’ vy´voje syste´mu. Nenı´ jisteˇ prˇekvapenı´m, zˇe prˇ´ıklad takovy´ch syste´mu˚ poskytuje pra´veˇ meteorologie a ne na´hodou je mozˇne´ pocˇası´ spolehliveˇ prˇedpovı´dat jen na neˇkolik na´sledujı´cı´ch dnu˚. Samotne´mu Lorenzovi se podarˇilo zpopularizovat podobne´ jevy pomocı´ „efektu ma´vnutı´ moty´lı´ho krˇ´ıdla“.5 Lorenzovy rovnice lze zapsat ve tvaru [21] dx dt dy dt dz dt
= σ (y − x) ,
(3.5a)
= x (r − z) − y,
(3.5b)
= xy − bz,
(3.5c)
kde σ, r a b jsou neza´porne´ hydrodynamicke´ parametry – σ tzv. Prandtlovo cˇ´ıslo, r tzv. Rayleighovo cˇ´ıslo (b pojmenova´nı´ nema´). Chceme-li vykreslit zna´my´ obra´zek odpovı´dajı´cı´ jednomu z rˇesˇenı´ Lorenzovy´ch rovnic, mu˚zˇe soubor lorentz.m obsahovat na´sledujı´cı´ ko´d 1 2 3 4 5 6 7 8 9 10 11 12 13 14
# --- Lorenz atractor # --- Vymazeme hodnoty promennych z~predchazejicich vypoctu clear # --- a obsah terminalu clc; x=zeros(3,1); # --- definice diferencialni rovnice function xdot = loren(x,t) sigma=10; r=28; b=8/3; xdot = [sigma * (x(2) - x(1)); x(1) * (r - x(3))-x(2); x(1) * x(2) - b * x(3)];
5 Citlivost na změnu počátečních podmínek je ilustrována tvrzeními typu, že mávnutí motýlích křídel v Brazílii může rozhodnout o tom, zda texaské pláně budou zasaženy tornádem či nikoli. Dodejme, že Lorenzova práce zůstala až do počátku 70.-ých let 20. století bez větší odezvy [7, 21].
48
15 16 17 18 19 20 21 22 23 24 25 26
endfunction # --- oblast integrace t=(0:0.01:60)’ # --- reseni soustavy rovnic lr = lsode("loren", [3;14;50], t); # --- vykresleni reseni - trojrozmerna krivka __gnuplot_set__ noborder __gnuplot_set__ noxtics __gnuplot_set__ noytics __gnuplot_set__ noztics __gnuplot_set__ nokey plot3(lr(:,1),lr(:,2),lr(:,3));
Upozorneˇme opeˇt na dosud nezmı´neˇne´ prˇ´ıkazy a odlisˇnosti od programu pro van der Polu˚v oscila´tor. Na prvnı´ pohled vidı´me, zˇe zde chybı´ globa´lnı´ deklarace konstant prˇ´ıkazem global, jejich hodnoty jsou uvedeny prˇ´ımo v definici funkce definujı´cı´ soustavu Lorenzovy´ch diferencia´lnı´ch rovnic na 9.–11. rˇa´dku. Pocˇa´tecˇnı´ podmı´nky tentokra´t nevypisujeme na zvla´sˇtnı´ rˇa´dek, ale zapisujeme prˇ´ımo jako druhy´ argument procedury lsode. V tomto prˇ´ıpadeˇ jde o pocˇa´tecˇnı´ podmı´nky x0 = 3, y0 = 14 a z0 = 50 (matice [3;14;50]). Oblast integrace je da´na na 17. rˇa´dku intervalem t ∈ h0,60i s, hodnoty v neˇm meˇnı´me s krokem ∆t = 0,01 s. Upozorneˇme take´, zˇe oznacˇenı´ funkce (zde loren) musı´ by´t odlisˇne´ od jme´na cele´ho souboru (bez prˇ´ıpony, zde lorentz). Protozˇe rˇesˇ´ıme soustavu rovnic prvnı´ho rˇa´du, nenı´ nutne´ ji nijak prˇeskupovat, ale lze ji prˇ´ımo prˇepsat do definice funkce na 12.–14. rˇa´dku. Pracujeme s maticemi x o slozˇka´ch x1 = x, x2 = y, x3 = z a xdot obsahujı´cı´ derivace x podle cˇasu, tj. xdot1 = dx/dt, xdot2 = = dy/dt a xdot3 = dz/dt. Procedura lsode pak vracı´ matici (zde oznacˇenou lr) se sloupci odpovı´dajı´cı´mi slozˇka´m matice x, tj. sourˇadnicı´m x, y, z. Chceme-li vykreslit prostorovou krˇivku, jejı´zˇ body musı´ by´t urcˇeny trˇemi sourˇadnicemi, pouzˇijeme prˇ´ıkaz plot3, jehozˇ argumentem jsou pra´veˇ hodnoty jednotlivy´ch sourˇadnic. Nepovinnou, ale cˇasto uzˇ´ıvanou cˇa´stı´ je deklarace nulove´ matice x na 6. rˇa´dku pomocı´ funkce zeros. Konkre´tneˇ zeros(3,1) vytvorˇ´ı matici 3 × 1 obsahujı´cı´ same´ 0, je ekvivalentnı´ za´pisu [0;0;0]. Konecˇneˇ prˇ´ıkazy na rˇa´dcı´ch 21–25 ovlivnˇujı´ vzhled obra´zku – postupneˇ zakazujı´ vykreslova´nı´ os, znacˇek na nich a popisu obra´zku. Vy´sledek je pak zna´zorneˇn na obr. 3.5a. Trajektorie se protı´na´ jen zda´nliveˇ (jde o du˚sledek projekce na rovinu) a prˇekla´pı´ se zprava doleva a nazpa´tek vzˇdy po neˇkolika obeˇzı´ch na kazˇde´ straneˇ, prˇicˇemzˇ pocˇet obeˇhu˚ na kazˇde´ straneˇ odpovı´da´ na´hodne´ posloupnosti. V prostoru je vsˇak trajektorie lokalizova´na v pomeˇrneˇ u´zke´ oblasti nazy´vane´ podle Ruelleho a Takense od roku 1971 podivny´m atraktorem. S podobny´mi rovnicemi se setka´me u laseru˚, dynam a neˇktery´ch typu˚ vodnı´ch kol.
49
Poucˇne´ je i vykreslenı´ za´vislostı´ jednotlivy´ch sourˇadnic na cˇase prˇ´ıkazy typu plot(t,lr(:,1)) pro x = x(t) a analogicky pro y i z; vidı´me je na obr. 3.5b–d. Rˇesˇenı´ odpovı´da´ aperiodicky´m oscilacı´m, jezˇ se nikdy zcela prˇesneˇ neopakujı´ [21]. Cˇtena´rˇi doporucˇujeme vyzkousˇet i jine´ pocˇa´tecˇnı´ hodnoty poprˇ. hodnoty hydrodynamicky´ch parametru˚ (naprˇ. hodnotu r = 99,96). 20 15 10 5 x
0 –5 –10 –15 –20 0
(a) Prostorová křivka
10
20
30 t/s
40
50
60
(b) Závislost x = x(t)
30
50 45
20
40 35
10 z
y
30 0
25 20
–10
15 10
–20
5 –30
0 0
10
20
30 t/s
40
50
60
(c) Závislost y = y(t)
0
10
20
30 t/s
40
50
(d) Závislost z = z(t)
Obr. 3.5: Řešení Lorenzových rovnic pro σ = 10, r = 28, b = 8/3 a počáteční podmínky x0 = 3, y0 = 14 a z0 = 50
50
60
Část 4 Příklady jednoduchých dynamických modelů V poslednı´ kapitole strucˇneˇ uvedeme prˇ´ıklady skriptu˚ pro GNU Octave, jimizˇ lze rˇesˇit diferencia´lnı´ rovnice popisujı´cı´ konkre´tnı´ fyzika´lnı´ syste´my a jevy. Prˇeva´zˇna´ veˇtsˇina z nich byla navı´c teoreticky popsa´na v prvnı´ cˇa´sti textu a modelova´na pomocı´ programu Coach. Nebudeme proto opakovat odvozenı´ cˇi sestavenı´ pohybovy´ch rovnic, zameˇrˇ´ıme se na programova´nı´ v GNU Octave a prezentaci graficky´ch vy´sledku˚. Vy´znam te´meˇrˇ vsˇech pouzˇity´ch prˇ´ıkazu˚ byl popsa´n v prˇedcha´zejı´cı´ch kapitola´ch (k rychle´ orientaci lze vyuzˇ´ıt i rejstrˇ´ık pouzˇity´ch prˇ´ıkazu˚ na s. 74). Pro prˇehlednost nebudeme uva´deˇt prˇ´ıkazy definujı´cı´ pouze vzhled obra´zku, popisky os apod., jezˇ byly shrnuty v cˇa´sti 2.5. Modely jsou rozdeˇleny podle pouzˇite´ integracˇnı´ metody, tj. Eulerovy, Rungovy-Kuttovy poprˇ. pomocı´ prˇeddefinovane´ funkce lsode. Dodejme, zˇe dalsˇ´ı zajı´mave´ u´lohy rˇesˇene´ pomocı´ GNU Octave najde cˇtena´rˇ v diplomove´ pra´ci [9], rˇesˇenı´ pomocı´ programu FAMULUS v [12, 18].
4.1 4.1.1
Modely využívající Eulerovu metodu Balistická křivka
Modelujeme sˇikmy´ vrh v odporujı´cı´m prostrˇedı´ popsany´ v cˇa´sti 1.4, odpovı´dajı´cı´ program pro FAMULUS najde cˇtena´rˇ v [24]. Uvazˇujeme teˇleso tvaru koule o hmotnosti m a polomeˇru R vrzˇene´ pocˇa´tecˇnı´ rychlostı´ v0 pod u´hlem α k horizontu. Prˇi pohybu na neˇj pu˚sobı´ konstantnı´ tı´hova´ sı´la mg svisle dolu˚ a proti pohybu sı´la odporu prostrˇedı´ u´meˇrna´ druhe´ mocnineˇ velikosti okamzˇite´ rychlosti podle Newtonova vztahu F o = −kvv = −C%Svv /2, kde C je soucˇinitel odporu za´visejı´cı´ na tvaru teˇlesa, % hustota prostrˇedı´ (uvazˇujeme vzduch) a S = pR2 plocha prˇ´ıcˇne´ho pru˚rˇezu strˇely. Zvolı´me-li standardneˇ osu x vodorovneˇ a osu y svisle vzhu˚ru, musı´me rˇesˇit soustavu diferencia´lnı´ch rovnic d2 x dt d2 y m dt
m
= −kvvx
(4.1a)
= −mg − kvvy ,
(4.1b)
kde parametr k postupneˇ vypocˇteme uvedeny´m zpu˚sobem. Vy´sledne´ trajektorie – balisticke´ krˇivky – pro neˇkolik ru˚zny´ch elevacˇnı´ch u´hlu˚ lze vykreslit naprˇ. pomocı´ souboru baliste.m s obsahem
51
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
# --- numericke reseni - balisticka krivka # --- pro nekolik elevacnich uhlu clear; clc; # --- definice pocatecnich podminek (v~zakladnich jednotkach SI) t0=0; x0=0; y0=0; v0=200 # pocatecni rychlost eluhel=[10 15 20 30 37.9 45 60 75] % elevacni uhly ve stupnich alpha=eluhel*pi/180; # prevedeni na radiany # --- krok integrace dt = 0.05; # --- parametry prostredi R=0.04; # polomer strely m=2.5; # hmotnost strely ro=1.3; # hustota vzduchu C=0.48; # koeficient odporu g=9.81; # tihove zrychleni S=pi*R^2; k=C*ro*S/2; hold on # pro vice obrazku do jednoho grafu # --- cyklus pro hodnoty elevacnich uhlu for j=1:columns(alpha) clear t clear x clear y vx=v0*cos(alpha(j)); vy=v0*sin(alpha(j)); v=sqrt(vx^2+vy^2); # --- vlastni numericka integrace - klasicka Eulerova metoda t(1)=t0; x(1)=x0; y(1)=y0; i=1; while (y(i)>=0) # testujeme dopad na rovinu y=0 i=i+1; x(i)=x(i-1)+vx*dt; y(i)=y(i-1)+vy*dt; ax=-k*v*vx/m; ay=-g-k*v*vy/m; vx=vx+ax*dt; vy=vy+ay*dt; v=sqrt(vx^2+vy^2); t(i)=t(i-1)+dt; endwhile # --- vykresleni zavislosti
52
48 49 50
plot(x,y); endfor hold off
Ve vy´pisu vidı´me neˇkolik dosud nezmı´neˇny´ch prˇ´ıkazu˚ a postupu˚. V testovacı´ podmı´nce cyklu while na 36. rˇa´dku nynı´ oveˇrˇujeme, zda teˇleso nedopadlo na rovinu y = 0, po dopadu se vy´pocˇet ukoncˇ´ı. V ra´mci jednoho beˇhu programu vykreslujeme balisticke´ krˇivky pro neˇkolik hodnot elevacˇnı´ch u´hlu˚ zadany´ch ve stupnı´ch maticı´ eluhel(10. rˇa´dek), ktera´ se hned na na´sledujı´cı´m rˇa´dku prˇepocˇ´ıta´va´ na matici alpha v radia´nech. 1000 900 800 700 y/m
600 500 400 300 200 100 0 0
200
400
600
800
1000 1200 1400 1600
x/m
Obr. 4.1: Balistické křivky pro různé hodnoty elevačních úhlů K vyuzˇitı´ vsˇech hodnot pak pouzˇ´ıva´me cyklus for mezi 24–49 rˇa´dkem ukoncˇeny´ prˇ´ıkazem endfor. Podobneˇ jako v jiny´ch programovacı´ch jazycı´ch, meˇnı´ se v pru˚beˇhu cyklu celocˇ´ıselna´ promeˇnna´ (zde j) od jednicˇky do mnozˇstvı´ prvku˚ matice alpha. Pocˇet sloupcu˚ resp. rˇa´dku˚ matice zjistı´me snadno pomocı´ funkce columns (24. rˇa´dek) resp. rows. Takto mu˚zˇeme hodnoty elevacˇnı´ch u´hlu˚ libovolneˇ dopisovat nebo umaza´vat a program si vzˇdy sa´m zjistı´ jejich pocˇet. V kazˇde´m beˇhu cyklu, tj, pro kazˇdou hodnotu elevacˇnı´ho u´hlu se vypocˇtene´ t, x a y ukla´dajı´ do matic toho jme´na a pro jiny´ u´hel budou jine´. Nechceme-li vytva´rˇet vı´cerozmeˇrne´ matice, musı´me vzˇdy na konci cyklu hodnoty vykreslit (48. rˇa´dek) a na zacˇa´tku vynulovat prˇ´ıkazem clear (25.–27. rˇa´dek). Takto t, x a y zu˚sta´vajı´ vektory, jejichzˇ prvky vola´me jednodusˇe x(0),y(j) apod. Uvedeny´ postup vyzˇaduje take´ pouzˇitı´ prˇ´ıkazu˚ hold on a hold off (22. a 50. rˇa´dek). Protozˇe hodnoty x a y jsou pocˇ´ıta´ny postupneˇ vzˇdy v kazˇde´m cyklu, nelze pocˇkat na konec a pouzˇ´ıt neˇkolik dvojic argumentu˚ funkce plot jako v cˇa´sti 2.5.1. Prˇ´ıkaz hold on zajistı´, zˇe dalsˇ´ı vykreslova´nı´ bude provedeno 53
do jizˇ otevrˇene´ho obra´zku a to tak dlouho, dokud volbu nevypneme vola´nı´m hold off. Vy´stup z popsane´ho programu je zna´zorneˇn na obr. 4.1, zvolene´ pocˇa´tecˇnı´ hodnoty jsou uvedeny a okomentova´ny ve vy´pisu programu. Vidı´me, zˇe za dany´ch podmı´nek nedosa´hneme nejveˇtsˇ´ı de´lky vrhu pro elevacˇnı´ u´hel 45◦ , ale o neˇco mensˇ´ı (asi 37,9◦ ). Rutherfordův rozptyl
Ostrˇelova´nı´ zlate´ fo´lie o tlousˇt’ce neˇkolika atomu˚ ja´dry helia patrˇ´ı k nejzna´meˇjsˇ´ım historicky´m experimentu˚m. Experiment samotny´ byl poprve´ uskutecˇneˇn Hansem Geigerem a Ernestem Marsdenem roku 1909 pod vedenı´m Ernesta Rutherforda, ktery´ jej v roce 1911 vysveˇtlil a zformuloval zna´my´ planeta´rnı´ model atomu. Fyzika´lnı´ rozbor proble´mu je nastı´neˇn v cˇa´sti 5.2. Na nabite´ α-cˇa´stice s kladny´m na´bojem Qa = 2e a hmotnostı´ ma ≈ 4u pu˚sobı´ ja´dra atomu˚ zlata s na´bojem Qj = 79e odpudivou coulombovskou silou. Pohybove´ rovnice majı´ tvar
20 15 10 5 y/pm
4.1.2
0 –5 –10 –15 –20
d2 x m dt d2 y m dt
= =
1 Qa Qj x 4pε0 r3 1 Qa Qj y, 4pε0 r3 −12
(4.2a)
–10 –5
0
5
10
x/pm
(4.2b) Obr. 4.2: Trajektorie cˇa´stic prˇi Rutherfordoveˇ rozptylu
−1
kde ε0 = 8,854·10 F·m je permitivita vakua, ve vztazı´ch pro na´boje a hmotnost vystupujı´ elementa´rnı´ na´boj e = = 1,602·10−19 C a hmotnostnı´ atomova´ jednotka u = 1,66·10−27 kg. Trajektoriemi cˇa´stic budou hyperboly, jejichzˇ prˇ´ıklad je zna´zorneˇn na obr. 4.2. Vykresleny byly pomocı´ souboru ruther.m s obsahem 1 2 3 4 5 6 7
# --- numericke reseni pro rozptyl na odpuzujícím centru clear; clc; # --- definice pocatecnich podminek a konstant u=1.66e-27; # hmotnostni atomova jednotka q=1.602e-19; # elementarni naboj eps0=8.854e-12; # premitivita vakua
54
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
ma=4*u; # hmotnost alpha-castice Qa=2*q; # naboj alpha-castice Qj=79*q; # naboj jadra Au kQQ=1/4/pi/eps0*Qa*Qj; # koeficient v~Coulombove zakone ymax=2e-11; # maximalni hodnota y pro vykreslovani t0=0; x0=-1e-11; y0=[-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 1 2 3 4 5 6 7 8 9 10]*1e-12; vx0=1e6; vy0=0; # -------------------------------------------------dt=1e-20; # integracni krok # --- nastavenni os axis([-11 11 -21 21],’equal’); hold on # pro vice kreivek v~jednom obrazku # --- cyklus pro nekolik ruznych trajektorii cas_spusteni = clock(); for j=1:columns(y0) # --- vlastni numericka integrace - Eulerova metoda clear x clear y t(1)=t0; x(1)=x0; y(1)=y0(j); vx=vx0; vy=vy0; i=1; # --- cyklus while s~integraci while ((abs(y(i))<=ymax) & (x(i)>=x0)) i=i+1; x(i)=x(i-1)+vx*dt; y(i)=y(i-1)+vy*dt; r=sqrt(x(i)^2+y(i)^2); ax=kQQ/r^3*x(i-1)/ma; ay=kQQ/r^3*y(i-1)/ma; vx=vx+ax*dt; vy=vy+ay*dt; t(i)=t(i-1)+dt; endwhile # --- vykresleni zavislosti plot(x/1e-12,y/1e-12,’1’); endfor hold off # --- udaje o~case spotrebovanem na vypocet celkovy_cas = etime(clock(), cas_spusteni); disp([’Program bezel ’,num2str(celkovy_cas),’ sekund.’]);
55
Opeˇt zada´va´me jednı´m prˇ´ıkazem na 15. rˇa´dku vı´ce pocˇa´tecˇnı´ch podmı´nek maticı´, nebot’ na´s zajı´majı´ trajektorie s ru˚zny´m momentem hybnosti α-cˇa´stic, ktery´ se prˇi pohybu zachova´va´ a ktery´ prˇi pocˇa´tecˇnı´m pohybu ve smeˇru osy x za´visı´ na hodnoteˇ y0 . Ru˚zne´ pocˇa´tecˇnı´ podmı´nky opeˇt procha´zı´me v cyklu for...endfor mezi 25.–49. rˇa´dkem, opakovane´ vyna´sˇenı´ do stejne´ho obra´zku aktivujeme a deaktivujeme pomocı´ hold on... hold off. Vypocˇ´ıtane´ hodnoty sourˇadnic vyna´sˇ´ıme prˇ´ımo v pikometrech, proto je v ra´mci prˇ´ıkazu plot na 48. rˇa´dku prˇ´ıslusˇneˇ prˇesˇka´lujeme. Z prˇ´ıkazu˚, s nimizˇ jsme se v uvedene´ podobeˇ v textu dosud nesetkali, upozorneˇme na axis (21. rˇa´dek), ktery´ nema´ pouze argument ’equal’ pozˇadujı´cı´ stejne´ meˇrˇ´ıtko na obou osa´ch, ale take´ nastavenı´ rozsahu vykreslovany´ch hodnot parametrem [-11 11 -21 21], jezˇ je ekvivalentnı´ dvojici __gnuplot_set__ xrange [-11:11] a __gnuplot_set__ yrange [-21:21] ; omezujeme tı´m vykreslova´nı´ na hodnoty x ∈ h−11,11i, y ∈ h−21,21i. V podmı´nce cyklu while na 36. rˇa´dku pak testujeme, zda hodnota x nesklesla pod x0 a hodnota y nelezˇ´ı mimo interval h−ymax ,ymax i. Ke zobrazenı´ cˇasu spotrˇebovane´ho na vy´pocˇet je pak na poslednı´m rˇa´dku vyuzˇita funkce disp, dı´ky nı´zˇ se nevypı´sˇe pouze hla´sˇenı´ celkovycas=7.963, ale cele´ hla´sˇenı´ Program bezel 7.963 sekund. Protozˇe argumentem disp mohou by´t pouze textove´ rˇeteˇzce, prˇeva´dı´me cˇ´ıselny´ u´daj o cˇase na rˇeteˇzec („string“) pomocı´ funkce num2str. 4.1.3
Pohyb lyžaře s odporem prostředí
Uved’me jednu z u´loh zpracovany´ch pro syste´m FAMULUS v textu [23] se zada´nı´m: Lyzˇarˇ o hmotnosti m = 90 kg zı´ska´ po urcˇite´ dobeˇ jı´zdy na velmi dlouhe´m rovne´m svahu se sklonem α = 15◦ sta´lou rychlost vm = 18 m·s−1 . Soucˇinitel smykove´ho trˇenı´ mezi lyzˇemi a sneˇhem je f = 0,055, tı´hove´ zrychlenı´ g = 9,81 m·s−2 . Velikost sı´ly odporu vzduchu je prˇ´ımo u´meˇrna´ druhe´ moc´ kolem je urcˇit velikost koeficientu K a modelovat nineˇ rychlosti: Fo = Kv 2 . U za´vislost rychlosti a dra´hy lyzˇarˇe v za´vislosti na cˇase. Prˇi pohybu lyzˇarˇe se uplatnı´ pohybova´ slozˇka tı´hove´ sı´ly, smykove´ trˇenı´ a odpor vzduchu. Vy´slednice teˇchto sil ma´ velikost F = mg (sin α − f cos α) − Kv 2 . Na velmi dlouhe´m svahu dosa´hne rychlost lyzˇarˇe meznı´ hodnoty vm , prˇi ktere´ je vy´slednice vsˇech sil nulova´ a platı´ 2 mg (sin α − f cos α) − Kvm mg (sin α − f cos α) K= 2 vm
56
=
0
=
0,5605 N·m−2 ·s−2 .
Okamzˇite´ zrychlenı´ lyzˇarˇe v cˇase t potom bude a=
F K 2 = g (sin α − f cos α) − v . m m
a program pro modelova´nı´ za´vislosti rychlosti lyzˇarˇe na cˇase mu˚zˇe vypadat na´sledovneˇ: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
# --- numericke reseni rychlosti lyzare na svahu s~odporem prostredi clear; clc; # --- definice pocatecních podminek t(1)=0; s(1)=0; v(1)=0; # pocatecni rychlost m=90; # hmotnost lyzare uhel=15; # uhel svahu ve stupnich alpha=uhel*pi/180; f=0.055; # soucinitel smykoveho treni vm=18; # mezni rychlost g=9.81; # tihove zrychleni K=m*g*(sin(alpha)-f*cos(alpha))/vm^2; dt = 1; # krok integrace # --- vlastní numerická integrace - metoda Eulerova i=1; a=g*(sin(alpha)-f*cos(alpha))-K*v^2/m; # --- vlastni cyklus while (v<=0.9999*vm) % i=i+1; a=g*(sin(alpha)-f*cos(alpha))-K*v(i-1)^2/m; v(i)=v(i-1)+a*dt; s(i)=s(i-1)+v(i)*dt; t(i)=t(i-1)+dt; endwhile # --- vykreslení závislosti v~na t plot(t,v); pause # --- vykreslení závislosti s~na t plot(t,s);
Vy´sledny´ graf je na obra´zcı´ch 4.1.3a,b. Prˇipomenˇme, zˇe rychlost lyzˇarˇe se meznı´ rychlosti vm sice blı´zˇ´ı, ale z matematicke´ho hlediska ji prˇesneˇ nikdy nedosa´hne. Chceme-li na vyhnout nekonecˇne´mu cyklu while, musı´me do podmı´nky zadat rychlost o neˇco nizˇsˇ´ı (na 20. rˇa´dku volı´me konkre´tneˇ 0,9999 vm ).
57
18
700
16
600
14 12 v/m⋅s-1
s/m
500 400 300
10 8 6
200
4
100
2 0
0 0
5
10
15
20
25
30
35
0
40
(a) Závislost s = s(t) pro pohyb lyžaře
4.2
5
10
15
20
25
30
35
40
t/s
t/s
(b) Závislost v = v(t) pro pohyb lyžaře
Modely využívající Rungovy-Kuttovy metody
I kdyzˇ ve veˇtsˇineˇ matematicky´ch programu˚ se pouzˇ´ıvajı´ Rungovy-Kuttovy metody 4. rˇa´du, pro nasˇe u´cˇely je pro svou jednoduchost zcela postacˇujı´cı´ metoda 2. rˇa´du s pevny´m (fixnı´m) krokem, pouzˇita´ v na´sledujı´cı´m prˇ´ıkladu. 4.2.1
Matematické kyvadlo s libovolnou počáteční výchylkou
Matematicke´ kyvadlo patrˇ´ı k nejzna´meˇjsˇ´ım modelu˚m. Zde se podobneˇ jako v cˇa´sti 2.5 budeme zaby´vat pohybem s libovolneˇ velkou pocˇa´tecˇnı´ vy´chylkou. Pohybova´ rovnice ma´ zna´my´ tvar (viz naprˇ. [2, 4]) d2 ϕ g = − sin ϕ, 2 dt l kde g je tı´hove´ zrychlenı´ l de´lka za´veˇsu. Pro jednoduchost uvazˇujme sekundove´ kyvadlo s dobou kmitu 1 s, pro jeho de´lku musı´ platit l=
g ≈ 0,25 m. 4p2
Le´pe tak uvidı´me prodlouzˇenı´ doby kmitu prˇi veˇtsˇ´ıch pocˇa´tecˇnı´ch vy´chylka´ch. Vy´pis programu kyvrk2.m mu˚zˇe mı´t podobu 1 2 3 4 5
# --- matematicke kyvadlo s~libovolnou pocatecni vychylkou clear; clc; # --- definice počátečních podmínek (v~základních jednotkách SI) phi0=[3 30 60 90 120 150 179]*pi/180;
58
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
# --- vlastni cyklus x=v=[]; hold on for j=1:columns(phi0) clear t; clear ph; t(1)=0; ph(1)=phi0(j); dph(1)=0; # počateční derivace (úhlová rychlost) mez=4; # mez integrace - 4 male kmity h = mez/500; # krok integrace g=9.81; l=g/(4*pi^2); # delka sekundoveho kyvadla # --- vlastní numerická integrace - RK metoda 2. řádu i=2; while t<mez k1=-g/l*sin(ph(i-1)); php=ph(i-1)+dph(i-1)*2*h/3+k1*2*h^2/9; k2=-g/l*sin(php); ph(i)=ph(i-1)+dph(i-1)*h+(k1+k2)*h^2/4; dph(i)=dph(i-1)+(k1+3*k2)*h/4; t(i)=t(i-1)+h; i=i+1; endwhile # --- ukladame vychylku a rychlost do matice pro pozdejsi pouziti... x=[x;ph]; v=[v;dph]; # --- Vykresleni zavislosti plot(t,ph); endfor hold off # --- vykresleni zavislosti uhlove rychlosti na case for j=1:columns(phi0) hold on plot(t,v(j,:)) hold off endfor # --- vykresleni zavislosti uhlove rychlosti na vychylce for j=1:columns(phi0) hold on plot(x(j,:),v(j,:)) hold off endfor
Podobneˇ jako v cˇa´sti 4.1.1 zde zada´va´me neˇkolik ru˚zny´ch pocˇa´tecˇnı´ch vy´chylek v jedine´ matici phi0 (5. rˇa´dek), pocˇet jejı´ch prvku˚ (tj. zadany´ch hodnot) opeˇt zjisˇt’ujme pomocı´ funkce columns. Podobneˇ jako v cˇa´sti 4.1.1 uzˇ´ıva´me 59
4
15
3
10
2 5 ω/rad⋅s-1
ϕ/rad
1 0 –1
0 –5
–2 –10
–3 –4
–15 0
0,5
1
1,5
2
2,5
3
3,5
4
0
0,5
1
1,5
t/s
2
2,5
3
3,5
4
t/s
(a) ϕ = ϕ(t)
(b) ω = ω(t)
15 10
ω/rad⋅s-1
5 0 –5 –10 –15 –4
–3
–2
–1
0
1
2
3
4
ϕ/rad
(c) ω = ω(ϕ)
Obr. 4.3: Kmity matematického kyvadla s počátečními výchylkami ϕ0 = 3◦ , 30◦ , 60◦ , 90◦ , 120◦ , 150◦ a 179◦ i cyklu for...endfor a opakovane´ho vykreslova´nı´ do stejne´ho obra´zku pomocı´ hold on... hold off. Chceme-li vykreslit kromeˇ za´vislosti vy´chylky na cˇase ϕ = ϕ(t) take´ za´vislosti u´hlove´ frekvence na cˇase ω = ω(t) a u´hlove´ frekvence na vy´chylce ω = dϕ/dt = ω(ϕ) (tj. zna´zorneˇnı´ kmitu˚ ve „fa´zove´m prostoru“), musı´me cyklus s vykreslova´nı´m opakovat trˇikra´t (9.–35. rˇa´dek vcˇetneˇ vy´pocˇtu, 38.–42. rˇa´dek a 44.–48. rˇa´dek pro vykreslenı´). Abychom trˇikra´t neopakovali celou integraci, ukla´da´me hodnoty postupneˇ do matic x a v, ktere´ jizˇ nejsou vektory – kazˇdy´ jejich rˇa´dek odpovı´da´ rˇesˇenı´ pro jednu pocˇa´tecˇnı´ vy´chylku. Proto tyto matice na pocˇa´tku zava´dı´me jako pra´zdne´ (x=v=[]; na 7. rˇa´dku), abychom k nim mohli prˇida´vat dalsˇ´ı rˇa´dky z hodnot ph a dph prˇ´ıkazy x=[x;ph] resp. v=[v;dph]
60
(31.–32. rˇa´dek). Integracˇnı´ krok na 16. rˇa´dku je pak volen tak, aby uvazˇovany´ cˇasovy´ interval h0,4i byl rozdeˇlen na 500 dı´lku˚. Dodejme, zˇe nenı´ mozˇne´ zadat limitnı´ hodnotu pocˇa´tecˇnı´ vy´chylky ϕ0 = = 180◦ , nebot’v tomto prˇ´ıpadeˇ prˇi nulove´ pocˇa´tecˇnı´ rychlosti teˇleso zacˇne padat volny´m pa´dem a rovnice matematicke´ho kyvadla pro neˇj nebude platit. Vsˇechny trˇi zmı´neˇne´ za´vislosti jsou postupneˇ vykresleny na obra´zcı´ch 4.3a–c. Vidı´me, zˇe s rostoucı´ pocˇa´tecˇnı´ vy´chylkou se pohyb vı´ce a vı´ce lisˇ´ı od harmonicke´ho, pro ϕ0 = 179◦ je doba kmitu te´meˇrˇ 4 s, tj. asi 4× veˇtsˇ´ı nezˇ pro male´ kmity kyvadla. 4.2.2
Pohyb družice v gravitačním poli Země a Měsíce
Proble´m je po fyzika´lnı´ stra´nce popsa´n v cˇa´sti 1.8, jde o prˇ´ıklad tzv. omezene´ho proble´mu trˇ´ı teˇles, kdy prˇedpokla´da´me, zˇe trˇetı´ teˇleso (v nasˇem prˇ´ıpadeˇ druzˇice) neovlivnˇuje svou gravitacı´ zby´vajı´cı´ dveˇ teˇlesa (Zemi a Meˇsı´c), ktera´ se pohybujı´ po kruhovy´ch trajektoriı´ch okolo spolecˇne´ho hmotne´ho strˇedu. Pokud u´lohu navı´c rˇesˇ´ıme v soustaveˇ, ktera´ se ota´cˇ´ı spolu se Zemı´ a Meˇsı´cem, mu˚zˇeme obeˇ teˇlesa povazˇovat za nehybna´, pocˇa´tek vztazˇne´ soustavy volı´me ve strˇedu ´ lohu budeme rˇesˇit v prˇiblı´zˇenı´, kdy zanedba´va´me setrvacˇne´ sı´ly spojene´ Zemeˇ. U s neinercia´lnostı´ rotujı´cı´ soustavy oproti gravitacˇnı´mu pu˚sobenı´. Dodejme, zˇe obecny´ proble´m trˇ´ı teˇles je u´loha, ktera´ v du˚sledku nelinea´rnosti rovnic nema´ obecne´ analyticke´ rˇesˇenı´ a zaby´vala se jı´m rˇada vy´znacˇny´ch matematiku˚ (Euler, Lagrange, Jacobi, Hill, Poincare´, Levi-Civita, Birkhoff). V nasˇ´ı u´loze pouzˇijeme neˇkolik astronomicky´ch konstant – hmotnost Zemeˇ MZ = 5,983·1024 kg, hmotnost Meˇsı´ce MM = 7,374·1022 kg, jezˇ se nacha´zejı´ ve vza´jemne´ vzda´lenosti xM = 60,13 RZ . Polomeˇr Zemeˇ RZ = 6,371·106 m pouzˇijeme jako jednotku vzda´lenosti, sourˇadnice polohy druzˇice budeme uva´deˇt v na´sobcı´ch RZ . Da´le budeme prˇedpokla´dat, zˇe druzˇice se pohybuje vy´hradneˇ pod vlivem gravitacˇnı´ho pole s vypnuty´mi motory. Pro urcˇenı´ gravitacˇnı´ch sil, ktere´ pu˚sobı´ na kosmickou sondu, musı´me urcˇit nejen sourˇadnice polohy vzhledem k Zemi (xSZ , ySZ ), ale i relativnı´ sourˇadnice sondy vzhledem k Meˇsı´ci xSM = xSZ − xM , ySM = ySZ − yM , kde xM , yM jsou sourˇadnice Meˇsı´ce ve vztazˇne´ soustaveˇ spojene´ se Zemı´. Meˇsı´c umı´stı´me na osu x nasˇ´ı soustavy, takzˇe klademe xM = 60,13RZ , yM = 0. Souc ˇ asneˇ je take´ p 2 , zrˇejme´, zˇe ySM = ySZ . Pro vzda´lenost druzˇice od Zeme ˇ platı ´ r = x2SZ + ySZ q p 2 2 2 . pro jejı´ vzda´lenost od Meˇsı´ce rM = x2SM + ySM = (xSZ − xM ) + ySZ
61
Slozˇky zrychlenı´ sondy budou vy´slednicı´ gravitacˇnı´ho pu˚sobenı´ Zemeˇ a Meˇsı´ce, mu˚zˇeme pro neˇ proto psa´t ax ay
xSZ MZ xSM MM xSZ MZ (xSZ − xM ) MM −κ = −κ −κ , 3 3 r3 rM r3 rM ySZ MZ ySM MM ySZ MZ ySZ MM = −κ −κ . = −κ −κ . 3 3 r3 rM r3 rM
= −κ
Program sondark2 pak mu˚zˇe vypadat na´sledovneˇ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
# --- numericke reseni pohybu druzice clear; clc; # --- pocatecni podminky a konstanty --RZ=6.378e6; % polomer Zeme t(1)=0; xsZ(1)=0; ysZ(1)=10*RZ; vx=2.7e3; % x-ova slozka startovni rychlosti vy=1.84e3; % y-ova slozka startovni rychlosti xM=60.13*RZ; yM=0; mez= 1.2e6; % mez integrace h = mez/6000; % krok integrace # --- parametry prostredi, konstanty --k=6.67259e-11; % gravitacni konstanta MZ=5.98e24; % hmotnost Zeme MM=7.374e22; % hmotnost Mesice# --- vlastni numericka integrace - RG metoda 2. radu i=2; while (t<mez & xsZ(i-1)^2+ysZ(i-1)^2>RZ^2) k1x=-k*xsZ(i-1)*MZ/(xsZ(i-1)^2+ysZ(i-1)^2)^1.5 \ -k*MM*(xsZ(i-1)-xM)/((xsZ(i-1)-xM)^2+ysZ(i-1)^2)^1.5; k1y=-k*ysZ(i-1)*MZ/(xsZ(i-1)^2+ysZ(i-1)^2)^1.5 \ -k*MM*ysZ(i-1)/((xsZ(i-1)-xM)^2+ysZ(i-1)^2)^1.5; xp=xsZ(i-1)+vx*2*h/3+k1x*2*h^2/9; yp=ysZ(i-1)+vy*2*h/3+k1y*2*h^2/9; k2x=-k*xp*MZ/(xp^2+yp^2)^1.5-k*MM*(xp-xM)/((xp-xM)^2+yp^2)^1.5; k2y=-k*yp*MZ/(xp^2+yp^2)^1.5-k*MM*yp/((xp-xM)^2+yp^2)^1.5; xsZ(i)=xsZ(i-1)+vx*h+(k1x+k2x)*h^2/4; ysZ(i)=ysZ(i-1)+vy*h+(k1y+k2y)*h^2/4; vx=vx+(k1x+3*k2x)*h/4; vy=vy+(k1y+3*k2y)*h/4; t(i)=t(i-1)+h; i=i+1; endwhile # --- vykreslení zavislosti
62
38 39 40 41 42 43 44 45 46 47
axis(’equal’); hold on # --- Vykresleni Zeme u=linspace(0,2*pi,100); plot(cos(u),sin(u),’b’) # --- Vykresleni Mesice plot(1738000/RZ*cos(u)+xM/RZ,1738000/RZ*sin(u),’g’) # --- vykresleni trajektorie plot(xsZ/RZ,ysZ/RZ,’r’); hold off
y/RZ
Pocˇa´tecˇnı´ podmı´nky odpovı´dajı´ hodnota´m xSZ0 = 0 (xsZ(1)), ySZ0 = 10RZ (ysZ(1)), vx0 = 2,7 km·s−1 a vy0 = 1,84 km·s−1 . Vy´sledna´ podoba trajektorie je prˇitom na zmeˇnu pocˇa´tecˇnı´ch podmı´nek velmi citliva´. V podmı´nce cyklu while na 21. rˇa´dku testujeme nejenom zda cˇas t neprˇekrocˇil stanovenou hornı´ mez, ale take´ dopad na zemsky´ povrch (tj. zda r > RZ ). Kromeˇ samotne´ trajektorie (prˇ´ıkazem plot na 46. rˇa´dku) jsou vykresleny i kruzˇnice zna´zornˇujı´cı´ povrch Zemeˇ i Meˇsı´ce (42. resp. 44. rˇa´dek), opeˇt nastavujeme stejne´ meˇrˇ´ıtko na obou osa´ch prˇ´ıkazem axis(’equal’). Vy´sledek zna´zornˇuje obr. 4.4. Dodejme, zˇe pokud bychom pouzˇili Eulerovu namı´sto Rungovy-Kuttovy metody, k dosazˇenı´ stejne´ prˇesnosti by se citelneˇ prodlouzˇila doba vy´pocˇtu, zejme´na na pomalejsˇ´ıch pocˇ´ıtacˇ´ıch. 20 15 10 5 0 –5 –10 –10
0
10
20
30
40
50
60
70
x/RZ
Obr. 4.4: Příklad pohybu družice v soustavě Země–Měsíc
4.2.3
Pružné kyvadlo
Model popsany´ jizˇ v cˇa´sti 2.3 je tvorˇen kyvadlem, u neˇhozˇ je za´veˇs realizova´n pruzˇinou o tuhosti k a de´lce l (v nezatı´zˇene´m stavu). Jde o pomeˇrneˇ jednoduchy´ a za´rovenˇ velmi zajı´mavy´ model, na neˇmzˇ lze studovat rˇadu jevu˚ spojeny´ch 63
s oscilacemi. Sveˇdcˇ´ı o tom mimo jine´ dva cˇla´nky z neda´vne´ doby [5, 8], jezˇ mu˚zˇeme vrˇele doporucˇit za´jemcu˚m o hlubsˇ´ı sezna´menı´ s problematikou i o odkazy na dalsˇ´ı zdroje informacı´. Pro nasˇe numericke´ rˇesˇenı´ vystacˇ´ıme s pohybovou rovnicı´ m
d2 r r = G − k (r − l) , 2 dt r
kterou lze v karte´zsky´ch sourˇadicı´ch x = r sin ϕ, y = r cos ϕ rozepsat do slozˇek d2 x dt2 d2 y m 2 dt
m
= −k (r − l)
x , r
= −g − k (r − l)
y . r
r
Pocˇa´tek sourˇadnic prˇitom volı´me v mı´steˇ za´veˇsu podle obr. 4.5. Jedna´ se o syste´m s dveˇma vy´znacˇny´mi mo´dy y (kmity kyvadla spojene´ se zmeˇnou sourˇadnice ϕ a kmity pruzˇiny spojene´ se zmeˇnou r), mezi nimizˇ x je nelinea´rnı´ vazba, ktera´ je zodpoveˇdna´ za specificke´ vlastnosti pohybu. Rovnova´zˇna´ poloha, kdy je za´vazˇ´ı po zaveˇsˇenı´ na pruzˇinu v klidu ve svisle´ ose y je urcˇena vzda´lenostı´ od bodu za´veˇsu r = = lg = l + mg/k, vu˚cˇi te´to hodnoteˇ budeme v souladu s [5] vykreslovat zmeˇny vzda´lenosti za´vazˇ´ı od bodu za´veˇsu. Pro snadneˇjsˇ´ı porovna´nı´ s uvedeny´mi prameny [5, 8] volı´me tyte´zˇ parametry – nezatı´zˇenou de´lku pruzˇiny l = 0,28 m, g tuhost pruzˇiny k = 12,5 N·m−1 . Jak je odvozeno v [5, 8], prˇeda´va´nı´ energie ϕ mezi zmı´neˇny´mi mo´dy je nejvy´razneˇjsˇ´ı prˇi rezonanci, kdy platı´ r r k g Obr. 4.5: K zavedenı´ = 2ωϕ = ωr = . m lg sourˇadnic pro pruzˇne´ kyvadlo
Po dosazenı´ za lg dostaneme hmotnost za´vazˇ´ı, ktere´ musı´me zaveˇsit, aby rezonance nastala m=
lk ≈ 0,12 kg. 3g 64
(4.3)
Ukazˇme nejprve prˇ´ıpad dominantnı´ch kyvu˚, kdy ky´va´nı´ kyvadla bude minima´lneˇ ovlivneˇno kmity pruzˇiny. Prˇedpokla´da´me, zˇe na pocˇa´tku za´vazˇ´ı o hmotnosti m = 0,09 kg vychy´lı´me o u´hel ϕ0 = 0,05785 rad, anizˇ by se pruzˇina prodlouzˇila, tj. r0 = lg . Vy´pis programu pruzkrk.m pak mu˚zˇe by´t na´sledujı´cı´: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
# --- numericke reseni pruzneho kyvadla clear; clc; # --- konstanty l=0.28; # delka nezatizene pruziny k=12.5; # tuhost pruziny g=9.81; # tihove zrychleni m=0.09; # hmotnost zavazi lg=l+m*g/k; # rovnovazna delka pruziny # --- pocatecni podminky d0=0.00; # pocatecni prodlouzeni pruziny phi0=0,05785; # pocatecni vychylka od svisleho smeru x0=(lg+d0)*sin(phi0); # prepoctena soradnice x0 y0=-(lg+d0)*cos(phi0); # prepoctena soradnice y0 vx0=0; # pocatecni rychlost ve smeru x vy0=0; # pocatecni rychlost ve smeru x # --- oblast integrace t0=0; # cas merime od 0 mez=15; # horni mez integrace h=5e-3; # integracni krok # --- vlastni numericka integrace - RK metoda 2. radu t(1)=t0; x(1)=x0; y(1)=y0; vx=vx0; vy=vy0; i=1; # --- cyklus probiha pro t<= horni mez while (t(i)<=mez) i=i+1; r=sqrt(x(i-1)^2+y(i-1)^2); k1x=-k*(r-l)/r*x(i-1)/m; k1y=-g-k*(r-l)/r*y(i-1)/m; xp=x(i-1)+vx*2*h/3+k1x*2*h^2/9; yp=y(i-1)+vy*2*h/3+k1x*2*h^2/9; rp=sqrt(xp^2+yp^2); k2x=-k*(rp-l)/rp*xp/m; k2y=-g-k*(rp-l)/rp*yp/m; x(i)=x(i-1)+vx*h+(k1x+k2x)*h^2/4; y(i)=y(i-1)+vy*h+(k1y+k2y)*h^2/4; vx=vx+(k1x+3*k2x)*h/4; vy=vy+(k1y+3*k2y)*h/4;
65
43 44 45 46 47 48 49 50
t(i)=t(i-1)+h; endwhile # --- vykresleni trajektorie plot(x,y); # --- vykresleni závislosti r-lg na case plot(t,sqrt(x.^2+y.^2)-lg); # --- vykresleni závislosti phi na case plot(t,atan2(x,abs(y)))
0,002
0,06
0,0015
0,04 0,02
0,0005 ϕ/rad
r – lg/m
0,001
0 -0,0005
0 –0,02
-0,001 –0,04
-0,0015 -0,002
–0,06
0
2
4
6
8 t/s
10
12
14
16
0
(a) Závislost prodloužení r(t) − lg na čase
2
4
6
8 t/s
10
12
14
16
(b) Závislost výchylky ϕ na čase
–0,348
y/m
–0,349
–0,35
–0,351
–0,352 –0,02
–0,01
0 x/m
0,01
0,02
(c) Výsledný pohyb v rovině xy
Obr. 4.6: Kmity pružného kyvadla v režimu dominantních kyvů Vidı´me, zˇe pocˇa´tecˇnı´ de´lku pruzˇiny zada´va´me v programu na 11. rˇa´dku rozdı´lem d0 = r0 − lg , jezˇ je v tomto prˇ´ıpadeˇ nulovy´, pocˇa´tecˇnı´ hodnotu karte´zsky´ch sourˇadnic x0 a y0 pak dopocˇteme podle jizˇ uvedeny´ch p prˇevodnı´ch vztahu˚. Naopak, z hodnot x a y zı´skany´ch integracı´ zı´ska´me r = x2 + y 2 a ϕ = arctg x/ |y|, nebot’v nasˇ´ı volbeˇ osa y smeˇrˇuje nahoru a pod za´veˇsem je y za´porne´. Pouzˇili jsme 66
0,06
0,01
0,04
0,005
0,02 ϕ/rad
r – lg/m
0,015
0
0
–0,005
–0,02
–0,01
–0,04
–0,015
–0,06 0
10
20
30
40
50
0
10
t/s
20
30
40
50
t/s
(a) Závislost prodloužení r(t) − lg na čase
(b) Závislost výchylky ϕ na čase
–0,36 –0,365
y/m
–0,37 –0,375 –0,38 –0,385 –0,02
–0,01
0 x/m
0,01
0,02
(c) Výsledný pohyb v rovině xy
Obr. 4.7: Kmity pružného kyvadla v blízkosti rezonance tu dveˇ dosud nezmı´neˇne´ funkce programu atan2(a,b) pro vy´pocˇet arctg (a/b) a abs pro vy´pocˇet absolutnı´ hodnoty. Vy´sledne´ kmity jsou zna´zorneˇny na obr. 4.6. Je zrˇejme´, zˇe zmeˇny prodlouzˇenı´ pruzˇiny jsou relativneˇ velmi male´ a vy´sledne´mu pohybu skutecˇneˇ dominujı´ kyvy v sourˇadnici ϕ. Toto tvrzenı´ je jen zda´nliveˇ v rozporu s vy´slednou trajektoriı´ na obr 4.6c, nebot’ zmeˇny v sourˇadnici y jsou mnohem mensˇ´ı nezˇ v sourˇadnici x. Zmeˇnı´me-li hmotnost za´vazˇ´ı na m = 0,12 kg a prodlouzˇ´ıme cˇasovy´ interval pro integraci, abychom zachytili delsˇ´ı pru˚beˇh pohybu, meˇlo by podle rovnice (4.3) docha´zet k rezonanci. Na obr. 4.7 je skutecˇneˇ patrne´ postupne´ prˇeda´va´nı´ energie mezi kyvy kyvadla a kmity pruzˇiny. I zde platı´, zˇe tvar trajektorie na obr. 4.7 je deformova´n nestejny´m meˇrˇ´ıtkem, zmeˇny ve svisle´m smeˇru jsou ve skutecˇnosti mnohem mensˇ´ı nezˇ ve smeˇru vodorovne´m. Pokud bychom ale nastavili na obou
67
osa´ch stejne´ meˇrˇ´ıtko, trajektorie by se na´m redukovala ve „tlusteˇ rozmazanou cˇa´ru“ kyvu˚.
4.3
Modely využívající funkce lsode
Modely vyuzˇ´ıvajı´cı´ procedury lsode jsou vesmeˇs strucˇneˇjsˇ´ı a kompaktneˇjsˇ´ı, naopak je u nich obtı´zˇneˇjsˇ´ı testovat prˇ´ıpadnou dodatecˇnou podmı´nku (naprˇ. dopad na rovinu y = 0 jako v cˇa´sti 4.1.1) a prˇi jejı´m nesplneˇnı´ vy´pocˇet zastavit. Mezi tyto modely patrˇ´ı pochopitelneˇ i prˇ´ıklady uvedene´ v cˇa´stech 3.2.1 a 3.2.2. 4.3.1
Balistická křivka podruhé
Vrat’me se jesˇteˇ jednou k balisticke´ krˇivce popsane´ v cˇa´sti 4.1.1. Pokud vyjdeme z rovnic (4.1a) a rozhodneme se pouzˇ´ıt funkci lsode, mu˚zˇe soubor balist.m obsahovat prˇ´ıkazy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
# --- numericke reseni balistickeho problemu clear; clc; # --- definice pocatecnich podminek t0=0; x0=0; y0=0; v=input(’zadej pocatecni rychlost v~m/s: ’); alpha=input(’elevacni uhel ve stupnich: ’)*pi/180; vx=v*cos(alpha); vy=v*sin(alpha); # --- parametry prostredi a strely R=0.04; # polomer strely global m=2.5; # hmotnost strely ro=1.3; # hustota vzduchu # koeficient odporu C=input(’zadej koeficient odporu C (<0,1>): ’); global g=9.81; # tihove zrychleni S=pi*R^2; global k=C*ro*S/2; # --- definice funkce pro integraci function xdot=fce(xp,t) global k~m g # prebira globalne definovane konstanty xdot=zeros(4,1); xdot(1)=xp(2); xdot(2)=-k/m*sqrt(xp(2).^2+xp(4).^2).*xp(2); xdot(3)=xp(4); xdot(4)=-g-k/m*sqrt(xp(2).^2+xp(4).^2).*xp(4); endfunction # --- meze integrace a cas jako nezavisle promenna
68
31 32 33 34 35 36 37 38 39
dm=0; hm=2*vy/g; t=linspace(dm,hm,200); # --- vlastni numericka integrace pomoci lsode yp=lsode("fce",[x0,vx,y0,vy],t); x=yp(:,1); y=yp(:,3).*(yp(:,3)>=0); # --- vykresleni reseni plot(x,y);
Novy´m, v tomto textu dosud nepouzˇity´m prˇ´ıkazem je ze input na rˇa´dcı´ch 8, 9 a 17. Poslouzˇ´ı na´m tehdy, pokud chceme vytvorˇit interaktivnı´ program, ktery´ po spusˇteˇnı´ pozˇa´da´ uzˇivatele (nasˇeho studenta) o vlozˇenı´ hodnot prˇ´ıslusˇny´ch promeˇnny´ch. Konkre´tneˇ na za´kladeˇ 8. rˇa´dku vypı´sˇe program zadej pocatecni rychlost v m/s: a cˇeka´ na vlozˇenı´ cˇ´ıselne´ hodnoty ukoncˇene´ kla´vesou Enter. Jak vidı´me, ma´me mozˇnost zadat text vy´zvy, ktera´ se objevı´ na obrazovce. V sofistikovaneˇjsˇ´ıch programech bychom mohli osˇetrˇit, zda zadane´ hodnoty splnˇujı´ dalsˇ´ı dodatecˇne´ podmı´nky (neza´pornost apod.). 350 300
y/m
250 200 150 100 50 0 0
200
400
600
800 1000 1200 1400 1600 1800 x/m
Obr. 4.8: Balistická křivka pro v0 = 200 m·s−1 , α = 32◦ a C = 0,48 Jak jizˇ bylo uvedeno vy´sˇe, na rozdı´l od Eulerovy metody s cyklem while pouzˇite´ v cˇa´sti 4.1.1 zde neukoncˇ´ıme integraci po dopadu na rovinu y = 0, 69
proto musı´me za´porne´ hodnoty sourˇadnice y odfiltrovat jinak. Nechceme-li neˇjaky´m vedlejsˇ´ım vy´pocˇtem omezovat hornı´ mez integrace (zde, jak je zrˇejme´ ze 32. rˇa´dku, je zvolena jako doba sˇikme´ho vrhu v neodporujı´cı´m prostrˇedı´), vyuzˇijeme jedne´ z dalsˇ´ıch metod efektivnı´ pra´ce s maticemi. Na 37. rˇa´dku se setka´va´me se sloupcovou maticı´ yp(:,3)>=0, kterou vytva´rˇ´ıme ze 3. sloupce matice yp pomocı´ logicke´ podmı´nky >=0. Vy´sledkem bude vektor (sloupcova´ matice), v nı´zˇ budou bud’ jednicˇky (na mı´stech, kde prvky yp podmı´nky splnˇujı´, tj. zde jsou neza´porne´), nebo nuly (na teˇch rˇa´dcı´ch, kde hodnoty yp podmı´nku nesplnˇujı´). Vyna´sobı´me-li pote´ prvky te´to matice pu˚vodnı´ vektor yp(:,3) (pozor, ne matice jako celek, ale odpovı´dajı´cı´ prvky mezi sebou, takzˇe musı´me pouzˇ´ıt .*), na´sobı´me jejı´ neza´porne´ prvky 1 a za´porne´ 0, takzˇe zı´ska´me matici obsahujı´cı´ neza´porne´ hodnoty yp(:,3) a na mı´stech za´porny´ch hodnot 0. Vy´sledna´ krˇivka pro interaktivneˇ zadane´ hodnoty v0 = 200 m·s−1 , α = 32◦ a C = 0,48 je zna´zorneˇna na obr. 4.8. 4.3.2
Foucaultovo kyvadlo
Sta´cˇenı´ roviny kmitu Foucaultova kyvadla vlivem Coriolisovy sı´ly patrˇ´ı od sve´ho prvnı´ho prˇedvedenı´ Jeanem Bernardem Le´onem Foucaultem v parˇ´ızˇske´m Pantheonu v roce 1851 k za´kladnı´m du˚kazu˚m rotace Zemeˇ. Foucaultu˚v model pry´ nesl hmotnost 28 kg na laneˇ dlouhe´m 68 m [1]. Zvolı´me-li vztazˇnou soustavu spojenou s rotujı´cı´m povrchem Zemeˇ tak, zˇe osa x mı´rˇ´ı v dane´m mı´steˇ ve smeˇru polednı´ku na jih, osa y ve smeˇru rovnobeˇzˇky na vy´chod a osa z svisle vzhu˚ru, omezı´me-li se na male´ kmity vzhledem k de´lce kyvadla, lze pro pru˚meˇt kmitu˚ do roviny xy v mı´steˇ se zemeˇpisnou sˇ´ırˇkou λ odvodit prˇiblizˇne´ rovnice (viz naprˇ. [22]) x ¨ = −ω 2 x + 2yΩ ˙ sin λ, 2 y¨ = −ω y − 2xΩ ˙ sin λ, p v nichzˇ ω = g/l je u´hlova´ frekvence matematicke´ho kyvadla te´zˇe de´lky a Ω ≈ 7,3·10−5 s−1 u´hlova´ frekvence ota´cˇenı´ Zemeˇ okolo vlastnı´ osy. Do souboru foucaoult.m mu˚zˇeme napsat 1 2 3 4 5 6 7 8
# --- numericke reseni Foucaultovo kyvadlo clear; clc; # --- definice pocatecnich podminek t0=0; x0=5; y0=0; vx0=0;
70
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
vy0=0; global phi=50/180*pi; # zemepisna sirka global om=2*pi/(86400); # uhlova rychlost rotace Zeme global l=68; # delka kyvadla global g=9.81; # --- vlastni numericka integrace - preddefinovana procedura lsode function xdot=fce(xp,t) global phi om g l # prebira globalne definovane konstanty xdot=zeros(4,1); xdot(1)=xp(2); xdot(2)=-g/l*xp(1)+2*om*sin(phi)*xp(4); xdot(3)=xp(4); xdot(4)=-g/l*xp(3)-2*om*sin(phi)*xp(2); endfunction # --- meze integrace dm=0; hm=50; # --- cas jako nezavisla promenna, oblast integrace t=linspace(dm,hm,500); # --- reseni soustavy diferencialnich rovnic yp=lsode("fce",[x0,vx0,y0,vy0],t); # --- vykresleni plot(yp(:,1),yp(:,3));
Rˇesˇenı´ vidı´me na obr. 4.9a. Kyvadlo bylo v tomto prˇ´ıpadeˇ uvedeno do pohybu pusˇteˇnı´m z maxima´lnı´ vy´chylky. Pokud zmeˇnı´me pocˇa´tecˇnı´ podmı´nky tak, zˇe kyvadlo rozhoupeme udeˇlenı´m pocˇa´tecˇnı´ rychlosti z rovnova´zˇne´ polohy, bude mı´t pru˚meˇt trajektorie do roviny xy podobu zna´zorneˇnou na obr. 4.9b. Prˇipomenˇme, zˇe meˇrˇ´ıtko na osa´ch nenı´ stejne´, za uvazˇovany´ch 50 s nemu˚zˇe by´t vy´chylka ve smeˇru osy y velka´ (naopak je rˇa´doveˇ skoro 1000-kra´t mensˇ´ı). 0,015
0,04
0,01
0,03 0,02
–5
0 –4
–3
–2
–1
0
1
2
3
4
0,01
y/m
y/m
0,005
5
–15
–0,005
0 –10
–5
0
5
10
–0,01
–0,01
–0,02
–0,015 x/m
–0,03 x/m
(a) Počáteční podmínky x0 = 5 m, vx0 = 0 m·s−1
(b) Počáteční podmínky x0 = 0 m, vx0 = 5 m·s−1
Obr. 4.9: Kmity Foucaultova kyvadla 71
15
Literatura
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19]
Wikipedie, otevrˇena´ encyklopedie, URL: http://cs.wikipedia.org/. Bajer J.: Mechanika 3. PrˇF UP Olomouc 2006. Bartsch H.J.: Matematicke´ vzorce. SNTL, Praha 1984. Brdicˇka M. – Hladı´k A.: Teoreticka´ mechanika. Academia, Praha 1987. Dvorˇa´k L.: Pruzˇne´ kyvadlo: od teoreticke´ mechaniky k pokusu˚m a zase zpa´tky. PMFA 51 (2006), cˇ. 4, s. 312–327. GNU project: GNU General Public License v. 2 (cˇesky´ prˇeklad), URL: http://gnu.cz/article/30/pdf/gpl-cz.pdf. Greiner W.: Classical mechanics: systems od particles and Hamiltonian dynamics. Springer-Verlag, New York 2003. Havra´nek A. – Cˇertı´k O.: Pruzˇne´ kyvadlo. PMFA 51 (2006), cˇ. 3, s. 198–216. Holı´kova´ L.: Pouzˇitı´ numericky´ch metod v u´loha´ch strˇedosˇkolske´ fyziky. Dipl. pra´ce, UP Olomouc 2006. URL: http://optics.upol.cz/~richterek/files.html. Jarnı´k V.: Diferencia´lnı´ pocˇet I. Academia, Praha 1984. Just M.: Octave – cˇesky´ pru˚vodce programem, URL: http://www.octave.cz/. Lepil O.: Dynamicke´ modelova´nı´. Studijnı´ text, UP, Olomouc 2001. Marˇ´ık R.: Pru˚beˇh funkce (Matematika (nejen pro) krajina´rˇe a na´bytka´rˇe), URL: http://user.mendelu.cz/marik/mat-web/mat-webse4.html. Mı´ka S.: Numericke´ metody algebry. Matematika pro vysoke´ sˇkoly technicke´ sesˇit IV, SNTL, Praha 1982. Pola´cˇek J.: GNU Octave, URL: http://www.abclinuxu.cz/software/veda/gnu-octave. Prˇikryl P.: Numericke´ metody matematicke´ analy´zy. Matematika pro vysoke´ sˇkoly technicke´ sesˇit XXIV, SNTL, Praha 1985. Rektorys K. a kol.: Prˇehled uzˇite´ matematiky I, II. SNTL, Praha 1988. Sˇedivy´ P.: Uzˇitı´ numericky´ch metod prˇi rˇesˇenı´ rovnic ve fyzika´lnı´ch u´loha´ch. Studijnı´ text pro rˇesˇitele 35. rocˇnı´ku FO, MAFY, Hradec Kra´love´ 1996. Sˇedivy´ P.: Modelova´nı´ pohybu˚ numericky´mi metodami. Knihovnicˇka Fyzika´lnı´ olympia´dy cˇ. 38, Gaudeamus, Hradec Kra´love´ 1999. URL: http://fo.cuni.cz/texty/modelov.pdf.
72
[20] Sˇedivy´ P. – Volf I.: Pohyb teˇlesa po elipticke´ trajektorii v radia´lnı´m gravitacˇnı´m poli. Knihovnicˇka FO cˇ. 43, MAFY, Hradec Kra´love´ 2000. URL: http://fo.cuni.cz/texty/druzice.pdf. [21] Strogatz S.H.: Nonlinear Dynamics and Chaos: With Applications to Physics, Biology, Chemistry and Engineering. Westview Press 2000. [22] Trkal V.: Mechanika hmotny´ch bodu˚ a tuhe´ho teˇlesa. CˇSAV, Praha 1956. [23] Volf I. – Sˇedivy´ P.: Pohyby teˇlesa v odporujı´cı´m prostrˇedı´. Hradec Kra´love´ 1992. URL: http://fo.cuni.cz/texty/odpor.pdf. [24] Vybı´ral B. – Zdeborova´ L.: Pohyb teˇles s vlivem odporovy´ch sil. Knihovnicˇka FO cˇ. 55, MAFY, Hradec Kra´love´ 2002. URL: http://fo.cuni.cz/texty/odpory.pdf. [25] Williams T. Kelley C. – others.: Gnuplot. An Interactive Plotting Program, URL: http://www.gnuplot.info/docs/gnuplot.html.
73
Seznam příkazů použitých v textu
\ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 fzero . . . . . . . . . . . . . . . . . . . . . . . . . . 39 ’ . . . . . . . . . . . . . . . . . . . . . . . . . . . 14, 19 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 .* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 ./ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 .^ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 / . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 ; . . . . . . . . . . . . . . . . . . . . . . . 14, 30, 41 # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 % . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 ^ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 gnuplot raw . . . . . . . . . . . . . . . 26 (reset;) . . . . . . . . . 28, 30, 36 gnuplot set . . . . . . . . . . . . . . . 26 cntrparam . . . . . . . . . . . . . . 31 colorbox . . . . . . . . . . . . . . . 32 contour . . . . . . . . . . . . . . . . . 31 data style . . . . . . 28, 30, 36 decimalsign . . . . . . . . 27, 31 grid . . . . . . . . . . . . . . . . . . . . 27 line style . . . . . . . . . . . . . 35 mouse . . . . . . . . . . . . . . . . 26, 34 mxtics . . . . . . . . . . . . . . . . . . 34 mytics . . . . . . . . . . . . . . . . . . 34 mztics . . . . . . . . . . . . . . . . . . 34 noborder . . . . . . . . . . . . 28, 49 nohidden3d . . . . . . . . . . . . . 35 nokey . . . . . . . . . . . . 27, 31, 49 nomouse . . . . . . . . . . . . . . . . . 26 nosurf . . . . . . . . . . . . . . . . . . 35 noxtics . . . . . . . . . . . . . . . . . 49 noytics . . . . . . . . . . . . . . . . . 49 noztics . . . . . . . . . . . . . . . . . 49 output . . . . . . . . . . . . . . . . . . 36 74
palette . . . . . . . . . . . . . 31–33 pm3d . . . . . . . . . . . . . . . . . 31, 35 style data filledcurves 29, 30 term . . . . . . . . . . . . . . . . . . . . 36 tics out . . . . . . . . . . . . 27, 31 ticslevel . . . . . . . . . . . . . . 33 view . . . . . . . . . . . . . . . . . 33–34 xlabel . . . . . . . . . . . . . . . . . . 34 xrange . . . . . . . . . . . . . . 27, 56 xtics . . . . . . . . . . . . . . . . . . . 34 xzeroaxis lt -1 . . . . . . . 28 ylabel . . . . . . . . . . . . . . . . . . 34 yrange . . . . . . . . . . . . . . 27, 56 ytics . . . . . . . . . . . . . . . . . . . 34 yzeroaxis lt -1 . . . . . . . 28 zlabel . . . . . . . . . . . . . . . . . . 34 zrange . . . . . . . . . . . . . . . . . . 27 ztics . . . . . . . . . . . . . . . . . . . 34 abs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 atan2 . . . . . . . . . . . . . . . . . . . . . . . . . . 67 axis . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 (’equal’) . . . . . . . 28, 34, 63 (’off’) . . . . . . . . . . . . . . . . . 28 cd . . . . . . . . . . . . . . . . . . . . . . . . . . 12, 40 center . . . . . . . . . . . . . . . . . . . . . . . . 21 clc . . . . . . . . . . . . . . . . . . . . . . . . . 15, 36 clear . . . . . . . . . . . . . . . 15, 21, 36, 53 clock() . . . . . . . . . . . . . . . . . . . . . . . 41 columns . . . . . . . . . . . . . . . . . . . . 53, 59 conv . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 cos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 deconv . . . . . . . . . . . . . . . . . . . . . . . . 19 det . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 disp . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
else . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 endfor . . . . . . . . . . . . . . . . . . 53, 56, 60 endif . . . . . . . . . . . . . . . . . . . . . . . . . . 42 endwhile . . . . . . . . . . . . . . . . . . . . . . 42 etime . . . . . . . . . . . . . . . . . . . . . . . . . . 41 e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 format long . . . . . . . . . . . . . . . . . . . . 13 short . . . . . . . . . . . . . . . . . . . 13 for . . . . . . . . . . . . . . . . . . . . . 53, 56, 60 fprintf . . . . . . . . . . . . . . . . . . . . . . . 16 fsolve . . . . . . . . . . . . . . . . . . . . . 38, 39 function . . . . . . . . . . . . . . . . . . . . . . 39 global . . . . . . . . . . . . . . . . . . . . . . . . 46 gnuplot has pm3d . . . . . . . . . . . . . 34 gset . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 history . . . . . . . . . . . . . . . . . . . . . . . 23 hold off . . . . . . . . . . . . . . . 53, 56, 60 on . . . . . . . . . . . . . . . . 53, 56, 60 if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 linspace . . . . . . . . . . . . . . . 24, 28, 46 load . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 log10 . . . . . . . . . . . . . . . . . . . . . . . . . . 26 loglog . . . . . . . . . . . . . . . . . . . . . . . . 27 log . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 lsode . . . . . . . . . . . . 44, 46, 49, 51, 68 ls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 mean . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 meshgrid . . . . . . . . . . . . . . . . . . . . . . 30 mesh . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 num2str . . . . . . . . . . . . . . . . . . . . . . . 56 pause . . . . . . . . . . . . . . . . . . . . . . . . . . 16 peaks . . . . . . . . . . . . . . . . . . . . . . . . . . 30 pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 plot3 . . . . . . . . . . . . . . . . . . . . . . . . . . 49 plot . . . . . . . . . . . . . . . . . . . . . . . 24–30 polyfit . . . . . . . . . . . . . . . . . . . . . . . 22 polyout . . . . . . . . . . . . . . . . . . . . . . . 18 poly . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 printf . . . . . . . . . . . . . . . . . . 13, 16, 41
75
pwd . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 rand . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 replot . . . . . . . . . . . . . . . . . . 27, 31, 32 roots . . . . . . . . . . . . . . . . . . . . . . . . . . 18 rows . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 save . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 semilogx . . . . . . . . . . . . . . . . . . . . . . 27 semilogy . . . . . . . . . . . . . . . . . . . . . . 27 sin . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 sombrero . . . . . . . . . . . . . . . . . . . . . . 30 sqrt . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 sum . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 surf . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 var . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 while . . . . . . . . . . . . . . . . . . . 42, 53, 63 zeros . . . . . . . . . . . . . . . . . . . . . . . . . . 49