====== Cvičení 12, Quick test, náhodná čísla, grafický výstup ====== ===== náplň cvičení ===== ====== Quick test ====== * Program odevzdejte přes odevzdávací systém do úlohy **QT13** po jménem **points.py** * {{courses:b3b33alp:cviceni:data13.zip|Testovací data}} ==== Generování (pseudo)náhodných čísel ==== * Co je to "náhodné" číslo? * Lze generovat náhodná čísla na deterministickém stroji? * Pro generování opravdu náhodný čísel je nutné použít vnější zdroj, např. šum diody, což je ne vždy možné. * Jiné řešení spočívá ve výpočtu takové řady čísel, která se na 'dostatečně krátkém' úseku jeví jako náhodná * Nejčastěji používané: [[https://en.wikipedia.org/wiki/Linear_congruential_generator | LCG ]] === Princip LCG === * Generujeme posloupnost čísel $x_{n+1} = (ax_n + c)\,\, \mathrm{mod}\,\, m $ * kde $x_n$ je předchozí číslo, $x_{n+1}$ je následující číslo * $a,c,m$ jsou konstanty. * $m$ určuje periodu posloupnosti. * Naprogramujte toto LCG s parametry $a=1$, $c=1$, $m=5$. * Pozorujte, co se stane při $m=6$. * Prvnímu číslu posloupnosti říkáme **seed** === Generování náhodných čísel v Pythonu === * Modul **random** * funkce 'random()': generuje náhodné číslo z rovnoměrného rozdělení v rozsahu $<0,1)$. * funkce 'randint(a,b)': náhodné int číslo z rovnoměrného rozdělení v rozsahu $ import random for i in range(10): print(random.random()) import random for i in range(10): print(random.randint(-10,10)) * Python defaultně nastavuje **seed** tohoto generátoru na aktuální čas. * Seed lze nastavit ručně: ''random.seed( cislo )'' ==== Vytváření jednoduché grafiky ==== * Existuje mnoho knihoven realizujících grafiku. * Knihovna Matplotlib: {{http://matplotlib.org/}} * podobné ovládání jako příkaz ''plot'' v Matlabu Hlavní metodou je funkce matplotlib.pyplot.plt, ktera zobrazi vektor cisel: from numpy import * import matplotlib.pyplot as plt x = arange(0.,10.,0.1) y = sin(x) plt.plot(y) plt.show() {{courses:b3b33alp:cviceni:graf1.png?300|}} Všimněte si, ze výsledný graf je na ose 'x' číslován od 0 do 100, neboť to je velikost pole 'y'. Další možností je na zobrazit funkci sinus společně s osou 'x' definovanou dle pole 'x': plt.plot(x,y) {{courses:b3b33alp:cviceni:graf2.png?300|}} Popisky os: plt.xlabel('osa x') plt.ylabel('osa y') Samostatné úsečky: je třeba zadat pole počátečních x-ových a y-ových souřadnic. plt.plot([x1,x2],[y1,y2],'k-'); Uložení obrázků do souboru: příkaz: [[ http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.savefig | savefig ]]. Pro současné ulozeni obrázků do souboru a zobrazení je třeba volat ''savefig'' před příkazem ''show''. plt.savefig('jmeno.png') Kreslení historgramu - příkaz [[ http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.hist | hist ]] import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt size = 10000 y = np.random.randn(size) n, bins, patches = plt.hist(y, 50, normed=0, alpha=0.74) plt.savefig('histogram1.png', dpi=600) plt.show() {{courses:b3b33alp:cviceni:histogram1.png?300|}} Poznámka: meze grafu lze určit i ručně příkazem [[ http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.axis | axis ]] plt.axis([-5,5, 0, 0.5]) zobrazí graf na ose 'x' v rozsahu -5,5 a na ose 'y' v rozsahu 0 až 0.5. ==== Úkol 4: zobrazení histogramu ==== * Vygenerujte náhodná čísla z Gaussova rozdělení se střední hodnotou 5 a $\sigma=15$. * Vygenerujte náhodná čísla z Gaussova rozdělení se střední hodnotou 0 a $\sigma=5$. * Zobrazte příslušné histogramy do jednoho grafu * ==== Kreslení fraktálů ==== Ukázky fraktálů. Příklad vykreslení Kochovy křivky. {{courses:b3b33alp:cviceni:fractal_example.png?300}} == Kresleni fraktalu == import numpy as np import matplotlib.pyplot as plt def drawBranch(x, y, length, angle): s = 0.7 a1 = 0.15 a2 = -0.15 if (length < 0.3): return l2 = s*length x1 = x + l2*np.cos(angle) y1 = y + l2*np.sin(angle) plt.plot([x,x1],[y,y1], 'k-') drawBranch(x1,y1,l2, angle+a1) drawBranch(x1,y1,l2, angle+a2) drawBranch(5,0,6,1.57) plt.show() {{courses:b3b33alp:cviceni:fractal_example.png?300}}