Témata

Témata jsou hlavním obsahem časopisu M&M. Obvykle představují složitější a obecnější problémy než samostatné úlohy. Navíc je v jejich zadání vždy prostor pro tvůrčí rozšíření. Za pěkný článek k tématu lze získat třeba i 20 bodů, určitě se tedy vyplatí se tématy zabývat.

Jak řešit téma?

Letos jsme pro tebe připravili tato témata:

Téma 1: Sluneční hodiny

Čas – veličina spjatá s potřebou člověka orientovat se a rozumět okolnímu světu. U ostatních živočichů se vyvinulo vnímání a řízení životních etap především prostřednictvím biologických hodin, nevznikla u nich potřeba čas přesněji rozškálovat. Historie porozumění času člověkem – od uvědomění si pravidelných opakování různých dějů v přírodě po spojení času s ezoterikou a božskou podstatou – to je jistě stravou mnoha filozofů a básníků. My se pojďme podívat na způsob, který člověku prostřednictvím odhalení principů nebeské mechaniky umožnil čas měřit. Jedním z prvních systémů měření času jsou dodnes používané sluneční hodiny. Při bádání nad tímto tématem vás mohou inspirovat následující problémy:

  1. K přibližnému určení denní doby vám může sloužit i vlastní stín. Jak se bude měnit délka a orientace stínu v průběhu dne a jak z něj přibližně určit čas?
  2. Zamyslete se nad různými typy slunečních hodin. Jak se budou jejich parametry lišit v závislosti na zeměpisné šířce? Bude se jejich přesnost měnit v průběhu roku? A co třeba v průběhu staletí, tisíciletí?
  3. Zkonstruujte vlastní model slunečních hodin (jakéhokoliv typu) a testujte jejich přesnost v průběhu roku. S návrhem vám může pomoci např. web www.astrohk.cz/slunecni_hodiny.html

Stejně


Téma 2: Časosběr

Jedna z možností, jak upravovat videozáznam, je ovlivňování rychlosti přehrávání. Získáme tak zrychlené nebo zpomalené záběry, díky kterým můžeme z videa vytěžit výrazně více informací. V tomto témátku se budeme věnovat několikanásobně zrychlenému přehrávání, kterému se říká časosběr nebo anglicky timelapse. Když si do vyhledávače zadáte klíčové slovo timelapse, najdete mnoho inspirujících záběrů.

K pořízení takového videa přitom stačí chytrý telefon s nějakou aplikací, kterou je možné stáhnout pod klíčovým slovem timelapse. Tuto funkci podporují i některé fotoaparáty, většinou pod pojmem sekvence.
V průběhu roku se postupně podíváme na různé techniky a účinky, kterých můžeme dosáhnout. V první vlně se zaměříme na informační hodnotu takového videa. Vyberte si nějaký velmi pomalý děj (vysychání, růst, vznik mlhy, . . . ) a zdokumentujte ho zmíněnou technologií. Výsledné video pak nahrajte podle instrukcí na naší webové stránce mam.mff.cuni.cz/jak-resit.

Stejně


Téma 3: Filmoví poradci

Vyberte si film a popište fyzikální, matematické nebo informatické nesmysly, které se v něm vyskytují.

Navrhněte, jak tyto nesmysly odstranit, pokud to jde. V příspěvku popište část filmu, ve které se nesmyslná scéna odehrává (např. specifikací od a do které minuty filmu scéna probíhá).

Stejně


Téma 4: Simulace ve fyzice částic

Počítačové technologie rozšiřují možnosti řešení čím dál komplikovanějších fyzikálních úloh. Dříve byla dovednost umět využívat programování při fyzice výhodná, dnes je již prakticky nutná. Proto přinášíme téma věnované fyzikálním částicovým simulacím. Budete mít za úkol zkoumat metody simulací a porovnávat jejich vlastnosti. Nabídneme též pár krátkých návodů, které vám pomohou překonat bariéru k programování, pokud jste se s ním ještě vůbec nesetkali.

 

Vaším prvním úkolem je simulovat kmitavý pohyb harmonického oscilátoru pomocí několika metod a metody pak porovnat. V kmitavém pohybu je zrychlení $a$ popsáno rovnicí

\[ a = - \omega ^2 x, \]

jako funkce polohy $x$ při parametru $\omega $.

