📊 Metody Monte Carlo: státnice

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

  1. Popište metodu Monte Carlo. Vysvětlete obvyklé způsoby modelování a generování rovnoměrně rozdělených pseudonáhodných čísel.
  2. 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.
  3. 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í.
  4. Popište principy modelování transportu částic metodou Monte Carlo.
  5. Popište principy modelování systémů hromadné obsluhy metodou Monte Carlo.
Otázka 1

Metoda Monte Carlo. Modelování a generování rovnoměrně rozdělených pseudonáhodných čísel.

1. Co je vlastně metoda Monte Carlo

Monte Carlo (MC) je výpočetní metoda, která modeluje náhodné děje pomocí počítače a výsledky následně statisticky zpracovává, podobně jako fyzik vyhodnocuje měření v laboratoři. Hodí se ve dvou typech úloh:

Princip vzdáleně připomíná zjišťování poměru obvodu kruhu k jeho průměru tak, že do čtverce s vepsaným kruhem hážeme náhodné body a sledujeme, kolik procent z nich padne dovnitř. To je nejjednodušší ukázka MC: kvadratura plochy. Stejnou logikou se ovšem počítají věci nesrovnatelně složitější (vícerozměrné integrály, optimalizace stochastických procesů, finanční modely, simulace neutronového toku).

Tři pilíře, na kterých Monte Carlo stojí:
  1. Znát rozdělení pravděpodobnosti všech jevů, které do modelu vstupují. Někdy je odvodíme teoreticky (čekací doby v Poissonově toku jsou exponenciální), jindy empiricky (histogram naměřených dob obsluhy v call centru). Bez znalosti rozdělení nelze nic simulovat.
  2. Vyrobit realizace náhodných veličin. Typicky to děláme ve dvou krocích: nejprve vygenerujeme nezávislé hodnoty z rovnoměrného rozdělení $\Upsilon \sim R(0,1)$, pak je matematicky transformujeme na požadované rozdělení (např. exponenciální, normální, Poissonovo).
  3. Mnohokrát opakovat a statisticky zpracovat. Jediná simulace nic neříká, je to vlastně jeden „pokus“. Smysl má průměrování přes velký počet $N$ nezávislých opakování. Chyba odhadu typicky klesá jako $\sim 1/\sqrt{N}$, tedy pro snížení chyby na desetinu potřebujeme stokrát víc simulací.
Představ si, že chceš zjistit průměrnou výšku člověka v Praze. Buď obejdeš milion lidí a změříš každého (analytický přístup), nebo si vybereš tisíc náhodných lidí a spočítáš průměr (Monte Carlo). Druhý způsob je rychlejší, ale za cenu náhodné chyby, kterou ovládáš počtem vzorků.

2. Proč právě rovnoměrné rozdělení $R(0,1)$

$R(0,1)$ je v MC svatý grál. Veškerá další rozdělení (diskrétní, exponenciální, normální, Weibullovo, libovolně exotická) se z něj odvozují transformací. Stačí tedy mít kvalitní zdroj rovnoměrných čísel a o zbytek se postará matematika.

Vlastnosti $Y \sim R(0,1)$, které využíváme:

3. Kde rovnoměrná čísla brát

Tabulky náhodných čísel

Historicky se sestavovaly tabulky tisíců náhodných číslic (například RAND Corporation vydala v roce 1955 knihu „A Million Random Digits with 100,000 Normal Deviates“). Dnes mají význam spíš muzejní, ale ukazují, že problém zdroje náhodnosti je hodně starý.

Hardwarové (fyzikální) generátory

Vychází z fyzikálního zdroje šumu: tepelný šum rezistoru, šum lavinové diody, časy detekce kvantové fluktuace, lavinová ionizace u Geigerova čítače. Vzorkováním šumu dostáváme „pravé“ náhodné bity.

Výhoda: teoreticky perfektní náhoda, nelze ji předpovědět.
Nevýhoda: výstup nelze reprodukovat. To je pro vědecké výpočty problém. Pokud najdeme v simulaci anomálii, chceme ji umět zopakovat a debugovat. S hardwarovým generátorem to nejde, protože tatáž posloupnost se už nevrátí.

Softwarové (pseudonáhodné) generátory

Algoritmus, který z počátečního stavu (seedu) deterministicky generuje posloupnost čísel, jež se chová „jako náhodná“. Stejný seed dá vždy stejnou posloupnost, takže simulace je reprodukovatelná. Toto je dnes naprostý standard, i ten random.random() v Pythonu je softwarový generátor.

Pojem „pseudo“ neříká, že je to horší, jen že posloupnost je předem daná. Důležité je, aby žádný rozumný statistický test nedokázal posloupnost rozlišit od skutečně náhodné.

4. Co musí dobrý PRNG splňovat (formální požadavky)

Označme $\theta = \{x_i\}_{i=0}^{\infty}$ pseudonáhodnou posloupnost a $X^{(n)} = (x_1, \dots, x_n)$ libovolný výběr o $n$ prvcích. Aby $\theta$ obstála jako model výběru z $Y \sim R(0,1)$, musí pro každý výběr platit:

  1. Konvergence střední hodnoty:
    $\displaystyle \lim_{n\to\infty}\frac{1}{n}\sum_{i=1}^{n} x_i = \frac{1}{2}$
    Logika: $EY = \tfrac{1}{2}$, aritmetický průměr musí dlouhodobě konvergovat k téhle hodnotě. Pokud by průměr šel třeba k 0,55, generátor systematicky preferuje vyšší čísla.
  2. Konvergence rozptylu:
    $\displaystyle \lim_{n\to\infty}\frac{1}{n}\sum_{i=1}^{n}(x_i - \bar{x})^2 = \frac{1}{12}$
    Pokud by rozptyl byl menší, čísla by se kupila kolem 0,5; pokud by byl větší, hustila by se u krajů.
  3. Rovnoměrnost ve smyslu objemu: Pro libovolnou měřitelnou podmnožinu $I_v \subset (0,1)$ s objemem $V(I_v) = v$ musí počet bodů, které do ní padnou, splňovat
    $\displaystyle \lim_{n\to\infty}\frac{N_v(X^{(n)})}{n} = v$
    Lidsky: do 10% výseku interválu musí padnout 10 % bodů. To je test, který frekvenční histogramy.
  4. $k$-rovnoměrnost: Vezmeme $k$-tice po sobě jdoucích čísel a interpretujeme je jako body v $k$-rozměrné jednotkové krychli $C_k = \langle 0,1 \rangle^k$. Pro libovolnou měřitelnou podmnožinu $G \subset C_k$ musí
    $\displaystyle \lim_{n\to\infty}\frac{N_G}{n} = V(G)$
    Tohle je kritický bod, který odhalí slabší generátory. Posloupnost může vypadat v 1D rovnoměrně, ale jakmile $k$-tice tvoří v $k$-D viditelné mřížky či shluky, generátor padá. Klasický průšvih RANDU (viz níže) se odhalil právě tímto.
  5. Nulová autokorelace se zpožděním $t$: Pro libovolné $t > 0$ musí platit
    $\displaystyle \lim_{n\to\infty}\frac{1}{n}\sum_{i=1}^{n}\left(x_{i-t} - \tfrac{1}{2}\right)\left(x_i - \tfrac{1}{2}\right) = 0$
    Lidsky: hodnota $x_i$ nesmí být statisticky predikovatelná z $x_{i-t}$. U deterministických PRNG je $x_i$ samozřejmě plně určeno celou historií, ale statisticky to nesmí být vidět.
Co počítač s rovnoměrností provádí. Reálná čísla v plovoucí desetinné čárce nejsou v intervalu $(0,1)$ rozložena rovnoměrně, protože blízko nuly mají větší hustotu (víc reprezentovatelných hodnot). Navíc je výpočet s floaty pomalejší než s inty. Proto se generátory implementují v celočíselné aritmetice s posloupností $(y_1, \dots, y_n)$ kde $y_i \in \{0, \dots, M-1\}$, a teprve výstup se převede na $(0,1)$ jako $x_i = y_i / M$.

5. Lineární kongruenční generátor (LCG)

Vůbec nejjednodušší a historicky první rozšířený PRNG. Pochází z přelomu 40. a 50. let (Derrick Lehmer). Stačí mu jedno násobení, jedno sčítání a jedno modulo:

$x_{n+1} = (K \cdot x_n + B) \bmod M$

Význam parametrů:

Perioda je délka cyklu, po kterém se posloupnost začne opakovat. U LCG je nejvýš $M$. Existují Hull–Dobellovy podmínky, které zaručují, že perioda dosahuje maxima (vztahy mezi $K$, $B$, $M$ a jejich společnými děliteli).

