Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

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

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é: 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 $<a,b)$.
  • Uvědomte si, že horní mez není zahrnuta!

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: 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()

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)

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: 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 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()

Poznámka: meze grafu lze určit i ručně příkazem 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.

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/t12.txt · Last modified: 2018/12/17 10:13 by stepan