Számítógépes szimulációk 4. Véletlen számok BME Fizika Intézet 2015. október 7.
Vázlat Egyenletes eloszlású pszeudovéletlen számok Véletlen számok generálása -lel szerinti véletlen számok generálása Véletlenszám-generátorok tesztelése
generálása Cél: független, egyenletes eloszlású,,véletlen számok generálása [0, 1]-en Leggyakrabban egészek generálva 0 és egy maximális érték között De: a számítógép determinisztikusan működik, nincs véletlen, csak álvéletlen Lineáris kongruenciális algoritmus (csak az előző számot kell tárolni): X n+1 = (ax n + c)%m Rendszer m a c Eredmény glibc (gcc) 2 31 1103515245 12345 b 30... b 0 ANSI C 2 31 1103515245 12345 b 30... b 16 C99, C11 2 32 1103515245 12345 b 30... b 16 Visual C++ 2 32 214013 2531011 b 30... b 16 Gond: periódusok, csíkozás...
generálása A Fibonacci-sorozat mintájára: X n = X n j X n k ahol (j,k) rögzített, lehet XOR, összeadás, bármi. Speciálisan: Tausworthe-generátor (a megelőző 250 számot kell tárolni): X n = X n 250 XOR X n 103 Gond: hogyan inicializáljuk a generátort? Órai feladat: Az rng defs orai.c fájlban a double mca(void) függvény kiegészítése, hogy a multiplikatív kongruenciális módszert használja. Legyen m = 2 31 1, a = 16807, c = 0, a kimenet [0,1]-ben. Az előző értéket a függvénynek kell tárolnia.
véletlenszám-generátor változó: gsl rng *r; környezeti változók olvasása ( RNG SEED, RNG TYPE): gsl rng env setup; generátor inicializálása: r=gsl rng alloc(gsl rng default); gsl rng default==gsl rng mt19937 Mersenne twister algoritmus, periódus 2 19937 1 lehet más generátort is használni seed megadása: gsl rng set(r,seed); véletlen szám: unsigned long gsl rng get(r); [0, 1]-en: double gsl rng uniform(r); felszabadítás: gsl rng free(r);
Seed Csak egyszer kell megadni, a program elején : gsl rng set(r,seed); Tipikus használat seed=time(null); http://www.random.org/ A megismételhetőség miatt érdemes eltárolni a használt seedet
ú véletlen számok Lehet inverz eloszlásfüggvényből (inverse transform sampling), ha az egyszerűen számolható: F X (x) = P (X < x), ekkor X = F 1 X (U), U U (0,1), nem mindig működik (diszkrét eloszlások, normális eloszlás) Eloszlás transzformációja: például normális eloszlásra Box Müller-transzformáció, U, V U (0, 1) függetlenek, Z 1 = 2ln U cos (2πV ), Z 2 = 2lnU sin(2πv ), ekkor Z 1,Z 2 N (0,1) függetlenek Visszautasításos mintavételezés (rejection sampling): f (x) sűrűségfüggvény szerint kell sorsolni, g(x) szerint könnyű sorsolni (például egyenletes eloszlás) és f (x) Mg(x),M 1, ekkor sorsolni kell egy számot g(x) szerint, majd ezt elfogadni f (x) szerint sorsoltnak 1 valószínűséggel, ami egy U U (0,1) f (x) Mg(x) sorsolásával megtehető, de az elfogadás csak az esetek 1 M részében történik meg, így rossz a hatásfok
ú véletlen számok Egyenletes: U(a,b), a < b R sűrűségfüggvény: f (x,x [a,b]) = 1 b a E(X) = a+b 2, D2 (X) = (b a)2 12 lehet más eloszlások generálására, tesztelésére használni gsl ran flat(r,a,b); Bernoulli: Ber(p), p [0, 1] P(X = 1) = p, P(X = 0) = 1 p E(X) = p, D 2 (X) = p (1 p) példa: pénzfeldobás gsl ran bernoulli(r,p);
ú véletlen számok Binomiális: Binom(n, p), n N, p [0, 1] P(X = k,k = 0,...,n) = ( n) p k (1 p) n k E(X) = np, D 2 (X) = np (1 p) példa: sok független pénzfeldobás gsl ran binomial(r,p,n); Órai feladat: az rng types orai.c fájlban az int binomial(n,p) függvény megírása Geometriai: Geom(p), p [0, 1] P(X = k,k Z + 0 ) = p(1 p)k E(X) = 1 p p, D2 (X) = 1 p p 2 példa: hányszor kapunk írást a következő fej előtt gsl ran geometric(r,p)-1; k
ú véletlen számok Poisson: Poi(λ), λ R + P(X = k,k Z + 0 ) = λk k! e λ E(X) = λ, D 2 (X) = λ példa: radioaktív bomlások száma gsl ran poisson(r,lambda); Exponenciális: Exp(λ), λ R + sűrűségfüggvény: f (x,x R + ) = λe λx E(X) = 1 λ, D2 (X) = 1 λ 2 példa: élettartam, várakozási idő gsl ran exponential(r,1.0/lambda); Órai feladat: az rng types orai.c fájlban a double exponential(lambda) függvény megírása az inverziós módszerrel, ha F X (x,x R + ) = 1 e λx
ú véletlen számok Egyenletes gömbön: X,Y,Z U( 1,1), X 2 + Y 2 + Z 2 = 1 generálás: Z U( 1,1),ϕ, X = 1 Z 2 cos (2πϕ), Y = 1 Z 2 sin(2πϕ) példa: véletlen irány sorsolása gsl ran dir3d(r,&x,&y,&z); Normális: N(µ,σ 2 ), µ R, σ R + sűrűségfüggvény: f (x,x R) = 1 2πσ 2 e (x µ)2 2σ 2 E(X) = µ, D 2 (X) = σ 2 példa: független kísérletek átlaga gsl ran gaussian(r,s)+m; (Box-Müller), gsl ran gaussian ziggurat(r,s)+m; gsl ran gaussian ratio method(r,s)+m;
Véletlenszám-generátorok tesztelése azt kell tesztelni, hogy a generátor által sorsolt számok mennyire felelnek meg független, egyenletes eloszlású véletlen számoknak általában valamilyen más eloszlás generálva, annak eloszlása összehasonĺıtva az elméleti várakozással könyvtár (GCC-hez): TestU01 (L Ecuyer, Simard)[2] példa: rng types plot geometric ábrázolás: plot for [i=2:6] test.out using 1:i with points pointtype 7 linecolor i pointsize 0.5 title "generator ".(i-3) plot for [i=3:6] test.out using 1:(column(i)-$2) with points pointtype 7 linecolor i pointsize 0.5 title "generator ".(i-3)
apró részecskék diffúziós mozgását írja le valamilyen közegben, sok kicsi, véletlen irányú erő hatására matematikai definíció egy dimenzióban: B 0 = 0 majdnem biztosan B t majdnem biztosan folytonos B t B s N(0, t s), t s 0 0 < t 1 < < t n esetén B t1, B t2 B t1,..., B tn B tn 1 függetlenek B t sűrűségfüggvénye f (x;t) = 1 e x2 2t 2πt ez a t p = 1 2 2 xp diffúziós (Fokker Planck-)egyenlet megoldása p(x;0) = δ(x) kezdeti feltétellel, végtelenben eltűnő megoldásokra sztochasztikus differenciálegyenletek (például Langevin-egyenlet) megoldására használják
generálása: B t = t 0 db s = lim t 0 =0,t N =t N i=0,...,n 1 B ti+1 B ti független normális eloszlások összege: B ti+1 B ti N(0,t i+1 t i ) vizsgálható a pálya egy megvalósításra, illetve a várható érték és a szórás az idő függvényében példa: Brownian motion ábrázolás: plot test.out every :::0::0 with points pointtype 7 linecolor 3 pointsize 0.5 title "Sample path" plot test.out ev :::1::1 u 1:2 w p pt 7 lc 3 ps 0.5 t "Mean", \ test.out ev :::1::1 u 1:3 w p pt 7 lc 7 ps 0.5 t "Standard deviation"
Brown-híd (Brownian bridge) generálása t 1 X t = (1 t) 0 1 s db s = t0=0,tn=t = lim (1 t) N i=0,...,n 1 Házi feladat B ti+1 B ti 1 t i,t [0,1] Vizsgáljuk a pályát, a várható értéket és a szórást az idő függvényében. Beküldendő a forráskód (Brownian bridge) és három ábra: egy a pályáról (sample.jpg), egy a várható értékről (mean.jpg), egy a szórásról (stddev.jpg), mindegyik a [0,1] intervallumon az idő függvényében, megfelelő felbontással, az átlagolt mennyiségekre megfelelő számú ( 1000) átlagolással. Maximális pontszám: 2 pont
[1] Gnu Scientific Library Reference Manual. http://www.gnu.org/software/gsl/manual/html node/ [2] Pierre L Ecuyer and Richard Simard. TestU01 A Software Library in ANSI C for Empirical Testing of Random Number Generators. http://www.iro.umontreal.ca/ simardr/testu01/tu01.html [3] Értelmes honlap a Brown-híd matematikájához: www.math.uah.edu/stat/brown/bridge.html