RANDU. IBM generátor z 60. let, $M = 2^{31}$, $K = 65539 = 2^{16} + 3$, $B = 0$. V 1D vypadal rovnoměrně, ve 2D taky. Ale když se v 3D vykreslily body $(x_i, x_{i+1}, x_{i+2})$, ležely pouze na 15 nadrovinách. Místo aby vyplnily celou krychli, vytvořily 15 plátů. Po desetiletí v něm zpracovávaly fyzikální simulace, jejichž výsledky byly tím pádem zkreslené.

Lekce: každý LCG má tendenci shlukovat $k$-tice na $(k{-}1)$-rozměrných nadrovinách (tzv. Marsagliův teorém). Otázka je, kolik těch nadrovin je: u dobrého LCG miliony, u špatného RANDU jen 15.
Wichmann–Hillův generátor. Vylepšení principu LCG kombinací tří (resp. čtyř ve výkonnější variantě) nezávislých LCG. Jejich výstupy se sečtou modulo 1, čímž se vyrovnají individuální slabosti. Lépe prochází statistickými testy než samotný LCG, ale moderní pohled stále hodnotí jako nedostatečné pro náročné simulace.

6. Mersenne Twister (MT19937)

Dnes nejpoužívanější PRNG. Najdeš ho jako výchozí v Pythonu (random), Ru, MATLABu, PHP. Navrhli ho Matsumoto a Nishimura v roce 1997. Stojí na principu lineárního posuvného registru se zpětnou vazbou, do něhož je vložen geniální trik s maskováním bitů.

Parametry varianty MT19937 (číslo 19937 souvisí s periodou, viz dále):

Rekurentní vzorec, který generuje nové slovo:

$x_{k+n} = x_{k+m} \,\oplus\, \bigl(\,x_k^{\{u(w-r)\}} \;|\; x_{k+1}^{\{l(r)\}}\bigr)\,A$
Algoritmus „uvaří“ nové slovo takto: vezme horní bity ze slova $x_k$ a dolní bity z $x_{k+1}$, slepí je do jednoho slova, projede ho rychlou bitovou transformací (matice $A$, technicky shift a XOR) a výsledek sečte XORem se slovem $x_{k+m}$, které leží v paměti o 397 pozic dál. Tohle „mixování“ tří různých zdrojů ze stavu vytváří chaotické chování a obrovskou periodu.

Proč je MT tak dobrý:

Mersenne Twister není kryptograficky bezpečný. Pokud útočník odpozoruje 624 po sobě jdoucích výstupů, dokáže matematicky obnovit vnitřní stav registru a od té chvíle předpovídá všechny budoucí výstupy přesně. Proto se v kryptografii používají speciální CSPRNG (kryptograficky bezpečné generátory) jako ChaCha20, AES-CTR DRBG nebo systémové /dev/urandom. Pro vědecké simulace ale MT plně stačí.

7. Transformace na obecný rovnoměrný interval $R(a,b)$

Často potřebujeme náhodu z jiného intervalu než $(0,1)$. Vzorec je triviální:

$\Upsilon_{ab} = (b - a)\cdot \Upsilon + a, \qquad \Upsilon \sim R(0,1)$

Roztáhneme interval $(0,1)$ na šířku $b - a$ a posuneme začátek na $a$.

Doba hovoru mezi 2 a 10 minutami. $\Upsilon = 0{,}3$. Výpočet: $(10 - 2) \cdot 0{,}3 + 2 = 8 \cdot 0{,}3 + 2 = 4{,}4$ minuty.

Náhodný úhel z $(0, 2\pi)$. Použijeme stejný vzorec s $a = 0$, $b = 2\pi$, tedy $\varphi = 2\pi \cdot \Upsilon$. To budeme potřebovat hned, např. v Box–Mullerově transformaci pro $N(0,1)$ nebo při generování azimutálního úhlu při transportu částic.

8. Předjímka inverzní metody

Pro úplnost obecný princip, který využijeme v Otázce 3. Pokud máme hustotu $f(x)$ a distribuční funkci $F(x) = \int_{-\infty}^{x} f(t)\,dt$, a chceme generovat realizaci náhodné veličiny s rozdělením $F$, položíme $F(\xi) = \Upsilon$ a vyřešíme $\xi = F^{-1}(\Upsilon)$.

Exponenciální rozdělení s hustotou $f(t) = \lambda e^{-\lambda t}$. Distribuční funkce $F(t) = 1 - e^{-\lambda t}$. Rovnice $1 - e^{-\lambda \xi} = \Upsilon$ dává $\xi = -\tfrac{1}{\lambda}\ln(1 - \Upsilon)$. Protože $1 - \Upsilon$ má stejné rozdělení jako $\Upsilon$, zjednoduší se to na
$\xi = -\dfrac{1}{\lambda}\ln \Upsilon$
Tímto vzorcem se generují čekací doby v teorii front i volné dráhy částic v transportu (vše v Otázkách 4 a 5).

9. Golombovy požadavky na binární posloupnosti

Když se generátor implementuje jako binární posloupnost (bit po bitu), používáme se zpřísňující kritéria od Solomona Golomba. Jsou to nutné, ale ne dostačující podmínky kvality:

  1. Vyváženost. V jedné periodě se počet jedniček a nul liší nejvýš o jedna. Polovina bitů musí být 1, polovina 0.
  2. Distribuce běhů (runs). Běh je nepřerušená řada stejných bitů. V náhodné posloupnosti by polovina běhů měla mít délku 1, čtvrtina délku 2, osmina délku 3 atd. Geometrické rozdělení.
  3. Ideální autokorelační funkce. Když posloupnost porovnáme samu se sebou posunutou o $t$, počet shod se má lišit od počtu neshod o konstantu nezávislou na $t$ (kromě případu $t = 0$, kde se vše shoduje).
Kostra Otázky 1: (a) Co MC dělá a jaké jsou tři pilíře (rozdělení, vzorky, statistika). (b) Proč $R(0,1)$ a kde ho brát: tabulky, hardware, software. (c) Pět požadavků na PRNG: střední hodnota, rozptyl, rovnoměrnost, $k$-rovnoměrnost, nulová autokorelace. (d) LCG s vzorcem, RANDU jako odstrašující případ. (e) Mersenne Twister s vzorcem a parametry, perioda $2^{19937}{-}1$, ne pro kryptografii. (f) Transformace na $R(a,b)$ a předjímka inverzní metody pro obecná rozdělení.
Otázka 2

Testování kvality generátorů, vlastnosti generátorů a jejich porovnání.

Co testy vlastně dělají a co neumějí

Pokud generátor selže byť v jediném testu, statisticky se nechová jako výběr z $R(0,1)$ a nesmíme ho použít. Pokud projde všemi testy, nelze tvrdit, že je správný. Statistické testy jsou nutné, ne dostačující podmínky kvality. Nový test může odhalit nedostatek, který předchozí přehlédly. Klasický příklad: RANDU prošel jednorozměrnými testy bez problému a teprve trojrozměrný test odhalil katastrofu (15 nadrovin).

Testy provádíme jako statistické testy hypotéz. Pracovní hypotéza $H_0$ zní: „posloupnost se chová jako výběr z $R(0,1)$“. Spočítáme testovou statistiku a porovnáme ji s kritickou hodnotou, která odpovídá zvolené hladině významnosti, typicky $\alpha = 0{,}05$ (95% spolehlivost). Pokud statistika kritickou hodnotu překročí, hypotézu zamítáme: generátor je podezřelý.

Statistický test je jako detektor podvodu na zkoušce. Pokud zachytí jasnou shodu se vzorovým řešením, je jasné že to je opisované. Pokud nezachytí nic, neznamená to, že se neopisuje, jen že tento konkrétní detektor opisování nepoznal.

1. Frekvenční test (test dvojic 0/1)

Nejjednodušší test. Ověřuje, že v binárním zápisu posloupnosti se 0 a 1 vyskytují přibližně stejně často. U skutečně rovnoměrného generátoru je pravděpodobnost 0 i 1 na libovolném bitu rovna $1/2$, takže v posloupnosti délky $n$ bitů by se mělo objevit zhruba $n/2$ jedniček.

Označme $n_0$, $n_1$ počty nul a jedniček ($n = n_0 + n_1$). Testovou statistiku definujeme jako:

