Warning
This page is located in archive.

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