Pro úlohy tohoto typu (kde dynamiku nám určuje zadané zrychlení jakožto funkce polohy) je vždy potřeba znát počáteční podmínky, kterými je počáteční poloha a počáteční rychlost. Následně pak podle zvolené metody tyto hodnoty po krátkých časových krocích přepočítáváme.

Numerické metody většinou podléhají chybám (odchylkám od přesného řešení), které lze redukovat dělením na větší počet kratších časových úseků a nebo použitím jiné metody. Přestože již v dnešní době není problém provést simulaci s větším počtem kratších kroků, existují metody, u kterých zjemňování nepomáhá dostatečně, protože jejich chyba exponenciálně roste. Proto je snaha vyvíjet numerické metody tak, aby poskytovaly dostatečně přesné řešení i pro menší počty kroků.

Všechny metody fungují tak, že v každém kroku „staré“ hodnoty nahradí „novými“ podle určitého schématu. Poté hodnoty, které jsou nové, použijí jako staré pro příští krok. Pro výpočet nových hodnot na základě starých použijte dvě různé metody:

 

Metoda A

\begin{align*} t_{\rm new} & \leftarrow t_{\rm old} + h\\ x_{\rm new} & \leftarrow x_{\rm old} + h \cdot v_{\rm old}\\ v_{\rm new} & \leftarrow v_{\rm old} + h \cdot a(x_{\rm old})\\ x_{\rm old} & \leftarrow x_{\rm new}\\ v_{\rm old} & \leftarrow v_{\rm new}\\ t_{\rm old} & \leftarrow t_{\rm new}\\ \end{align*}

 

Metoda B

\begin{align*} t_{\rm new} & \leftarrow t_{\rm old} + h\\ x_{\rm new} & \leftarrow x_{\rm old} + h \cdot v_{\rm old}\\ v_{\rm new} & \leftarrow v_{\rm old} + h \cdot a(x_{\rm new})\\ x_{\rm old} & \leftarrow x_{\rm new}\\ v_{\rm old} & \leftarrow v_{\rm new}\\ t_{\rm old} & \leftarrow t_{\rm new}\\ \end{align*}

 

Hned v prvním příkladu si tedy vyzkoušejte nasimulovat průběh pohybu harmonického oscilátoru. Jako počáteční podmínky volte polohu a rychlost

\begin{align*} x & = 1 \, \mathrm{m}\\ v~ & = 0 \, \mathrm{m/s}, \end{align*}

přičemž zrychlení je popsáno výše uvedenou rovnicí, kde volte $\omega = 1 \, \mathrm{s^{-1}}$.

Na konci každého kroku je vhodné hodnotu $x_{\rm new}$ uložit do souboru pro následnou analýzu v grafickém programu1 a dále pokračovat opakováním cyklu. Je vhodné zobrazovat závislost $x$ (poloha) na $t$ (čas). Pro začátek doporučujeme nastavit hodnotu časového kroku $h = 0,1 \, \mathrm{s}$ a počet kroků simulace na 200.

Obě metody budou zatíženy určitou chybou oproti přesnému řešení, kterým je funkce $x = \cos (\omega t)$. Chyby budou různě velké, ale velmi důležité je též to, jakým způsobem se chyba projevuje. Pro tuto analýzu zkoušejte nastavit i jinak veliké časové kroky a měňte jejich počet. Pokud si troufáte, můžete se pokusit vysvětlit, proč jsou tyto metody schopny se přiblížit k přesnému řešení pro dostatečně malý krok $h$.

Zkuste vlastními slovy popsat, v čem se výsledky těchto dvou metod liší. Zamyslete se především nad následujícími aspekty simulace:

  • Všímáte si chyby, která se postupně s průběhem simulace nasčítává exponenciálně? Tedy že každá odchylka podporuje nárůst odchylky v následujících krocích, a výsledná chyba tak roste exponenciálně s počtem kroků simulace.

  • Všímáte si chyby, která se postupně s průběhem simulace nasčítává lineárně? Tedy že v každém kroku dojde k odchylce, která je nezávislá na ostatních, a výsledná chyba je pak přímo úměrná počtu kroků simulace.

  • Všímáte si chyby, která postupně s průběhem simulace osciluje? Tedy že chyby v jednotlivých krocích se mezi sebou navzájem odečtou, a pro libovolně dlouhou simulaci se tak chyba nenasčítá.