$X_1 = \dfrac{(n_0 - n_1)^2}{n}$
1000 bitů, z toho 550 jedniček a 450 nul. $X_1 = \dfrac{(450 - 550)^2}{1000} = \dfrac{10000}{1000} = 10$. Protože $10 > 3{,}84$, hypotézu zamítáme: rozdíl mezi počtem nul a jedniček je statisticky příliš velký na to, aby byl jen náhodný.
Představ si hod mincí 1000krát. Není divné, když padne 510 orlů a 490 panen. Je extrémně divné, když padne 700 orlů a 300 panen. Statistika $X_1$ měří, jak moc se výsledek odchyluje od ideálu, a hodnota 3,84 je hraniční „už je to podezřele moc“.

Pohled přes binomické rozdělení

Pokud máme $m$ slov délky $n$ bitů, je celkový počet jedniček náhodná veličina s binomickým rozdělením s parametry $mn$ a $p = 1/2$. Pro velká $m$ se binomické rozdělení aproximuje normálním a počet jedniček s pravděpodobností 0,95 leží v intervalu:

$\left(\dfrac{nm}{2} - \sqrt{nm},\ \dfrac{nm}{2} + \sqrt{nm}\right)$

Tento intervalový pohled je ekvivalentní statistice $X_1$, jen vyjádřený jinou formou.

2. Test sérií (rovnoměrnost dvojic)

Frekvenční test snadno propustí patologie jako 0101010101...: tato posloupnost má sice 50 % jedniček, ale je striktně periodická. Test sérií jde o úroveň výš a kontroluje, jestli i dvojice po sobě jdoucích bitů (00, 01, 10, 11) jsou rovnoměrně rozloženy.

Označme $n_0$, $n_1$ jako dříve a $n_{00}, n_{01}, n_{10}, n_{11}$ počty výskytů jednotlivých dvojic. Statistika:

$X_2 = \dfrac{4}{n - 1}\bigl(n_{00}^2 + n_{01}^2 + n_{10}^2 + n_{11}^2\bigr) - \dfrac{2}{n}\bigl(n_0^2 + n_1^2\bigr) + 1$
U posloupnosti 010101... by ve statistice $X_2$ dominoval výskyt dvojic 01 a 10, zatímco 00 a 11 by chyběly. To rychle dostane $X_2$ nad 5,99 a posloupnost je odhalena.

Druhá varianta (intervalová)

Místo bitů můžeme test sérií provádět nad reálnými čísly: rozdělíme $(0,1)$ na $r$ stejně velkých nepřekrývajících se podintervalů $I_1, \dots, I_r$ a sledujeme, kolikrát padly vygenerované hodnoty do každého z nich. Pokud bychom navíc sledovali dvojice po sobě jdoucích čísel, dostaneme se k testování dvourozměrné rovnoměrnosti (které je úvod ke $k$-rovnoměrnosti).

3. Pokerový test

Generalizace testu sérií: místo dvojic sleduje $m$-tice po sobě jdoucích bitů. Jméno pochází z analogie s kartami v pokeru, kde také sledujeme kombinace „karet v ruce“ určité délky.

Postup:

  1. Posloupnost $X$ převedeme do binárního tvaru a získáme řetězec $s$ o délce $N$ bitů.
  2. Zvolíme délku úseku $m$ a rozdělíme $s$ na $k = \lfloor N/m \rfloor$ nepřekrývajících se úseků.
  3. Existuje $2^m$ možných kombinací úseků délky $m$. Označme $n_i$ počet skutečných výskytů $i$-tého typu úseku.
  4. Pro statistickou průkaznost musí platit $k \ge 5 \cdot 2^m$, aby na každý možný úsek připadalo v průměru aspoň 5 výskytů.
$X_3 = \dfrac{2^m}{k}\sum_{i=1}^{2^m} n_i^2 \;-\; k$

Rozdělení: $\chi^2$ s $2^m - 1$ stupni volnosti. Jeden stupeň „ujídá“ vazba na celkový počet úseků $k$.

Pokerový test pro $m = 3$. Sledujeme trojice bitů: 000, 001, 010, 011, 100, 101, 110, 111, tedy $2^3 = 8$ typů. Stupně volnosti $8 - 1 = 7$, kritická hodnota $\chi^2_7$ při $\alpha = 0{,}05$ je $14{,}07$. Pokud má posloupnost délku $N = 600$ bitů, máme $k = 200$ úseků, na každý typ připadá v průměru 25 výskytů (jistě splňuje $25 \ge 5$). Když nasimulujeme generátor a vyjde $X_3 = 9{,}2$, vše v pořádku. Když $X_3 = 22$, je generátor podezřelý: některé trojice jsou výrazně častější než jiné.

4. Test běhů (Runs test)

Sleduje strukturu nepřerušených sekvencí stejných bitů, tzv. běhů. Test ověřuje, zda jejich distribuce odpovídá Golombovým požadavkům (které jsme zavedli v Otázce 1).

Pojmy:

Teoretický očekávaný počet běhů délky $i$ v posloupnosti délky $n$ bitů:

$e_i = \dfrac{n - i - 3}{2^{i+2}}$

Pro statistickou průkaznost nás zajímají jen běhy, jejichž očekávaný počet je $\ge 5$. Najdeme tedy největší $k$ tak, aby $e_k \ge 5$. Delší běhy do testu nezahrnujeme.

Testová statistika:

$X_4 = \displaystyle\sum_{i=1}^{k}\dfrac{(B_i - e_i)^2}{e_i} + \sum_{i=1}^{k}\dfrac{(M_i - e_i)^2}{e_i}$

Rozdělení: $\chi^2$ s $2k - 2$ stupni volnosti.

Když házíš mincí a padne 10 orlů za sebou, je to běh délky 10. V náhodné posloupnosti by mělo platit, že polovina běhů má délku 1, čtvrtina délku 2, osmina délku 3 atd. Pokud generátor produkuje výrazně více dlouhých běhů (např. má tendenci „uvíznout“ v jedné hodnotě), test ho odhalí.

5. Autokorelační test

Hledá skryté závislosti mezi bity, které jsou od sebe vzdálené o $d$ pozic. U opravdové náhody musí být znalost bitu $s_i$ úplně nesouvisející s bitem $s_{i+d}$ pro každé $d > 0$.

Postup:

  1. Zvolíme zpoždění $d$ tak, aby $1 \le d \le \lfloor n/2 \rfloor$. $d$ nesmí být rovno periodě generátoru (to by trivializovalo test).
  2. Spočítáme počet párů, kde se bity liší:
    $A(d) = \displaystyle\sum_{i=1}^{n - d - 1} s_i \oplus s_{i+d}$
    $\oplus$ je XOR, který vrátí 1 právě tehdy, jsou-li bity různé.
  3. U skutečně náhodné posloupnosti se polovina dvojic shoduje a polovina liší, takže očekávaná hodnota $A(d)$ je $(n-d)/2$. Odchylku měří statistika:
    $X_5 = 2\,\dfrac{A(d) - \frac{n - d}{2}}{\sqrt{n - d}}$

Rozdělení: $X_5 \sim N(0, 1)$ pro $n - d > 10$. Generátor projde, pokud $|X_5| \le 1{,}96$ (kritická hodnota pro 95% oboustranný interval normálního rozdělení).

6. Maurerův univerzální statistický test

Nejsilnější ze standardních testů. Místo aby hledal konkrétní vzor (rovnoměrnost nul/jedniček, dlouhé běhy), zkoumá celkovou entropii posloupnosti přes informační teorii.

Základní myšlenka:

Proč je univerzální a silný:

Vlastnosti generátorů a jejich porovnání

Lineární kongruenční generátor (LCG)

Mersenne Twister (MT19937)

Tabulka srovnání

VlastnostLCGMersenne Twister
Složitost implementaceTriviální (násobení + modulo)Středně složitá (posuvný registr, matice $A$)
Paměťová náročnostJedno celé číslo624 slov ve stavu
PeriodaKrátká, $\le M$ (typicky $\le 2^{31}$)$2^{19937} - 1$ (prakticky nekonečno)
$k$-rovnoměrnostSelhává, body na nadrovináchAž 623 rozměrů
KorelaceVyšší, často odhalená testyVelmi nízká
RychlostVelmi vysokáVelmi vysoká
Kryptografická bezpečnostNeNe (predikce po 624 výstupech)
Průchod statistickými testyČasto padá v komplexnějších testechProchází téměř vším
Současný statusPro náročné simulace nevhodnýStandard pro vědecké výpočty
Kostra Otázky 2: (a) Statistický test hypotéz, $H_0$ a hladina $\alpha = 0{,}05$, testy jsou nutné ale nedostatečné. (b) Pět testů: frekvenční ($X_1$, kritická 3,84), sérií ($X_2$, kritická 5,99), pokerový ($X_3$), běhů ($X_4$), autokorelační ($X_5 \sim N(0,1)$, kritická $\pm 1{,}96$). (c) Maurerův univerzální test přes informační teorii. (d) Tabulka LCG vs. MT: perioda, $k$-rovnoměrnost, kryptografie.
Otázka 3

