Co je tu uvnitř. Pět otázek ke státnicím z Monte Carla. U každé je nejprve „kostra“, kterou musí zkoušející slyšet, pak technické detaily, vzorce a názorné příklady.
Jak to číst. Modré rámečky = lidská intuice. Žluté = příklad k zapamatování. Oranžové = časté chytáky. Zelené = co si odnést.
Seznam státnicových otázek
- Popište metodu Monte Carlo. Vysvětlete obvyklé způsoby modelování a generování rovnoměrně rozdělených pseudonáhodných čísel.
- Popište metodu Monte Carlo. Vysvětlete způsoby testování kvality generátorů pseudonáhodných čísel. Popište vlastnosti generátorů a porovnejte je.
- Popište metodu Monte Carlo. Popište obecné principy generování obecně rozdělených náhodných čísel. Vyberte si dvě rozdělení a popište způsoby jejich generování.
- Popište principy modelování transportu částic metodou Monte Carlo.
- Popište principy modelování systémů hromadné obsluhy metodou Monte Carlo.
Metoda Monte Carlo. Modelování a generování rovnoměrně rozdělených pseudonáhodných čísel.
1. Co je metoda Monte Carlo
Monte Carlo (MC) je výpočetní metoda, která modeluje náhodné děje a získává tak odhad veličiny, kterou by jinak bylo těžké nebo nemožné spočítat analyticky. Funguje i pro úlohy, které náhodné nejsou (např. výpočet integrálu), náhodu si tam záměrně přivedeme jako nástroj.
- Znát rozdělení pravděpodobnosti všech jevů v modelu (z teorie nebo empiricky).
- Vygenerovat realizace náhodné veličiny, typicky přes $\Upsilon \sim R(0,1)$.
- Transformovat $\Upsilon$ na požadované rozdělení a výsledky statisticky zpracovat.
2. Zdroje náhodných čísel
- Tabulky náhodných čísel, historické, dnes prakticky bezvýznamné.
- Hardwarové generátory (bílý šum, šum diody, kvantové jevy). Skutečně náhodné, ale nereprodukovatelné, nelze opakovat tentýž výpočet.
- Softwarové (pseudonáhodné) generátory: deterministické posloupnosti, které se chovají „jako náhodné“. Vlastnosti jdou matematicky studovat a výpočet jde zopakovat se stejným seedem. Dnes standard.
3. Požadavky na pseudonáhodnou posloupnost $\theta = \{x_i\}_{i=0}^{\infty}$
Posloupnost musí být statisticky nerozlišitelná od výběru z $Y \sim R(0,1)$. Z toho plyne:
- Střední hodnota: $\displaystyle \lim_{n\to\infty}\frac{1}{n}\sum_{i=1}^{n} x_i = \frac{1}{2}$ (protože $EY = 1/2$).
- Rozptyl: $\displaystyle \lim_{n\to\infty}\frac{1}{n}\sum_{i=1}^{n}(x_i-\bar{x})^2 = \frac{1}{12}$.
- Rovnoměrnost v 1D: Pro libovolnou podmnožinu $I_v \subset (0,1)$ s objemem $v$ platí $\displaystyle \lim \frac{N_v}{n} = v$. (10 % intervalu → 10 % bodů.)
- $k$-rovnoměrnost: $k$-tice po sobě jdoucích čísel musí rovnoměrně vyplnit jednotkovou krychli $C_k = \langle 0,1 \rangle^k$. Tohle je klíčové, generátor může být dobrý v 1D, ale fatálně selhat ve 2D nebo 3D.
- Nulová autokorelace: $\displaystyle \lim \frac{1}{n}\sum (x_{i-t}-\tfrac{1}{2})(x_i-\tfrac{1}{2}) = 0$ pro každé $t > 0$. Znalost dřívějšího čísla nesmí pomoct předpovědět další.
4. Lineární kongruenční generátor (LCG)
- $x_0$ (seed): počáteční hodnota, určuje celou budoucí řadu.
- $K, B, M$: konstanty (multiplikátor, inkrement, modul). Volí se pečlivě, často $M = 2^n$ kvůli rychlosti.
- Výsledek: celé číslo $0 \le x_{n+1} < M$, převod na $(0,1)$ dělením $M$.
5. Mersenne Twister (MT19937)
Dnes nejrozšířenější PRNG (Python, R, PHP, MATLAB). Založen na lineárních posuvných registrech.
- $w$: délka slova (typicky 32 bitů).
- $n = 624$: počet stavů v registru.
- $m = 397$, $r = 31$: posuny a maskování.
- $A$: konstantní matice $w \times w$ z $\{0,1\}$, realizovaná jako shift+XOR.
- $\oplus$ je bitový XOR, $|$ je zřetězení.
Proč je tak dobrý:
- Perioda $2^{19937}-1$, Mersennovo prvočíslo, odsud název.
- $k$-rovnoměrnost až ve 623 rozměrech.
- Rychlý: jen XOR a posuny.
6. Generování na obecný interval $R(a,b)$
7. Golombovy požadavky (binární posloupnosti)
Nutná (ne dostačující) podmínka rovnoměrnosti pro binární posloupnosti:
- Rovnováha: počet 0 a 1 se liší max. o jedna.
- Běhy (runs): polovina běhů má délku 1, čtvrtina délku 2, osmina délku 3, …
- Ideální autokorelace: při posunu vůči sobě je shoda minimální.
Testování kvality generátorů, vlastnosti generátorů a jejich porovnání.
Pokud posloupnost selže v některém testu, není to model $R(0,1)$. Pokud projde všemi, ještě to neznamená, že je správná (testy jsou nutná, ne postačující podmínka). Hladina významnosti je obvykle $\alpha = 0{,}05$.
Frekvenční test (test dvojic 0/1)
Ověřuje, že v binárním zápisu se 0 a 1 vyskytují přibližně stejně často.
- Rozdělení: $\chi^2$ s 1 stupněm volnosti (známe-li $n_0$, $n_1 = n - n_0$).
- Kritická hodnota: $X_1 < 3{,}84$ s 95% spolehlivostí.
Pohled přes binomické rozdělení
Pro $m$ slov o $n$ bitech má počet jedniček binomické rozdělení s parametry $mn$ a $p = 1/2$. S 95% pravděpodobností by měl ležet v intervalu $\Bigl(\frac{nm}{2} - \sqrt{nm},\ \frac{nm}{2} + \sqrt{nm}\Bigr)$.
Test sérií (rovnoměrnost dvojic)
Frekvenční test neodhalí třeba posloupnost 010101..., ta má stejně 0 i 1, ale je periodická. Test sérií zkoumá, zda dvojice 00, 01, 10, 11 jsou přibližně stejně časté.
- Rozdělení: $\chi^2$ se 2 stupni volnosti (4 typy dvojic, vazby na celkový počet).
- Kritická hodnota: $X_2 < 5{,}99$.
Druhá varianta: rozdělí se $(0,1)$ na $r$ stejných podintervalů a sleduje četnost padání čísel do nich, připravuje testy ve více dimenzích.
Pokerový test
Sleduje četnost vzorů (úseků) délky $m$ bitů. Pokud by některá kombinace byla častější, generátor je předvídatelný.
- Vyber $m$; rozděl posloupnost délky $N$ na $k = \lfloor N/m \rfloor$ úseků.
- Existuje $2^m$ typů úseků; $n_i$ = počet výskytů $i$-tého typu.
- Podmínka průkaznosti: $k \ge 5 \cdot 2^m$ (na každý typ aspoň 5 očekávaných výskytů).
Rozdělení: $\chi^2$ s $2^m - 1$ stupni volnosti.
Test běhů (Runs test)
Sleduje, zda délky nepřerušených sekvencí (běhů) bitů odpovídají Golombovým požadavkům.
- Blok $B_i$: nepřerušená řada jedniček délky $i$.
- Mezera $M_i$: nepřerušená řada nul délky $i$.
Vezmeme největší $k$ takové, že $e_k \ge 5$.
Rozdělení: $\chi^2$ s $2k - 2$ stupni volnosti.
Autokorelační test
Hledá skryté závislosti mezi bity vzdálenými o $d$ pozic.
- Zvolí se posun $1 \le d \le \lfloor n/2 \rfloor$ (různý od periody).
- Spočítá se $A(d) = \sum_{i=1}^{n-d-1} s_i \oplus s_{i+d}$ (kolikrát se bity liší).
Rozdělení: $N(0,1)$ pro $n - d > 10$. Generátor projde, pokud $|X_5| \le 1{,}96$ (95% spolehlivost).
Maurerův univerzální statistický test
Nejsilnější z uvedených. Vychází z informační teorie: opravdu náhodná data nesmí jít zkomprimovat. Pokud lze, generátor obsahuje skrytý řád.
- Univerzální = postihne široké spektrum nedostatků, které jednodušší testy minou.
- Velmi dobře odhalí dlouhé periodicity.
- Průchod Maurerovým testem je silný indikátor, že posloupnost vypadá jako $R(0,1)$.
Shrnutí kvality: LCG vs. Mersenne Twister
| Vlastnost | LCG | Mersenne Twister |
|---|---|---|
| Složitost implementace | Velmi jednoduchá (jedno násobení + modulo) | Složitější (posuvné registry, matice $A$) |
| Perioda | Krátká, max $M$ | $2^{19937} - 1$ |
| $k$-rovnoměrnost | Selhává, body leží na nadrovinách | Dobrá až v 623 rozměrech |
| Korelace | Vyšší, viditelné vzory | Velmi nízká |
| Kryptografická bezpečnost | Ne | Ne (predikce po 624 výstupech) |
| Test průchodnost | Často padá v komplexních testech | Prochází téměř vším |
Generování obecně rozdělených náhodných čísel. Příklady dvou rozdělení.
Princip je vždy stejný: máme „spravedlivé“ $\Upsilon \sim R(0,1)$ a chceme z něj vyrobit realizaci náhodné veličiny s úplně jiným rozdělením. Cestou je distribuční funkce, slouží jako převodník.
A) Diskrétní náhodné veličiny
Chceme $\xi$ s rozdělením $P(\xi = x_k) = p_k$. Geometricky: rozřežeme úsečku $(0,1)$ na kousky o délkách $p_k$ a sledujeme, do kterého padne $\Upsilon$.
Základní algoritmus
- Generuj $\Upsilon \sim R(0,1)$; polož $S \leftarrow \Upsilon$, $k \leftarrow 0$.
- $S \leftarrow S - p_k$.
- Je-li $S > 0$, zvětši $k$ o 1 a jdi na krok 2.
- Výsledek: $\xi = x_k$.
Složitost
Časová náročnost lineárně závisí na střední hodnotě indexu $E\xi$. Čím dál se průměrně musí algoritmus dostat, tím déle počítá.
Modifikovaný algoritmus 1: setřídění sestupně
Setřídíme $p_{k_0} \ge p_{k_1} \ge p_{k_2} \ge \dots$ a pak běží stejný algoritmus. Nejčastější hodnoty se trefíme hned napoprvé.
Bez setřídění: $E\xi = 0\cdot 0{,}1 + 1\cdot 0{,}2 + 2\cdot 0{,}7 = 1{,}6$, průměr 2,6 dotazů.
Po setřídění (Rum, Voda, Pivo): $E\xi = 0\cdot 0{,}7 + 1\cdot 0{,}2 + 2\cdot 0{,}1 = 0{,}4$, průměr 1,4 dotazu, skoro 2× rychleji.
Modifikovaný algoritmus 2: start od vrcholu
Pro rozdělení, kde $p_k$ rostou až k indexu $h$ a pak klesají (typicky Poissonovo s velkým $\lambda$). Předpočítáme $Q = \sum_{k=0}^{h} p_k$ a startujeme od $h$:
- Generuj $\Upsilon$. Polož $p \leftarrow p_h$, $m \leftarrow h$, $S \leftarrow \Upsilon - Q$.
- Když $S > 0$, hledej napravo ($m+1, m+2, \dots$).
- Když $S \le 0$, hledej nalevo ($m-1, m-2, \dots$).
Tři konkrétní diskrétní rozdělení
- Nastav $n \leftarrow -1$, $S \leftarrow 1$, $q \leftarrow e^{-\lambda}$.
- Generuj $\Upsilon$.
- $n \leftarrow n+1$, $S \leftarrow S \cdot \Upsilon$.
- Je-li $S > q$, vrať se na krok 2. Jinak výsledek je $\xi = n$.
Trik: namísto sčítání času se násobí náhodná čísla < 1. Hodnota $S$ klesá, dokud nepropadne pod limit $q$.
- Kolo 1: $\Upsilon_1 = 0{,}60$, $S = 0{,}60$. Je $0{,}60 > 0{,}1353$ → ANO. $n=0$.
- Kolo 2: $\Upsilon_2 = 0{,}45$, $S = 0{,}60 \cdot 0{,}45 = 0{,}27$. ANO. $n=1$.
- Kolo 3: $\Upsilon_3 = 0{,}30$, $S = 0{,}27 \cdot 0{,}30 = 0{,}081$. NE → STOP.
B) Spojité náhodné veličiny
1. Inverzní transformace (základní metoda)
Distribuční funkce $F(x)$ mapuje hodnoty na interval $(0,1)$. Položíme $F(\xi) = \Upsilon$ a vyřešíme:
2. Zamítací metoda (Rejection)
Když rovnici $F(\xi) = \Upsilon$ nejde rozumně vyřešit. Předpoklad: hustota $f(x)$ je omezená konstantou $C$ na intervalu $\langle a, b \rangle$.
- $\Upsilon_1 \sim R(a,b)$: náhodná pozice na ose $x$.
- $\Upsilon_2 \sim R(0,C)$: náhodná výška.
- Je-li $\Upsilon_2 > f(\Upsilon_1)$ (bod nad křivkou), zamítni a zkus znovu.
- Jinak $\xi = \Upsilon_1$.
3. Normální rozdělení $N(0,1)$
$\xi_2 = \sqrt{-2\ln\Upsilon_1}\cdot \cos(2\pi\Upsilon_2)$
Modelování transportu částic metodou Monte Carlo.
Simulace průchodu záření (fotony, elektrony, neutrony) hmotou. Typické úlohy: výpočet stínění, optimalizace jaderných zařízení, dozimetrie, simulace detektorů. Trajektorie každé částice je posloupností náhodných událostí: uletí kus → narazí na atom → buď je pohlcena, rozptýlena, nebo způsobí štěpení.
Zjednodušující předpoklady
- Mezi částicemi není interakce: platí, pokud hustota toku není extrémní.
- Pohyb je popsán pouze interakcemi s atomy prostředí; potřebujeme znát pravděpodobnosti (pohlcení, rozptyl, štěpení) a hustotu atomů.
- Mezi interakcemi částice letí přímočaře (zakřivení gravitací atd. zanedbáno).
- Sekundární částice vznikají v bodě interakce.
Účinné průřezy: měřítko pravděpodobnosti interakce
Diferenciální účinný průřez
- $\mathbf{r}$: bod v prostoru.
- $\boldsymbol{\omega}', \boldsymbol{\omega}$: směr před a po interakci.
- $E$: energie částice.
- $d\Omega = \sin\vartheta\, d\vartheta\, d\varphi$: element prostorového úhlu.
- $\sigma_a$: mikroskopický průřez (pravděpodobnost na jeden atomový terč, normovaná na jednotkovou hustotu toku).
Makroskopický účinný průřez
$N$ je počet terčů (atomů) na jednotku objemu. Vyjadřuje skutečnou pravděpodobnost interakce v daném materiálu.
Volná dráha a optická vzdálenost
Vzdálenost mezi dvěma interakcemi (volná dráha $\ell$) je náhodná veličina s exponenciálním rozdělením:
Distribuční funkce:
$\tau(t)$ je optická vzdálenost, integrál makroskopického průřezu po dráze. Pravděpodobnost, že částice přežije dráhu délky $t^*$, je $e^{-\tau(t^*)}$.
Typy interakce: střední hodnota $\nu$
| Interakce | $\nu$ | Co se stane |
|---|---|---|
| Pohlcení (absorpce) | $\nu = 0$ | Částice zaniká, sledování končí. |
| Rozptyl | $\nu = 1$ | Mění směr a/nebo energii, letí dál. |
| Štěpení / multiplikace | $\nu > 1$ | Vznikne víc nových částic. |
Vznikají-li identické sekundární částice, sloučíme všechny dílčí interakce do jediné s váženými průměry:
Algoritmus pro $\nu \le 1$ (pohlcení + rozptyl)
- Emise: vygeneruj $\mathbf{r}_0$ a směr $\boldsymbol{\omega}_0$ podle rozdělení zdroje.
- Transport: nasimuluj volnou dráhu $s$ (exp. rozdělení) a posuň částici: $\mathbf{r} = \mathbf{r}_0 + s\,\boldsymbol{\omega}_0$.
- Test geometrie: je $\mathbf{r}$ mimo zkoumanou oblast? Pak částice utekla, jdi na 8.
- Druh interakce: diskrétní výběr podle průřezů. Pokud pohlcení, jdi na 8.
- Sekundární parametry: z diferenciálních průřezů simuluj úhel rozptylu $\vartheta$ ($\mu = \cos\vartheta$) a azimut $\varphi$.
- Nový směr: přepočti směrový vektor $\boldsymbol{\omega}$.
- Cyklus: $\mathbf{r}_0 \leftarrow \mathbf{r}$, $\boldsymbol{\omega}_0 \leftarrow \boldsymbol{\omega}$, jdi na 2.
- Vyhodnocení: připočti skóre (např. dávku, počet rozptylů), připrav novou primární částici.
Algoritmus pro $\nu > 1$ (štěpení)
Počítač neumí sledovat dvě částice najednou, potřebujeme zásobník (kontejner).
- Počet sekundárních částic $n$ se losuje z $\lfloor \nu \rfloor$ s pravděpodobností $1 - \{\nu\}$ a $\lfloor \nu \rfloor + 1$ s pravděpodobností $\{\nu\}$.
- První částici simulujeme dál běžným způsobem; ostatní (2. až $n$-tou) uložíme do zásobníku.
- Když aktuálně sledovaná částice zanikne nebo opustí oblast, vyzvedneme další ze zásobníku.
- Výpočet pro jednu primární částici končí, až je zásobník prázdný.
Nehomogenní prostředí
Reálně částice prochází více materiály (Fe → beton → vzduch). Modelujeme po částech homogenní prostředí.
Optická vzdálenost se počítá sčítáním přes úseky:
kde $\lambda_{ij} = \|\mathbf{r}_j - \mathbf{r}_{j-1}\|$ je délka úseku v $j$-té oblasti. Celkem:
A distribuční funkce volné dráhy je multiplikativní přes rozhraní:
Modelování systémů hromadné obsluhy metodou Monte Carlo.
Teorie front. Cílem simulace je najít optimální nastavení systému, počet linek, organizaci front, prioritizaci, aby systém zvládal nápor, ale ne zbytečně přeplýtval kapacitou. Aplikace: call centra, banky, IT servery, fronty u kasy, sítě, výrobní linky.
Stavební kameny systému
- Tok požadavků: posloupnost událostí, které do systému vstupují.
- Linka (uzel): zařízení, které požadavek obsluhuje.
- Doba obsluhy $\tau_z$: jak dlouho zpracování trvá.
- Doba čekání $\tau_p$: jak dlouho je požadavek ochotný čekat.
Náhodné veličiny, jejichž rozdělení potřebujeme znát (z teorie nebo empiricky):
- Časy příchodu událostí.
- Doby obsluhy.
Popis systému
- Vstupní tok: časy příchodů, priority, doby čekání.
- Struktura: počet linek, kapacita zásobníku (fronty).
- Režim: pravidla pro zařazení do front (FIFO, LIFO, prioritní, …).
Kategorie podle doby čekání
| Typ | $\tau_p$ | Chování |
|---|---|---|
| S odmítáním | $\tau_p = 0$ | Není-li ihned volná linka, požadavek odchází neobsloužen. |
| Čekací | $\tau_p = +\infty$ | Požadavek čeká, dokud na něj nepřijde řada. |
| Smíšený | $0 < \tau_p < +\infty$ | Konečná tolerance, po vypršení odchází. |
Jeden požadavek je popsán vektorem $(t_i, a_1, \dots, a_m)$, kde $i$ je pořadové číslo, $t_i$ čas příchodu a $a_j$ další atributy (např. priorita).
Vlastnosti toku požadavků
Označme $\eta_i = t_i - t_{i-1}$ interval mezi po sobě jdoucími příchody (pro $i=1$ je $\eta_1 = t_1$). Sledujeme pravděpodobnost $P(k, t_0, t)$, že v intervalu $\langle t_0, t_0 + t \rangle$ dorazí právě $k$ požadavků.
- Homogenní tok: jediným parametrem je čas příchodu $t_i$ (žádné priority, kategorie).
- Tok s omezenou závislostí: intervaly $\eta_i$ jsou nezávislé. Sdružená hustota se rozpadne:
$g_s(z_1, \dots, z_s) = \displaystyle\prod_{k=1}^{s} f_k(z_k)$
- Stacionární tok: $P$ nezávisí na startu $t_0$, jen na délce $t$. Hustota intervalu $f$ je konstantní v čase. Intenzita toku:
$\lambda = \left(\displaystyle\int_0^\infty x\,f(x)\,dx\right)^{-1}$
- Ordinární tok: $P(\ge 2$ příchodů v $\Delta t) \to 0$ rychleji než $\Delta t$. Tedy „dva najednou“ je zanedbatelné.
Poissonův tok: klasická aproximace
Intervaly mezi příchody mají exponenciální rozdělení $f(x) = \lambda e^{-\lambda x}$. Počet příchodů má Poissonovo rozdělení.
Stacionární tok (intenzita $\lambda$ konstantní):
Nestacionární tok (intenzita $\lambda(u)$ se mění, třeba špička v bance v 11:00):
Dva přístupy k simulaci
- Jednoduchá implementace.
- Velká nevýhoda: pokud je $\Delta t$ malé, většina kroků je prázdných a marně se vyhodnocují.
- Řádově efektivnější.
- Pro Monte Carlo simulace front standard.
Metoda rozštěpení (splitting): vzácné jevy
Co když chceme změřit pravděpodobnost zahlcení systému, ale ono nastane jednou za milion běhů? Naivní MC by potřeboval astronomický počet pokusů. Pomáhá splitting:
Princip
- Sledování stavu: definujeme kontrolní okamžiky $T_1, T_2, \dots$ a kritickou hranici $N$ (např. počet požadavků v systému).
- Rozštěpení: jakmile v okamžiku $T_i$ stav dosáhne $n \ge N$, simulaci v tomto bodě rozštěpíme na $M$ identických podsystémů. Každému přiřadíme váhu $Q = 1/M$.
- Další větvení: v $T_{i+1}$ ověříme podmínku pro každý podsystém. Ty, co podmínku splní, znovu rozštěpíme, váhy se vynásobí ($1/M^2$, dále $1/M^3$, …). Větve, co nesplní, zahodíme.
- Sloučení: výsledné rozdělení stavů spočítáme jako $p_r = Q_r / Q$, kde $Q_r$ je součet vah systémů ve stavu $r$, a $Q$ celkový součet.
Co se v simulaci vyhodnocuje
- Průměrná délka fronty, max. délka fronty.
- Průměrná doba čekání a obsluhy.
- Procento zamítnutých / odchozích požadavků.
- Vytížení linek (% času, kdy byly obsazené).
- Pravděpodobnost vzácných stavů (přes splitting).
Simulujeme event-driven: každá událost je „přišel zákazník“ nebo „barista skončil“. Sledujeme délku fronty, počet odcházejících. Spustíme 10 000 nezávislých běhů, srovnáme scénáře s 2, 3, 4 baristy.
Materiál ke státnicím · Metody Monte Carlo · 5 otázek