Nyní si povíme pár rad, jak technicky zvládnout toto téma. Ukážeme si základní program v jazyce C++, pomocí kterého je možné provést základní simulaci a uložit si výsledky do souboru. Doporučíme programy, s jejichž pomocí vše pohodlně zvládnete. Volíme programy a postupy, které jsou hojně využívány ve vědě, a pokud plánujete studovat na MFF UK, tak se s některými z nich dříve nebo později setkáte. Přesto můžete použít jakékoli jiné nástroje a programovací jazyky, zejména pokud je již ovládáte.

Další doporučenou možností je použít jazyk Python. V 17. ročníku M&M o něm vyšel seriál. Na adrese https://mam.mff.cuni.cz/rocnik/17/ si můžete stáhnout čísla s jednotlivými díly seriálu.

Pro začátek bude potřeba si nainstalovat editor, kde budeme psát náš program. Doporučujeme program Dev-C++, který naleznete na webu http://orwelldevcpp.blogspot.cz/. Editor v sobě zahrnuje aktuální verzi kompilátoru TDM-GCC, který bude váš kód překládat do instrukcí pro váš počítač. Pro svůj první program stačí pouze přes cestu File -> New -> Source File vytvořit váš první soubor s kódem programu. Hned si vyzkoušejte první jednoduchý kousek programu. Do nového souboru vložte následující text:

#include <cstdio>

int main()
{
    int i;
    double a = 2.0, x = a;
    FILE* DATA = fopen("data.txt", "w");

    for (i = 1; i <= 6; i = i+1) {
        x = (x + a / x) / 2.0;
        fprintf(DATA, "%d %.15f\n", i, x); 
    }

    fclose(DATA);
    return 0;
}

Pro spuštění programu pak stačí volit Execute -> Compile & Run. Pokud jste tak ještě neučinili, tak vás Dev-C++ vyzve k tomu, abyste zdrojový kód vašeho programu někam uložili na disk.

Jedná se o krátký kus kódu, který v sobě koncentruje skoro vše, co bude potřeba znát pro psaní vlastních simulací. Vysvětlíme si, co přesně provede.

První řádek, #include <cstdio>, zpřístupní k dalšímu použití v programu příkazy pro práci se soubory.

Následuje funkce int main() { ... return 0; }, do které místo ... vepíšeme, co má náš program vykonat. V našem příkladu následuje příkaz int i. Tímto příkazem programu oznamujeme, že hodláme používat proměnnou, kterou nazýváme i a výrazem int dáváme najevo, že se jedná o datový typ integer – nejběžnější typ pro ukládání celých čísel. Všechny proměnné musí být tímto způsobem deklarovány, aby bylo možné s nimi dále pracovat.

Na dalším řádku double a = 2.0, x = a; zakládáme další dvě proměnné, tentokrát typu double, což je jeden z typů reprezentujících reálné číslo. Tentokrát za názvy proměnných přidáváme i počáteční hodnoty, aby proměnná již na začátku danou hodnotu obsahovala. Je dobré vědět, že symbol = v C++ znamená přiřazení (tedy $\leftarrow $ z obecného popisu průběhu simulace). Pokud chceme rovnost v matematickém smyslu slova, je potřeba použít ==. Do proměnné x se v našem kódu uloží hodnota, která je v proměnné a, tedy číslo 2. Mějte na paměti, že reálné číslo zapsané přímo do kódu v sobě musí obsahovat desetinnou tečku, takže v případě čísla 2 musíme volit zápis 2.0 2. Kompilátor sice v mnoha případech i bez toho zápis správně interpretuje jako operaci s desetinnými čísly, ale přesto velmi doporučujeme ji nevynechávat. Všimněte si dále, že na konci každého příkazu máme středník – tímto ukončujeme jednotlivé příkazy. V příkazu double a = 2.0, x = a; máme a a x odděleno pouze čárkou, čímž naznačujeme, že ještě stále definujeme proměnné typu double. Až středníkem ukončíme tuto deklaraci.

Dále následuje příkaz FILE* DATA = fopen("data.txt","w");. V tomto příkazu vytváříme FILE*, což je odkaz na soubor. Soubor jako takový bude uložen v počítači pod názvem data.txt ve stejné složce, kde spouštíte váš kód. Příkaz fopen s parametrem w znamená, že program vytvoří soubor v počítači, pokud ještě neexistuje, a má dovoleno do něj zapisovat. Pokud soubor existuje a má nějaký obsah, tak program jeho obsah smaže. Tímto jsme našemu programu oznámili, s jakými proměnnými bude pracovat a že si má připravit soubor, kde bude své výstupy ukládat.