Generování obecně rozdělených náhodných čísel. Příklady dvou rozdělení.

Princip: $R(0,1)$ jako univerzální stavební kámen

Mám-li kvalitní generátor čísel z $R(0,1)$, dokážu z něj sestrojit realizace prakticky libovolného rozdělení. To je krásná vlastnost a důvod, proč MC vystačí s jedním základním PRNG.

Rozdělíme úvahu na dvě části, protože diskrétní a spojité veličiny vyžadují jiné techniky:

A) Diskrétní náhodné veličiny

Chceme vyrobit realizaci náhodné veličiny $\xi$ popsané rozdělením pravděpodobnosti:

$P(\xi = x_k) = p_k, \qquad k \in I$

kde $x_k$ jsou možné hodnoty a $I$ je množina indexů (často $I = \{0, 1, \dots, n\}$ nebo $I = \mathbb{N}$).

Základní algoritmus

Geometrická idea: úsečku $(0,1)$ rozdělíme na podintervaly o délkách $p_0, p_1, p_2, \dots$ Vygenerujeme $\Upsilon \sim R(0,1)$ a zjistíme, do kterého podintervalu padl. Implementace nevyžaduje předpočítané hranice, ale postupně odečítá $p_k$ od pomocné proměnné $S$:

Algoritmus

  1. Generuj $\Upsilon \sim R(0,1)$. Polož $S \leftarrow \Upsilon$, $k \leftarrow 0$.
  2. $S \leftarrow S - p_k$.
  3. Je-li $S > 0$, zvětši $k$ o 1 a vrať se na krok 2.
  4. Výsledek je $\xi = x_k$.
Představ si „rozřezaný metr“ délky 1. Pravděpodobnosti $p_k$ jsou délky jednotlivých kousků. Náhodné číslo $\Upsilon$ je drobek, který někam na metr dopadl. Algoritmus postupně odřezává kousky zleva a kontroluje, jestli už drobek překryl. Když $S$ klesne pod nulu, drobek právě prošel skrz aktuální kousek a tam se zastavujeme.

Složitost algoritmu

Spočítejme střední dobu výpočtu $\tau$. První krok proběhne vždy a stojí $\tau_R$ (čas na vygenerování $\Upsilon$). Kroky 2 a 3 se opakují podle toho, jak daleko je hledaný index $k$. Pravděpodobnost, že výpočet skončí přesně po $k+1$ iteracích, je $p_k$.

Označme $\tau_p$ čas na získání hodnoty $p_k$ a $\tau_+$ čas jedné odečítací operace. Pak:

$\tau = \tau_R + (\tau_p + \tau_+)\displaystyle\sum_{k \in I}(k+1)p_k = \tau_R + (\tau_p + \tau_+)\Bigl(1 + \sum_{k \in I} k\,p_k\Bigr)$

Protože $\sum_{k} k\,p_k = E\xi$ (definice střední hodnoty diskrétní veličiny), můžeme psát:

$\tau = \tau_R + (\tau_p + \tau_+)\,(1 + E\xi)$

Závěr je důležitý: střední doba výpočtu roste lineárně se střední hodnotou indexu $E\xi$. Pokud máme rozdělení s velkou $E\xi$ (např. Poissonovo s $\lambda = 1000$), algoritmus v průměru projde tisícem iterací než najde výsledek. To je důvod pro optimalizace, které následují.

Modifikovaný algoritmus 1: setřídění sestupně

Pokud místo přirozeného pořadí indexů použijeme pořadí, kde největší pravděpodobnosti jsou na začátku, sníží se $E\xi$ a tím i průměrný počet iterací. Stačí jednou setřídit posloupnost $p_k$ sestupně:

$p_{k_0} \ge p_{k_1} \ge p_{k_2} \ge \dots$

Algoritmus je pak identický, jen pracuje s přeindexovanou posloupností.

Barman, který ví, že 80 % lidí chce pivo, se nezeptá nejdřív na rum a kolu. Začne otázkou „chceš pivo?“ a v 80 % případů končí hned. Tomu odpovídá setřídění sestupně podle pravděpodobnosti.
Konkrétní porovnání. Rozdělení: Pivo $p_0 = 0{,}1$, Voda $p_1 = 0{,}2$, Rum $p_2 = 0{,}7$.
  • Bez setřídění: $E\xi = 0 \cdot 0{,}1 + 1 \cdot 0{,}2 + 2 \cdot 0{,}7 = 1{,}6$, průměrný počet otázek $1 + 1{,}6 = 2{,}6$.
  • 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ěrný počet otázek $1 + 0{,}4 = 1{,}4$.
Setříděný algoritmus je v tomto případě skoro dvakrát rychlejší. U miliónů iterací MC simulace to znamená podstatnou úsporu výpočetního času.

Modifikovaný algoritmus 2: start od vrcholu (pro „kopcovitá“ rozdělení)

U některých rozdělení (typicky Poissonovo s velkým $\lambda$) jsou pravděpodobnosti $p_k$ nejprve malé, kolem vrcholu $h$ velké a pak zase klesají. Setřídění by zničilo přirozený index. Místo toho startujeme rovnou u vrcholu $h$ a podle $\Upsilon$ se rozhodneme, zda jdeme doleva nebo doprava.

Předpočítáme součet pravděpodobností od počátku po vrchol:

$Q = \displaystyle\sum_{k=0}^{h} p_k$

Algoritmus

  1. Generuj $\Upsilon \sim R(0,1)$. Polož $p \leftarrow p_h$, $m \leftarrow h$, $S \leftarrow \Upsilon - Q$.
  2. Když $S > 0$, hledáme napravo: $m \leftarrow m + 1$, $p \leftarrow p_m$, $S \leftarrow S - p$. Opakuj dokud $S > 0$.
  3. Když $S \le 0$, hledáme nalevo: $m \leftarrow m - 1$, $p \leftarrow p_m$, $S \leftarrow S + p$. Opakuj dokud nedojdeme do správného intervalu.
  4. Výsledek je $\xi = x_m$.
Vrtulník tě vysadí přímo na vrchol kopce. Podle vstupenky $\Upsilon$ poznáš, jestli máš jít kousek nahoru, nebo dolů. Pro Poissonovo rozdělení s $\lambda = 1000$ ušetříš ~1000 iterací oproti naivnímu algoritmu od indexu 0.

Tři konkrétní diskrétní rozdělení

1. Bernoulliho rozdělení s parametrem $p$

Pokus, který skončí buď úspěchem (hodnota 1) s pravděpodobností $p$, nebo neúspěchem (0) s pravděpodobností $1 - p$. Nejjednodušší možný diskrétní model: pojistka, hod mincí s nestejnoměrnou váhou, klinický test.

  1. Generuj $\Upsilon \sim R(0,1)$.
  2. Je-li $\Upsilon < p$, výsledek je 1.
  3. V opačném případě (tedy $\Upsilon \ge p$) je výsledek 0.
Šance výhry v automatu je 30 %, tedy $p = 0{,}3$. Generátor vyhodí $\Upsilon = 0{,}24$. Protože $0{,}24 < 0{,}3$, výsledek je 1 (výhra). Při $\Upsilon = 0{,}81$ by byl výsledek 0.

2. Rovnoměrné rozdělení na $\{1, 2, \dots, n\}$

Spravedlivá kostka, losování. Každá hodnota má stejnou pravděpodobnost $1/n$.

  1. Generuj $\Upsilon \sim R(0,1)$.
  2. $s = \lfloor \Upsilon \cdot n \rfloor + 1$: kde $\lfloor \cdot \rfloor$ je dolní celá část.
Kostka $n = 6$. Padne $\Upsilon = 0{,}75$. Pak $\Upsilon \cdot n = 4{,}5$, dolní celá část je 4, plus 1 = 5. Padla pětka.

3. Poissonovo rozdělení s parametrem $\lambda$

Modeluje počet událostí v jednotce času (počet zákazníků za hodinu, počet alfa-rozpadů za sekundu). Má hustotu $P(\xi = k) = \dfrac{\lambda^k}{k!}e^{-\lambda}$. Naivně bychom mohli použít základní algoritmus, ale existuje elegantní trik založený na vztahu mezi Poissonovým a exponenciálním rozdělením: čekací doby mezi událostmi jsou exponenciální. Místo sčítání času se ekvivalentně násobí náhodná čísla.

  1. Nastav $n \leftarrow -1$, $S \leftarrow 1$, $q \leftarrow e^{-\lambda}$.
  2. Generuj $\Upsilon \sim R(0,1)$.
  3. $n \leftarrow n + 1$, $S \leftarrow S \cdot \Upsilon$.
  4. Je-li $S > q$, vrať se na krok 2. Jinak výsledek je $\xi = n$.

