Simulointi Satunnaisluvut
Satunnaisluvut Anyone who considers arithmetic methods of producing random digits is, of course, in a state of sin, John v. Neumann Simuloinnissa käytetään aina näennäisesti satunnaisia lukuja (pseudo random numbers) Satunnaislukujen tulisi olla Tehokkaasti ja toistettavasti generoitavia Toistaa tavoitellun satunnaislukujonon keskeiset piirteet (tunnusluvut, näennäinen riippumattomuus) Käyttötarve määrää, mitkä piirteet keskeisiä
Historiaa Tarve generoida satunnaislukuja syntyi yhtä aikaa tietokoneiden kanssa Ydinreaktion simulointi, Los Alamos Alkuvaiheessa yksinkertaisuus ja laskennallinen tehokkuus korostuivat Yksinkertaiset laskutoimitukset, sopivat numeeriset vakiot Myöhemmin siirrettävyys Tehokas toteutus korkean tason kielillä Lisäksi tilastolliset ominaisuudet
Satunnaislukujen generointi Generointi jaetaan yleensä kahteen osaan Tasan (0,1) jakautuneiden satunnaislukujen generointi Generoidaan tasan (0,m-1) jakautuneita kokonaislukuja ja jaetaan lopuksi m:llä Annetun todennäköisyysjakauman mukaan jakautuneiden lukujen generointi Tehdään Tas(0,1) lukujen avulla
Keskineliömenetelmä Ensimmäisiä ad hoc ajatuksia (von Neumann) Olkoon x k-numeroinen luku. Esim x=12345 Lasketaan x*2 (2k-numeroinen) 0016604025 Otetaan k keskimmäistä Jne 16604 ->x, U=0,16604
Keskineliömenetelmä integer,parameter :: m0=100,m1=10000 integer :: seed real function random() seed=seed*seed seed=seed/m0 seed=modulo(seed,m1) random=real(seed)/real(m1) return end function random 3456 0.9439 9.47000E-02 0.8968 0.425 6.25000E-02 0.3906 0.2568 0.5946 0.3549 0.5954 0.4501 0.259 0.7081 0.1405 0.974 0.8676 0.2729 0.4474 1.66000E-02 2.75000E-02 7.56000E-02 0.5715 0.6612 0.7185 0.6242 0.9625 0.6406 3.68000E-02 0.1354 0.8333 0.4388 0.2545 0.477 0.7529 0.6858 3.21000E-02 0.103 6.09000E-02 0.3708 0.7492 0.13 0.69 0.61 0.21 0.41 0.81 0.61 0.21 0.41 0.81 0.61 0.21
Keskineliö - analyysiä Menetelmä tuottaa päättymättömän jonon k-numeroisia lukuja. Ensimmäiset luvut yleensä näennäisesti toisistaan riippumattomia. Menetelmä päätyy toistamaan tiettyä lukusarjaa Sykli yleensä liian lyhyt simulointitarpeisiin Syklin pituutta ja laatua ei voi hallita helposti
Hyvät satunnaisluvut Generoiduilta satunnaisluvuilta edellytetään Satunnaisuutta Sama sekvenssi ei saa toistua systemaattisesti käytön aikana Käytännössä syklin oltava pidempi kuin koesarjassa tarvittujen lukujen määrä Oikeaa jakaumaa Yleensä OK, jos kaikki mahdolliset arvot käydään läpi (maksimisykli).
Hyvät satunnaisluvut Peräkkäisten arvojen riippumattomuus Ei toteudu kirjaimellisesti, vaatii testausta Esim. k peräkkäisen arvon jakauma R^k:n yksikkökuutiossa tai max(x_i,,x_(i+k-1)):n jakauma. Taajuustesti (lukujonon tulisi olla ortogonaalinen kaikkien sini-aaltojen kanssa) Hyvyys riippuu käyttötarkoituksesta käytetäänkö lukuja yksittäin, pareittain, k-luvun ryppäissä, jne Tarkemmin Knuth vol II
Lehmer generaattori Kehitetty 40-luvulla (D Lehmer) ensimmäisille tietokoneille (Eniac) Perusoperaatiot: kertolasku, yhteenlasku ja jakojäännöksen ottaminen X= (a X+ c) mod m Parametreilla a, c ja m voidaan vaikuttaa lukujonon ominaisuuksiin Alkuperäinen generaattori toteutettiin omana laskentayksikkönään (jonka tuloksia käytettiin vain tarvittaessa) -> lisää satunnaisuutta
Lehmer generaattori Alkuperäinen generaattori Eniacille m= 10^8 +1 A= 23 C= 0 Oli tehokas toteuttaa kyseisellä koneella Ei erityisen hyvälaatuinen (pieni kertoja, peräkkäiskorrelaatiota)
Lehmer generaattori Seuraava X määräytyy yksikäsitteisesti edellisestä. Generaattori alkaa toistaa samaa sarjaa heti kun X toistuu ensimmäisen kerran X:n arvoalue määrää teoreettisen maksimipituuden syklille (= m) Lehmer generaattorille tiedetään, milloin maksimisykli saavutetaan Jos q on m:n tekijä (alkuluku tai 4), a-1 =0 mod q c:llä ja m:llä ei yhteisiä tekijöitä (ja c ei nolla)
Lehmer generaattori (Vasta)esimerkkejä maksimisykliehdoista Valitaan m=8, c=3 Oltava a-1 =0 mod 2 ja a-1=0 mod 4=> a=5 0->3->18=2->13=5->28=4->23=7->38=6->33=1->0 Jos a=3 (a-1=0 mod 2) 0->3->12=4->15=7->24=0 Jos c=0, 0->0 kaikilla m, a
Lehmer generaattori Jos c=0, maksimisykliä ei saavuteta (X=0 kuvautuu aina nollaksi) Teoreettinen maksimisykli (kun c=0) on m-1. Voidaan saavuttaa jos ja vain jos m on alkuluku a on ns primitiivinen elementti mod m Käytännössä a voidaan määrätä vain kokeellisesti Prime modulus multiplicative congruental generator
Lehmer generaattorit Käytännössä suosittuja perusgeneraattoreita Käsitteellisesti helppoja laskutoimituksia 2^31-1 (maxint) on sopivasti alkuluku Helppo tehdä siirrettävä toteutus (jos a riittävän pieni) (käytettävä kaksoistarkkuuden aritmetiikkaa, jos 64 bitin kokonaislukuja ei tueta) Tutkittu ja tunnettu
Lehmer generaattori real(dp),parameter :: m=2._dp**31-1._dp m_1=1._dp/m a=16807._dp real(wp) function random() seed=modulo(seed*a,m) random=seed*m_1 return end function random
Yhdistelmägeneraattorit Tehty aikanaan lyhyen sananpituuden koneille (16-bit), Wichman-Hill Käytetään useampaa lyhyen syklin generaattoria Esim syklit m_1, m_2 ja m_3 Tuotetaan jonot X_i ja U_i= X_i/m_i Tulos U= U_1+U_2+U_3 mod 1 Sopivin valinnoin syklin pituus on m_1*m_2*m_3 Toteutus täysin standardiaritmetiikalla (m_i<2^14)
Sekoitetut generaattorit Käytetään sekä syklin pidentämiseen että peräkkäiskorrelaation vähentämiseen Periaate on tuottaa satunnaislukuja generaattorilla A taulukkoon Taulukosta poimitaan generaattorin B avulla satunnainen alkio (generaattorin output) ja lasketaan tilalle uusi luku generaattorilla A Tarvitsee muistia ja käynnistysvaiheen sekä kaksi satunnaislukua/tulos Sykli pitenee (mutta paljonko)
Sekoitettu generaattori A B
State of the Art Tämän hetken de facto standardi on Mersenne Twister Kehitetty 1990-luvun lopulla Erittäin pitkä sykli (2^ 19937-1) Parhaat tunnetut peräkkäiskorrelaatioominaisuudet Tarvitsee 624-sanan työmuistin (joten käynnistys kestää) Saatavissa useille kielille/ympäristöille
Mersenne twister Mihin perustuu X_(N+1) = F(X_N,, X_(N-623)) Tilavektorissa 624*32 = 19968 bittiä Teoreettinen maksimisykli kävisi kaikki tilat läpi Jättämällä X_(N-623):sta osa biteistä käyttämättä, ja rajaamalla algoritmisesti 0-vektori pois mahdollisista tiloista saadaan haluttu teoreettisesti maksimaalinen sykli (alkuluku, ns Mersenne luku, josta nimi)
Mersenne twister Tarvitaan F, joka On laskennallisesti kevyt Tuottaa maksimaalisen syklin Löydetty luokasta X_(N+1) = X_N*A_0 + X_(N-k) * A_k A_i:t kerroinmatriiseja Menetelmäluokalle on teoriaa maksimisykleistä Löydetty A:t joille vain 3 matriisia nollasta eroavia Ts vain kolmea vanhaa X arvoa käytetään yhdellä kierroksella
Mersenne Twister Löydetty menetelmä tuottaa pitkä sykli Laskennallisesti kevyt Peräkkäiskorrelaatio vaatii vielä huomiota K-testi: tarkastellaan peräkkäisten satunnaislukujen k-merkitsevimpien bittien jonoa Monelleko peräkkäiselle luvulle ym jono on tasajakautunut Tähän voidaan vaikuttaa sekoittamalla X:n bittejä laskennan jälkeen Ei vaikuta sykliin vaan vain output streamiin
Satunnaisluvut ja jakaumat Miten generoida satunnaislukuja, joilla on haluttu tiheysjakauma. Käänteistodennäköisyyden menetelmä Olkoon f haluttu tiheysfunktio. Tätä vastaa kertymäfunktio F: x-> (0,1).
Käänteistn. menetelmä Arvotaan u Tas (0,1) jakaumasta Asetetaan x = F^(-1) (u). x:n tiheysjakauma on f. Edellyttää, että F^(-1) tunnetaan suljetussa muodossa u x
Käänteistn. menetelmä Tarkastellaan eksponenttijakaumaa Tiheys f. on f(x) = a e^(-ax) Kertymä f. on F(x) = 1- e^(-ax) Vastaavasti F^(-1) (U) = - ln(1-u)/a Eksponenttijakautuneita suureita saadaan arpomalla U ~ Tas(0,1) ja tulostamalla ln(1-u)/a Myös ln (U)/a toimii, jos U>0 aina
Eliminointimenetelmä Yleinen menetelmä, edellyttää pelkästään tiheysfunktion arvoja Olkoon f tiheysfunktio välillä (a,b), 0<f<c. Arvotaan x, Tas(a,b), y, Tas(0,c). Jos y< f(x), hyväksytään x. Muuten hylätään ja arvotaan uudet x,y y x
Eliminointimenetelmä Eliminointimenetelmä on sitä tehokkaampi, mitä vähemmän hylkäyksiä Väli (a,b) voidaan jakaa osaväleihin ja/tai vaihtaa y:n jakaumaa paremmin f:ää approksimoivaksi. f< cg (osavälillä), g tunnettu jakauma ja x noudattaa g:tä, y = Tas(0, cg(x)) y x
Eliminointimenetelmä Osaväleihin jaettaessa on Aluksi arvottava mihin osaväliin/alueeseen x kuuluu (tn laskettava etukäteen) Sitten valitaan x osavälin jakaumasta ja 0< y< cg(x) sekä testataan y<f(x). Jakauman ositus voi olla taidetta (Marsaglia, ks Knuth vol II) y x
Yhteenvetoa Satunnaislukugeneraattoreilla yli 60-vuoden historia Testattuja ja tunnettuja generaattoreita hyvin saatavilla. Itse ei yleensä kannata säätää Tuntematonta generaattoria (menetelmä ja lähdeviitteet puuttuvat) ei kannata käyttää ainakaan testaamatta (vrt PC:n Basic-generaattori) Generaattoria ymmärrettävä niin, että voi tehdä hallittuja kokeita/toistoja.
Simulointi Monte Carlo
Monte Carlo simulointi Yksittäisen stokastisen simuloinnin tulos on aina sattumanvarainen Yksittäinen instanssi satunnaismuuttujasta Simulointikoesarjan tavoite on saada tietoa satunnaismuuttujan jakaumasta tai jakauman parametreista (keskiarvo, hajonta) Taustalla periaatteessa deterministinen arvo, johon ei kuitenkaan aina suoraan päästä käsiksi.
Buffonin neula Klassinen esimerkki mekaanisesta simuloinnista, jonka tarkka vastaus tunnetaan. Buffonin herttuan 1733 esittämä menetelmä p arvon määräämiseksi. Heitetään l pituista neulaa alustalle, jossa on yhdensuuntaisia suoria d välein. Lasketaan, kuinka usein neula koskettaa viivaa. Kokeellinen todennäköisyys P= #osumat/#yritykset
Buffonin neula Neula osuu viivaan jos Neulan keskipisteen etäisyys viivasta on pienempi kuin l sin a, missä a on neulan ja viivan välinen kulma d l a Kulma ~ Tas(0, p/2) Keskipiste ~ Tas (0,d/2)
Buffonin neula Osuman todennäköisyys lasketaan sinikäyrän rajoittaman pinta-alan avulla p= 2l/(pd) Jos p:lle tunnetaan havaintoarvo, voidaan saada estimaatti p:lle. d/2 l/2 p/2
Buffonin neula Yksittäisen heiton tulos on satunnainen Samoin N heiton keskiarvo. Mitä tiedämme N heiton jälkeen? Määrättävä N heiton keskiarvon (P) jakauma Tai ainakin odotusarvo ja keskihajonta P on N:n riippumattoman satunnaissuureen keskiarvo Yksittäiset kokeet noudattava binomijakaumaa odotusarvolla p (=2l/(pd)) E(P)=p.
Buffonin neula Yksittäisen heiton tuloksen (tai Bin(p) muuttujan) varianssi on p(1-p) N riippumattoman kokeen keskiarvon varianssi on p(1-p)/n Ts Var(P) = p(1-p)/n Nyt meillä on havainto satunnaissuureesta, jonka varianssi tunnetaan. Voimme tehdä arvioita havainnon (otoskeskiarvo) ja odotusarvon välisestä suhteesta.
Luottamusväli Oletetaan, että tunnemme satunnaismuuttujasta otoskeskiarvon Millä välillä on todellinen odotusarvo esim 99% todennäköisyydellä. Määriteltävä ns. luottamusväli, jolle pätee P( P-d < p< P+d) >0.99. Määrittely mahdollista, jos P:n jakauma tunnetaan. P N riippumattoman Bin-muuttujan summa, joten suurilla N, P likimain normaalijakautunut. d laskettavissa ja muotoa c(p)n^(1/2).
Monte Carlo -integrointi Buffonin neulan taustalla oli odotusarvon integraalilauseke, jolle haettiin estimaattia kokeellisesti. Samaa voi soveltaa yleisemminkin integraalien laskentaan. Integroidaan f välillä [a,b] jos 0<f<c Jos x on Tas(a,b) ja y on Tas(0,c) jakautunut, määrätään (kokeellisesti) tn p, jolla y< f(x). Integraali on p(b-a)c.
Monte Carlo -integrointi Kokeellinen arvo integraalille on sitä tarkempi, mitä useampi koetoisto tehdään. Luottamusväli tarkentuu suhteessa N^(1/2):een. Hyötysuhde on huono yksiulotteisille integraaleille Luottamusvälin pituus ja käyttäytyminen ei riipu integraalin dimensiosta (vaan vain osumistodennäköisyydestä p) Tehokas tapa saada karkeita likiarvoja moniulotteisille integraaleille.
Monte Carlo Edellinen Monte Carlo ei suoraan sovellu kaikkiin tapauksiin Rajoittamaton funktio tai väli Mahdollista luopua y muuttujasta Lasketaan vain E(f(x)) Halvempi, mutta varianssianalyysi vaikeampaa Korvataan tasainen yläraja Etsitään tn tiheysfunktio g s.e. f(x)< cg(x) Arvotaan x:t g-jakaumasta Tavoitteena osumis tn ~ 1
Monte Carlo sovelluksia Tyypillinen Monte Carlo sovellus on (erittäin) moniulotteinen integraali, joka syntyy kun mallitetaan säteilyn etenemistä materiaalissa. Jokainen törmäys mallittuu moniulotteisella integraalilla (heijastus ja absorptiotodennäköisyydet, tulokulman, energian jne funktioina, partikkelien muodot, pintaominaisuudet, sironta väliaineessa jne) Yksittäisen säteen simuloinnin kannalta monimutkaisuus kasvaa vain lineaarisesti.
M C Esimerkki Tarkastellaan lasersäteen sirontaa partikkelikerroksesta Jukka Räbinän pro gradu 2005 Tavoitteena simuloida sirontakuvion tunnuslukuja Monte Carlo -menetelmällä
Koeasetelma
Simuloitava säteen etenemistä partikkelijoukossa Säteen seurantaa Partikkelien paikat ja sirontasuunnat satunnaisia Sironta
Simuloinnin tavoite Laskea (kamerassa näkyvän) sirontakuvion intensiteetti, painopiste tms Eli käytännössä integraali funktiosta, jossa esiintyy intensiteettijakauma
Lähetetään yhdensuuntaisia säteitä (normaalij. Intensiteetti) Kerätään kameraan sironnut osuus (alle 3%) Simulointikoe
Simuloinnin tuloksista M-C koe toteutettu kolmella eri tavalla Jokaisessa 100 miljoonan säteen simulointia Eroja sekä suoritusajoissa että tulosten luottamusväleissä Eroihin palataan kun varianssin hallinnan tekniikat on esitelty