Následuje cyklus

for (i = 1; i <= 6; i = i+1) {
      ...
}

Zde oznamujeme, že proměnná i nám bude kontrolovat průběh cyklu. Na počátku zde uložíme hodnotu 1 a dokud je hodnota i menší nebo rovna šesti, provede se vnitřek cyklu, a poté i navýšíme o 1. Tím jsme zajistili, že náš cyklus proběhne právě šestkrát. Uvnitř cyklu místo ... umístíme příkazy, které se provedou opakovaně (v našem příkladu šestkrát). Podle prvního řádku x = (x + a / x) / 2.0; dojde k přepsání hodnoty x novou hodnotou, která se spočte z výrazu za symbolem =.

Podle druhého řádku fprintf(DATA, "%d %.15f\n", i, x); náš program zapíše do souboru, na který odkazuje proměnná DATA (jedná se o soubor data.txt, jak jsme deklarovali na začátku). Značky začínající procentem (%d, %.15f) uvnitř příkazu mají speciální význam – budou nahrazeny dalšími parametry příkazu (i a x). Tedy, nejdříve bude vypsáno celé číslo (tomu odpovídá %d), následně mezera a po ní reálné číslo (double) s celkem 15 číslicemi za desetinnou tečkou (tomu odpovídá %.15f). Pak následují parametry i a x, které říkají, že první tag %d bude nahrazen hodnotou uloženou v i a druhý tag %.15f bude nahrazen hodnotou uloženou v x. \n znamená nový řádek v souboru. Doporučujeme pak po proběhnutí programu otevřít soubor data.txt a podívat se, co nám přesně vzniklo. Pokud jste vše provedli správně, mělo by se v souboru data.txt objevit

1

1.500000000000000

2

1.416666666666667

3

1.414215686274510

4

1.414213562374690

5

1.414213562373095

6

1.414213562373095

Přejete-li si data vykreslit, doporučujeme k tomu požít nástroj GNUPLOT, který stáhnete zde http://gnuplot.info/3. Program stačí jen stáhnout a spustit. Pro vykreslení grafu pak stačí zadat v programu příkaz

plot 'C:\vaseslozka\data.txt' with lines

a potvrdit enterem. Místo C:\vaseslozka zadejte vámi zvolenou adresu souboru. Na konci příkazu užíváme postfix with lines, což znamená, že jednotlivé body grafu budou spojeny čarou. Pokud si to nepřejete, tak tato dvě slova jednoduše vynechejte. Gnuplot pak vezme soubor data.txt a vykreslí dvojrozměrný graf. První sloupeček vždy bere jako $x$-ové souřadnice vykreslovaných bodů, druhý jako $y$-ové.

Pokud jste vše zvládli, tak jste napsali svůj první kus kódu, který umí velmi efektivně počítat odmocninu z reálného čísla. Program vždy spočítá odmocninu z čísla $a$, které zadáte na začátku při deklaraci proměnných.

Na tomto příkladu vidíme účinnost použité metody. Všimněte si, že se počet desetinných míst, která odpovídají tabulkové hodnotě odmocniny ze dvou, s každým krokem zdvojnásobuje. Stačí tedy jen pár kroků na výpočet s velmi vysokou přesností.

Ukázkový kód jsme se snažili alespoň rámcově vysvětlit. Nyní byste měli mít přehled o tom, co dělá který řádek kódu. Popsat přesný způsob, jakým se kód vykonává a jak to celé uvnitř funguje, by vyžadovalo mnohem delší povídání. Zájemcům doporučujeme k přečtení seriál C++ pod lupou od Vladimíra Klimovského4. Pokud byste se při řešení tématu potýkali s technickými problémy a nevěděli si rady, určitě nám dejte vědět, rádi vám poradíme.

Mára


1) Při velkém počtu kroků simulace je vhodnější ukládání do souboru provádět až po delším časovém intervalu. Simulace se tím výrazně zrychlí.

2) V jazyce C++ se desetinná čísla píšou ve formátu s desetinnou tečkou, proto budeme tento termín v textu dále používat, přestože se správně v češtině používá desetinná čárka.

3) Podrobnější informace o GNUPLOTu můžete najít v jednom z našich starších čísel na adrese https://mam.mff.cuni.cz/media/cislo/pdf/16/16-4.pdf

4) K dispozici na http://www.pcrevue.sk/a/C—pod-lupou—Prva-cast–Uvod

Stejně