Proč to funguje: čekací doby mezi Poissonovými událostmi mají exponenciální rozdělení s parametrem $\lambda$, generujeme je inverzní transformací jako $\eta_i = -\tfrac{1}{\lambda}\ln \Upsilon_i$. Suma $\sum \eta_i$ překročí jednotku $t = 1$ právě tehdy, když součin $\prod \Upsilon_i$ klesne pod $e^{-\lambda}$. Z toho plyne podmínka „násob, dokud $S > q$“.

Kavárna a Poisson, $\lambda = 2$. V průměru přijdou 2 zákazníci za hodinu. Limit $q = e^{-2} \approx 0{,}1353$.
  • Kolo 1: $\Upsilon_1 = 0{,}60$, $n = 0$, $S = 1 \cdot 0{,}60 = 0{,}60$. Test: $0{,}60 > 0{,}1353$? ANO, pokračujeme.
  • Kolo 2: $\Upsilon_2 = 0{,}45$, $n = 1$, $S = 0{,}60 \cdot 0{,}45 = 0{,}27$. Test: $0{,}27 > 0{,}1353$? ANO, pokračujeme.
  • Kolo 3: $\Upsilon_3 = 0{,}30$, $n = 2$, $S = 0{,}27 \cdot 0{,}30 = 0{,}081$. Test: $0{,}081 > 0{,}1353$? NE, končíme.
Výsledek: $\xi = 2$ zákazníci v této simulované hodině. Třetí pseudo-zákazník už by přišel až po vypršení hodiny.

B) Spojité náhodné veličiny

1. Inverzní transformace (základní metoda)

Předpokládejme, že chceme generovat realizaci spojité náhodné veličiny s distribuční funkcí $F(x)$. Klíčový fakt: pokud $\Upsilon \sim R(0,1)$, pak $F^{-1}(\Upsilon)$ má rozdělení popsané $F$. To je matematická hodnota inverzní metody.

Postup:

  1. Generuj $\Upsilon \sim R(0,1)$.
  2. Najdi řešení $\xi$ rovnice $F(\xi) = \Upsilon$, tedy $\xi = F^{-1}(\Upsilon)$.
  3. $\xi$ je realizace náhodné veličiny s distribuční funkcí $F$.
Distribuční funkce $F$ stoupá monotónně od 0 do 1, jako kopec. Vystřelíme vodorovně z osy $y$ na úrovni $\Upsilon$. Tam, kde paprsek narazí na křivku, projektujeme dolů na osu $x$. Dostaneme $\xi$. Místa, kde $F$ stoupá strmě (vysoká hustota), se trefíme často. Místa s pologatým stoupáním (nízká hustota) zřídka.

Inverzní metoda funguje vždy, když umíme $F^{-1}$ vypočítat. Pro některá rozdělení existuje hezký uzavřený tvar, pro jiná nikoli.

Exponenciální rozdělení. Modeluje čekací doby v Poissonových procesech. Hustota $f(t) = \lambda e^{-\lambda t}$ pro $t \ge 0$, distribuční funkce $F(t) = 1 - e^{-\lambda t}$.

Řešíme $F(\xi) = \Upsilon$: $1 - e^{-\lambda \xi} = \Upsilon \;\Rightarrow\; e^{-\lambda \xi} = 1 - \Upsilon \;\Rightarrow\; \xi = -\dfrac{1}{\lambda}\ln(1 - \Upsilon)$.

Vzhledem k tomu, že $1 - \Upsilon$ má stejné rozdělení jako $\Upsilon$ (oba jsou $R(0,1)$), zjednodušíme:
$\xi = -\dfrac{1}{\lambda}\ln \Upsilon$
Tento vzorec je v MC asi nejpoužívanější. Generuje volné dráhy částic (Otázka 4), čekací doby v teorii front (Otázka 5), čas mezi rozpady jádra atd.

2. Zamítací metoda (Rejection method)

Pro mnoho rozdělení je $F$ buď neuzavíratelná v elementárních funkcích (např. normální rozdělení), nebo příliš komplikovaná pro snadné invertování. V takovém případě používáme zamítací metodu, která pracuje přímo s hustotou $f$.

Předpoklady:

Algoritmus

  1. Generuj $\Upsilon_1 \sim R(a, b)$, tedy náhodnou $x$-souřadnici v podstavovém obdélníku.
  2. Generuj $\Upsilon_2 \sim R(0, C)$, tedy náhodnou $y$-souřadnici.
  3. Pokud $\Upsilon_2 > f(\Upsilon_1)$, bod $(\Upsilon_1, \Upsilon_2)$ leží nad křivkou hustoty. Zamítni a vrať se na krok 1.
  4. Pokud $\Upsilon_2 \le f(\Upsilon_1)$, bod leží pod křivkou. Akceptuj: $\xi = \Upsilon_1$.
Stříleli bys náhodně do obdélníka, jehož spodní strana je osa $x$ a výška $C$. Pod hustotou $f(x)$ je „mrak“ akceptovaných oblastí. Trefíš-li pod křivku, $x$-souřadnice tvého výstřelu je platnou realizací. Trefíš-li nad, zahodíš a střílíš znovu. Účinnost závisí na tom, jak těsně obdélník obaluje křivku: čím větší prázdné místo nad křivkou, tím víc výstřelů musíš provést.

Efektivita zamítací metody se měří jako poměr plochy pod křivkou k ploše obdélníka, tedy $\dfrac{1}{C(b-a)}$ (protože pod hustotou je vždy plocha 1). Pokud máme špatně zvolený $C$, generujeme zbytečně mnoho odmítnutých vzorků.

3. Normální rozdělení $N(0,1)$

Normální (Gaussovo) rozdělení je nejdůležitější rozdělení v MC i ve statistice obecně. Distribuční funkce není v uzavřeném tvaru (vyjadřuje se přes nestandardní funkci $\Phi$), takže inverzní metoda v přímé formě selhává. Existují ale dva oblíbené postupy.

A) Aproximace přes Centrální limitní větu.

CLV říká, že součet velkého počtu nezávislých identicky rozdělených veličin konverguje k normálnímu rozdělení. Pro $\Upsilon_i \sim R(0,1)$ máme $E\Upsilon = \tfrac{1}{2}$ a $D\Upsilon = \tfrac{1}{12}$. Součet $n$ takových veličin má $E = n/2$ a $D = n/12$. Po normalizaci:

$\eta_{(n)} = \sqrt{\dfrac{12}{n}}\sum_{i=1}^{n}\left(\Upsilon_i - \dfrac{1}{2}\right)$

V praxi se volí $n = 12$, protože pak $\sqrt{12/n} = 1$ a vzorec dramaticky se zjednoduší. Stačí sečíst 12 čísel z $R(0,1)$ a odečíst 6:

$\eta = \displaystyle\sum_{i=1}^{12}\Upsilon_i - 6$

Výsledek je dobrá aproximace $N(0,1)$. Není přesná, protože CLV je limitní věta, ale pro běžné použití dostačuje. Omezení: ocasy aproximace jsou „uťaté“ na $\pm 6$, takže extrémní hodnoty (z hlediska $N(0,1)$ velmi vzácné) nejsou modelovány.

B) Box–Mullerova transformace (přesná).

Klasický trik, který ze dvou rovnoměrných čísel vyrobí dvě nezávislé realizace $N(0,1)$ pomocí goniometrických funkcí.

  1. Generuj $\Upsilon_1, \Upsilon_2 \sim R(0,1)$.
  2. Vypočti:
    $\xi_1 = \sqrt{-2\ln \Upsilon_1}\cdot \sin(2\pi \Upsilon_2)$
    $\xi_2 = \sqrt{-2\ln \Upsilon_1}\cdot \cos(2\pi \Upsilon_2)$

$\xi_1$ a $\xi_2$ jsou dvě nezávislé realizace standardního normálního rozdělení.

Geometrická intuice: $\sqrt{-2\ln \Upsilon_1}$ generuje poloměr s Rayleighovým rozdělením (což je velikost dvourozměrného normálního vektoru), $2\pi \Upsilon_2$ je rovnoměrný úhel z $(0, 2\pi)$. Projekce do kartézských souřadnic dává dvě nezávislé normální složky.

Přechod na $N(\mu, \sigma^2)$

Máme-li $\xi \sim N(0,1)$, můžeme snadno škálovat na libovolné normální rozdělení transformací $\eta = \mu + \sigma \xi$. To má rozdělení $N(\mu, \sigma^2)$.

Kostra Otázky 3: (a) Diskrétní algoritmy: základní (rozkrájené $(0,1)$ na škatulky), modifikace 1 (setřídění), modifikace 2 (start od vrcholu). Složitost $\tau = \tau_R + (\tau_p + \tau_+)(1 + E\xi)$. (b) Tři diskrétní příklady: Bernoulli (porovnání s $p$), rovnoměrné na $\{1,..,n\}$ (celá část), Poisson (násobení $\Upsilon$ a porovnání s $e^{-\lambda}$). (c) Spojité: inverzní transformace $\xi = F^{-1}(\Upsilon)$, zamítací metoda (střelba do obdélníka), pro normální Box–Muller nebo CLV se 12 vzorky. Klíčový vzorec: exponenciální $\xi = -\tfrac{1}{\lambda}\ln \Upsilon$.
Otázka 4

Modelování transportu částic metodou Monte Carlo.

Kontext: kde se simulace transportu používá

Monte Carlo simulace transportu částic je standardní nástroj jaderné fyziky a radiační ochrany. Modeluje průchod toku elementárních částic (fotony, elektrony, neutrony, protony, ionty) materiálním prostředím. Typické úlohy:

V této otázce uvažujeme homogenní tok, tedy částice stejného druhu. Trajektorie jedné částice je posloupností náhodných událostí: emise → přímočarý let → interakce s atomem → buď zánik, nebo pokračování (případně další větve).

Zjednodušující předpoklady modelu

Účinné průřezy: měřítko pravděpodobnosti interakce

Účinný průřez (cross section) $\sigma$ je centrální pojem. Geometricky si představ atomy jako kuličky a procházející částici jako kámen. Plocha „terče“, který kámen zasáhne s nějakou pravděpodobností, je účinný průřez. Jednotkou je obvykle barn ($1\,\text{b} = 10^{-28}\,\text{m}^2$).

Diferenciální účinný průřez

Popisuje pravděpodobnost, že částice v daném bodě prostoru se po interakci odchýlí do konkrétního prostorového úhlu.

$g(\mathbf{r}, \boldsymbol{\omega}', \boldsymbol{\omega}, E) = \dfrac{d\sigma_a}{d\Omega}$

Význam parametrů:

Makroskopický účinný průřez

Mikroskopický průřez popisuje jeden atom. V reálu má prostředí mnoho atomů na jednotku objemu, takže makroskopický průřez je:

$\sigma_a^{(m)}(\mathbf{r}) = \sigma_a \cdot N$

kde $N$ je počet terčů na jednotku objemu. Makroskopický průřez vyjadřuje celkovou pravděpodobnost interakce v daném materiálu, jeho rozměr je $\text{m}^{-1}$ (převrácená délka). Intuitivně: $\sigma^{(m)}$ určuje, jak často částice naráží do něčeho.

Olovo má vysoký makroskopický průřez pro fotony (mnoho elektronů, vysoká hustota), takže fotony v něm často interagují a do hloubky se nedostanou. Vzduch má naopak nízký $\sigma^{(m)}$, takže fotony v něm letí v průměru dlouho rovně. Vzpomeň si na rentgen: olověná zástěra zachytí téměř všechno, vzduchová vrstva nic.

Volná dráha a optická vzdálenost

Vzdálenost mezi dvěma po sobě jdoucími interakcemi nazýváme volná dráha $\ell$. Je to náhodná veličina s exponenciálním rozdělením. V homogenním prostředí (kde $\sigma^{(m)}$ nezávisí na $\mathbf{r}$) je hustota pravděpodobnosti:

$f_\ell(t) = \sigma^{(m)}\cdot e^{-\sigma^{(m)} t}, \qquad t \ge 0$

V nehomogenním prostředí, kde se $\sigma^{(m)}(\mathbf{r})$ mění podél dráhy, dostáváme obecnější vztah:

$f_\ell(t) = \sigma^{(m)}(\mathbf{r}(t))\cdot e^{-\int_0^t \sigma^{(m)}(\mathbf{r}(u))\,du}$

Distribuční funkce:

$F_\ell(t) = 1 - e^{-\tau(t)}$

kde $\tau(t)$ je optická vzdálenost (nebo koeficient pohlcení):

$\tau(t) = \displaystyle\int_0^t \sigma^{(m)}(\mathbf{r}(u))\,du$

Optická vzdálenost je tedy „integrál tuhosti prostředí“ po dráze. Pravděpodobnost, že částice přežije bez interakce dráhu délky $t^*$, je:

$P(\ell > t^*) = e^{-\tau(t^*)}$
Volná dráha má exponenciální rozdělení, generujeme ji inverzní transformací z Otázky 3: $\xi = -\dfrac{1}{\sigma^{(m)}}\ln \Upsilon$. Tedy v homogenním prostředí nasimulujeme volnou dráhu jedním logaritmem náhodného čísla. V nehomogenním prostředí jde místo $\sigma^{(m)}$ použít akumulovanou optickou vzdálenost, viz dále.

Rozdělení podle typu interakce

Když částice dorazí do bodu interakce, musíme určit, co se s ní stane. Klíčový parametr je střední hodnota počtu vylétávajících (sekundárních) částic, kterou označujeme $\nu$.

Typ interakce$\nu$Co se stanePříklady
Pohlcení (absorpce)$\nu = 0$Částice zaniká, její sledování končí.Fotoabsorbce fotonu, záchyt neutronu jádrem
Rozptyl$\nu = 1$Částice pokračuje dál, ale změní směr (a obecně i energii).Comptonův rozptyl fotonu, pružný rozptyl neutronu
Štěpení / multiplikace$\nu > 1$Z interakce vychází víc nových částic, než kolik vstoupilo.Štěpení uranu neutronem (typicky $\nu \approx 2{,}5$)

Pokud při interakcích vznikají identické sekundární částice (např. neutrony při štěpení), můžeme všechny dílčí druhy interakcí $i = 1, \dots, m$ sloučit do jedné „sumární“ interakce, jejíž parametry jsou váženými průměry:

$\sigma^{(m)}(\mathbf{r}) = \displaystyle\sum_{i=1}^{m}\sigma_i^{(m)}(\mathbf{r})$
$g(\mathbf{r}, \boldsymbol{\omega}', \boldsymbol{\omega}) = \dfrac{1}{\sigma^{(m)}(\mathbf{r})}\displaystyle\sum_{i=1}^{m}\sigma_i^{(m)}(\mathbf{r})\,g_i(\mathbf{r}, \boldsymbol{\omega}', \boldsymbol{\omega})$
$\nu(\mathbf{r}) = \dfrac{1}{\sigma^{(m)}(\mathbf{r})}\displaystyle\sum_{i=1}^{m}\sigma_i^{(m)}(\mathbf{r})\,\nu_i(\mathbf{r})$

Algoritmus pro $\nu \le 1$ (pohlcení a rozptyl, bez štěpení)

Sledujeme jednu částici od emise do zániku (pohlcení nebo opuštění oblasti).

  1. Emise částice. Vygeneruj počáteční souřadnice $\mathbf{r}_0$ a výchozí směrový vektor $\boldsymbol{\omega}_0$ podle hustoty pravděpodobnosti zdroje záření. Pro bodový zdroj je $\mathbf{r}_0$ fixní a $\boldsymbol{\omega}_0$ izotropní (rovnoměrné na sféře). Pro plošný zdroj se losuje pozice na ploše atd.
  2. Transport. Generuj volnou dráhu $s$ z exponenciálního rozdělení: $s = -\tfrac{1}{\sigma^{(m)}}\ln \Upsilon$. Vypočti novou polohu: $\mathbf{r} = \mathbf{r}_0 + s\,\boldsymbol{\omega}_0$.
  3. Test geometrie. Pokud bod $\mathbf{r}$ leží mimo zkoumanou oblast (částice opustila stínění nebo vyletěla z palivového článku), její sledování končí a přejdeme rovnou ke kroku 8 (vyhodnocení).
  4. Druh interakce. Pomocí náhodného čísla a poměrů $\sigma_i^{(m)}/\sigma^{(m)}$ rozhodneme, který typ interakce nastane (rozptyl, absorbce, ...). Pokud došlo k pohlcení ($\nu = 0$), sledování končí, jdeme na 8.
  5. Parametry sekundární částice. Při rozptylu z diferenciálních účinných průřezů simulujeme nový úhel rozptylu $\vartheta$ (často se pracuje s $\mu = \cos\vartheta$) a azimutální úhel $\varphi$. Azimut je u izotropních interakcí rovnoměrně rozdělený v $(0, 2\pi)$ a generuje se jako $\varphi = 2\pi \Upsilon$.
  6. Nový směrový vektor. Z úhlů $\vartheta$, $\varphi$ a původního směru $\boldsymbol{\omega}_0$ přepočítáme nový směr $\boldsymbol{\omega}$. Toto je vektorová transformace v 3D prostoru (rotace).
  7. Cyklus. Posuneme se: $\mathbf{r}_0 \leftarrow \mathbf{r}$, $\boldsymbol{\omega}_0 \leftarrow \boldsymbol{\omega}$. Skočíme zpět na krok 2 (částice letí dál).
  8. Vyhodnocení. Připočteme příspěvek této částice do skóre (např. počet rozptylů, absorbovaná dávka, dosažený detektor). Připravíme novou primární částici ze zdroje a začínáme od kroku 1. Po dostatečném počtu primárních částic dostaneme statisticky věrohodný odhad.

Algoritmus pro $\nu > 1$ (štěpení / multiplikace)

Pokud v kroku 4 nastane interakce s $\nu > 1$, situace je složitější: počítač neumí sledovat víc trajektorií najednou, ale částice se větví na strom potomků. Musíme algoritmus upravit a používat zásobník (kontejner), kam si odložíme nezpracované větve.

Počet sekundárních částic $n$ se losuje stochasticky tak, aby jeho střední hodnota byla přesně $\nu$:

kde $\{\nu\}$ značí desetinnou část a $\lfloor \nu \rfloor$ celou část. Pro $\nu = 2{,}5$ tedy s pravděpodobností 0,5 vzniknou 2 částice a s 0,5 vzniknou 3 částice. Střední hodnota je $0{,}5 \cdot 2 + 0{,}5 \cdot 3 = 2{,}5 = \nu$.

Postup po štěpení:

Štěpení tvoří strom trajektorií. Zásobník je „TODO list“ větví, které musíme ještě prozkoumat. Algoritmus se chová jako hloubkové prohledávání (DFS): jednu větev sleduje do konce, pak vyzvedne další ze zásobníku. Pro štěpitelná jádra (uran, plutonium) je toto kritické, protože jedna primární neutronová částice může vyvolat řetězovou reakci se stovkami potomků.

Modelování v nehomogenním prostředí

V reálu se částice málokdy pohybuje pouze jedním materiálem. Typický scénář: foton vyletí z palivového proutku (uran), prochází vrstvou olova, pak betonem reaktorové budovy, pak vzduchem ven. V každém materiálu má jiný makroskopický průřez.

Tento problém se řeší modelem po částech homogenního prostředí. Prostor rozdělíme na oblasti $V_1, V_2, \dots$, kde v každé je $\sigma^{(m)}$ konstantní. Pokud částice na své dráze prochází postupně oblastmi $V_{i_1}, V_{i_2}, \dots, V_{i_s}$, optická vzdálenost se počítá jako suma příspěvků z jednotlivých bloků:

$\tau_{ij} = \lambda_{ij} \cdot \sigma^{(m, ij)}$

kde $\lambda_{ij} = \|\mathbf{r}_j - \mathbf{r}_{j-1}\|$ je geometrická délka úseku v $j$-té oblasti a $\sigma^{(m, ij)}$ je tamní makroskopický průřez. Celková optická vzdálenost do cílového bodu:

$\tau(\mathbf{r}) = \displaystyle\sum_{j=1}^{s-1}\tau_{ij} + \lambda_{i_s}\cdot \sigma^{(m, i_s)}$

Distribuční funkci volné dráhy přes rozhraní materiálů zapisujeme multiplikativně:

$F_\ell(t) = 1 - e^{-\lambda_{i_s}\sigma^{(i_s)}}\cdot \displaystyle\prod_{j=1}^{s-1} e^{-\tau_{ij}}$

Algoritmicky se to implementuje tak, že místo „uleť konstantní vzdálenost“ kontrolujeme, kdy částice překračuje rozhraní mezi materiály, a v každém úseku používáme příslušný $\sigma^{(m)}$. Geometrický modul simulace musí umět rychle detekovat protnutí trajektorie s povrchy oblastí.

Stínění reaktoru: konkrétní představa. Foton se zrodí ve štěpení v palivovém proutku. Letí směrem ven. V uranu $\sigma^{(m)}$ je vysoké (krátké volné dráhy, často interaguje). V olověném plášti ještě vyšší pro $\gamma$-záření (Comptonův rozptyl, fotoabsorpce). V betonu středně velké (kombinuje rozptyl na lehkých prvcích jako vodík v krystalické vodě a absorbci na těžších prvcích). Ve vzduchu velmi malé (foton může letět stovky metrů, než se něco stane). MC simulace nám řekne, jaký zlomek primárních fotonů projde a jakou má pak energii.

Příklad konkrétních hodnot pro fotony 1 MeV: $\sigma^{(m)}_{\text{Pb}} \approx 0{,}77\,\text{cm}^{-1}$ (střední volná dráha ~1,3 cm), $\sigma^{(m)}_{\text{beton}} \approx 0{,}15\,\text{cm}^{-1}$ (~7 cm), $\sigma^{(m)}_{\text{vzduch}} \approx 1 \cdot 10^{-4}\,\text{cm}^{-1}$ (~100 m).

Co se v simulaci vyhodnocuje (skóre)

Cílem MC transportu obvykle není jednotlivá trajektorie (ta je sama o sobě k ničemu), ale statistický odhad nějaké veličiny:

Kostra Otázky 4: (a) Předpoklady: žádné interakce mezi částicemi, přímočarý let mezi interakcemi, sekundárky z bodu. (b) Účinné průřezy: mikroskopický $\sigma_a$, makroskopický $\sigma^{(m)} = \sigma_a \cdot N$, diferenciální $g = d\sigma_a/d\Omega$. (c) Volná dráha je exponenciální s parametrem $\sigma^{(m)}$, generuje se inverzní transformací. Optická vzdálenost $\tau = \int \sigma^{(m)}\,du$. (d) Typy interakce podle $\nu$: pohlcení ($\nu = 0$), rozptyl ($\nu = 1$), štěpení ($\nu > 1$). (e) Algoritmus: emise, transport, test geometrie, druh interakce, sekundární parametry, nový směr, cyklus, vyhodnocení. (f) Pro $\nu > 1$ použít zásobník. (g) Nehomogenita: po částech homogenní, optická vzdálenost se sčítá.
Otázka 5

Modelování systémů hromadné obsluhy metodou Monte Carlo.

Co je teorie hromadné obsluhy a proč ji potřebujeme

Teorie hromadné obsluhy (anglicky queueing theory, teorie front) studuje systémy, do kterých přicházejí požadavky a které je musí obsloužit. Pojem požadavku je obecný: zákazník v bance, paket v síťovém routeru, výrobek na lince, telefonát v call centru, čtenář v knihovně. Pojem obsluhy také: prodavač, server, robot na lince, operátor.

Cílem MC simulace je najít optimální nastavení systému. Konkrétně:

Aplikace jsou všudypřítomné: call centra (kolik operátorů potřebujeme v dané hodině), banky (kolik přepážek), nemocnice (kolik lůžek na pohotovosti), webové servery (kolik instancí), výrobní linky (kolik strojů paralelně), letecké terminály (počet odbavovacích přepážek). Často je v sázce hodně peněz: každá nadbytečná linka stojí, každý ztracený zákazník je škoda.

Klíčové náhodné veličiny

Při simulaci pracujeme se dvěma fundamentálními náhodnými veličinami, jejichž rozdělení pravděpodobnosti musíme znát buď z teorie (analyticky) nebo z empirických dat (měření v reálném systému):

  1. Čas příchodu události (požadavku) do systému, respektive interval mezi příchody $\eta_i$.
  2. Doba potřebná k obsluze jednoho požadavku, označovaná $\tau_z$.

Sekundární náhodné veličiny:

Popis systému: tři komponenty

Každý systém hromadné obsluhy se popisuje třemi částmi:

Každý jednotlivý požadavek je v simulaci popsán vektorem parametrů $(t_i, a_1, \dots, a_m)$, kde:

Kategorie systémů podle doby čekání $\tau_p$

Typ systému$\tau_p$ChováníPříklad
S odmítáním (loss system)$\tau_p = 0$Pokud není linka ihned volná, požadavek okamžitě odchází neobsloužen.Telefonní ústředna bez zařazení do fronty: obsazený tón a hovor končí.
Čekací (waiting system)$\tau_p = +\infty$Požadavek v zásobníku čeká libovolně dlouho, dokud na něj nepřijde řada.Tisková fronta v počítači. Úloha nikdy „neunaví“ a počká.
Smíšený (mixed system)$0 < \tau_p < +\infty$Požadavek má definovanou konečnou dobu, po kterou je ochoten v systému čekat. Pokud doba vyprší a nebyl obsloužen, odchází.Zákazník v restauraci, který po 30 minutách čekání odchází jinam.

Vlastnosti toku požadavků

Označme $\eta_i = t_i - t_{i-1}$ pro $i > 1$ a $\eta_1 = t_1$. To jsou intervaly mezi po sobě jdoucími příchody. Sledujeme zejména pravděpodobnost $P(k, t_0, t)$, že v časovém okně $\langle t_0, t_0 + t \rangle$ dorazí právě $k$ požadavků.

Typy toků

Poissonův tok: nejdůležitější aproximace

V praxi se nejčastěji setkáváme s tokem, kde intervaly mezi příchody mají exponenciální rozdělení s hustotou $f(x) = \lambda e^{-\lambda x}$. Z toho automaticky plyne, že počet příchodů v daném intervalu má Poissonovo rozdělení.

Důvod, proč je Poissonův tok tak rozšířený: je to jediný tok, který současně splňuje stacionárnost, ordinaritu a nezávislost přírůstků. Centrální limitní věta v podobném smyslu „přitahuje“ reálné toky k Poissonovi.

Stacionární Poissonův tok

Pokud je intenzita $\lambda$ konstantní v čase:

$P(k, t) = \dfrac{(\lambda t)^k}{k!}\,e^{-\lambda t}$

Nestacionární Poissonův tok

V reálu intenzita kolísá: v bance přijde poledne víc lidí, na webové aplikaci je špička večer, server má jiný provoz v pracovní dny a o víkendu. Pak se intenzita stane funkcí času $\lambda(u)$ a vzorec se zobecní:

$P(k, t_0, t) = \dfrac{\Lambda^k(t_0, t)}{k!}\,e^{-\Lambda(t_0, t)}, \qquad \Lambda(t_0, t) = \displaystyle\int_{t_0}^{t}\lambda(u)\,du$

$\Lambda(t_0, t)$ je střední počet požadavků v daném intervalu, $\lambda(u)$ je okamžitá hustota toku.

Poissonův tok je „čistá náhoda bez paměti“. Pravděpodobnost, že další zákazník přijde za 5 minut, nezávisí na tom, kdy přišel ten předchozí. Matematicky to vyjadřuje vlastnost bezpaměťovosti exponenciálního rozdělení: $P(\eta > s + t \mid \eta > s) = P(\eta > t)$.

Intervaly v Poissonově toku generujeme inverzní transformací (Otázka 3): $\eta = -\tfrac{1}{\lambda}\ln \Upsilon$.

Dva přístupy k simulaci v MC

Při implementaci máme dvě možnosti, jak zacházet s časem:

1. Modely s diskrétním časem.

Celkový čas simulace $T$ se rozseká na pevné, malé úseky $\Delta t$. Na konci každého intervalu počítač zkontroluje stav systému: přišel nový požadavek? Uvolnila se linka? Vypršela něčí čekací doba?

Výhoda: jednoduchá implementace, lineární průchod časem.

Nevýhoda: pokud je $\Delta t$ moc velké, propasete události. Pokud je moc malé, většinu kroků nic nenastane a počítač je marně vyhodnocuje. To výpočet zbytečně zdržuje.

2. Modely s diskrétními událostmi (event-driven simulation).

Časová osa se posouvá skokově pouze do okamžiků, kdy reálně nastane nějaká změna: příchod zákazníka, dokončení obsluhy, porucha linky, vypršení doby čekání. Mezi událostmi „nic není“, takže není co simulovat.

Algoritmicky: udržujeme prioritní frontu naplánovaných událostí seřazenou podle času. Vždy vyzvedneme nejbližší, zpracujeme, případně přidáme do fronty nové (např. zpracování zákazníka naplánuje událost „dokončení obsluhy v čase $t + \tau_z$“).

Výhoda: řádově efektivnější, žádné prázdné kroky. Standard pro MC simulace front.

Diskrétní čas je jako budík, který každou minutu zazvoní a zeptá se, co se děje. Diskrétní události jsou jako kalendář: budík zazvoní jen ve chvíli, kdy je něco naplánovaného. Druhý přístup šetří baterii a je univerzálně lepší.

Metoda rozštěpení (splitting) pro vzácné jevy

Některé úlohy se zaměřují na kritické stavy, které nastávají velmi zřídka. Příklady:

U takových jevů selhává naivní MC: museli bychom simulovat miliardy běhů, než by jev vůbec jednou nastal. Náhrada: metoda rozštěpení (splitting), která uměle „posiluje“ pravděpodobnost zájmového jevu váženými klony trajektorií.

Princip metody

  1. Sledování stavu: definujeme kontrolní okamžiky $T_1, T_2, \dots$ a kritickou hranici $N$, např. počet požadavků v systému, kterého se chceme „dotknout“ nebo přesáhnout.
  2. Rozštěpení: jakmile systém v okamžiku $T_i$ dosáhne kritického stavu $n \ge N$, simulace se v tomto bodě rozvětví na $M$ identických podsystémů. Každému podsystému se přiřadí váha $Q = 1/M$.
  3. Další větvení: v následujícím čase $T_{i+1}$ se zkontroluje podmínka $n \ge N$ pro každý podsystém zvlášť. Pokud je podmínka splněna, větev se znovu rozštěpí na dalších $M$ větví (s vahami $1/M^2$). Větve, které podmínku nesplnily, se zahodí.
  4. Sloučení / vyhodnocení: výsledná váha celého systému je rovna součtu vah úspěšně sloučených podsystémů. Součet vah systémů ve stavu $r$ označíme $Q_r$ (pro $r = 0, 1, \dots, N-1$). Celkové rozdělení pravděpodobnosti stavů v čase $T_{i+1}$ pak je:
    $p_r = \dfrac{Q_r}{Q}$
    kde $Q$ je celkový součet vah.
Místo abychom marně čekali na vzácný jev, „klonujeme“ trajektorie, které už jsou na cestě k němu. Klony si vzájemně dělí původní jednotkovou váhu, takže celková pravděpodobnost zůstává nestranná. Dramaticky jsme jen zvýšili počet simulovaných pokusů v zajímavé oblasti stavového prostoru, místo abychom je všechny utráceli na nudné, vzdálené stavy.

Co se v simulaci vyhodnocuje

Po dostatečném počtu nezávislých běhů MC simulace odhadneme řadu praktických veličin:

Optimalizace kavárny. Předpokládáme Poissonův tok zákazníků s nominální intenzitou $\lambda = 20$ za hodinu (jeden zákazník každé 3 minuty průměrně). Doba obsluhy exponenciální se střední hodnotou $5$ minut. V poledne intenzita kolísá: $\lambda(u)$ vyskočí na $50$.

Otázka: Stačí dva baristé v poledne, nebo musíme přibrat třetího? Kolik bude reálně čekat?

Postup MC: Implementujeme event-driven simulaci. Události jsou „přišel zákazník“ (čas dalšího generujeme jako $-\tfrac{1}{\lambda(u)}\ln \Upsilon$) a „barista dokončil obsluhu“. Sledujeme délku fronty, počet odcházejících (kvůli dlouhému čekání), využití baristů. Spustíme 10 000 nezávislých replik simulace pro každý scénář (2, 3, 4 baristé) a porovnáme statistiky.

Typický výsledek: 2 baristé v poledne mají vytížení ~95 % a fronta narůstá nekontrolovatelně. 3 baristé jsou na ~75 % a fronta je stabilní s průměrnou dobou čekání ~7 minut. 4 baristé na ~55 % bez fronty, ale výrazně dražší. Manažer rozhodne podle nákladů a tolerance zákazníků.

Souvislost s ostatními otázkami

Otázka 5 se silně překrývá s ostatními:

Kostra Otázky 5: (a) Co je teorie front a co simulujeme: optimální počet linek, režim, kapacita. (b) Dvě klíčové náhodné veličiny: časy příchodů a doby obsluhy. (c) Tři komponenty popisu: vstupní tok, struktura, režim. (d) Kategorie podle $\tau_p$: odmítání ($\tau_p = 0$), čekací ($\tau_p = +\infty$), smíšený. (e) Typy toků: homogenní, s omezenou závislostí, stacionární, ordinární. (f) Poissonův tok jako standard: stacionární $P = (\lambda t)^k e^{-\lambda t}/k!$, nestacionární přes $\Lambda(t_0, t)$. (g) Dva přístupy: diskrétní čas vs. event-driven (lepší). (h) Splitting pro vzácné jevy: větvení s vahami $1/M^k$.

Materiál ke státnicím · Metody Monte Carlo · 5 otázek