Simulering
Introduktion
Exempel: Antag att någon kastar tärning
a) Vad är sannolikheten att på fyra kast få två sexor?b) Vad är sannolikheten att på 100 kast få mellan 10 och 15 sexor och där summan av de 50 första kasten är mellan 165 och 185?
a) P(”två sexor på fyra kast”) = 116.065
61
2
4 22
b) P(” ”) 13.0 Löses analytiskt
Simuleringsstudie
Kasta 100 kast många gånger och räkna antalet gånger då villkoret är uppfyllt.Skatta sannolikheten med relativa frekvensen, dvs
(antalet lyckade / totala antalet kast)
• Utnyttja dator• Bilda slumptal• Vad är ett slumptal?
Generering av likformigt fördelade slumptal
Hur kan vi bilda ett slumptal som ligger mellan noll och ett?
Slumptal - Pseudoslumptal
”Det går aldrig att konstruera riktiga slumptal”
Kongruensgeneratorer
mmod)bax(x n1n 1m,0xi
1,0mx
u ii
Diskreta stokastiska variabler - tabellmetoden
Kontinuerliga - Inversmetoden
0 1 2 3 4
)u(Fx i1
i
10
Slumptal - Pseudoslumptal
Kongruensgenerator utnyttjar rekursion
)mmod()bax(x n1n
1m,0xi
1,0mx
u ii
Där a,b,m och xn är heltal
x0 är startvärde vilket betyder att
Sätt som ger oss att 1m
1mu0 i
ui är nu ett pseudoslumptal från U(0,1)
Egenskaper
a) När ett xi återkommer upprepar sig följden periodiskt
Ex: )5mod(3x3x n1n
3x0x
4x2x3x0x
54
3210
1x1x1x 210
Periodlängden beror på startvärdet x0!
b) (Knuth 1991) Full periodlängd erhåller man om
1) b och m ej har någon annan gemensam faktor än 1.
2) (a-1) är en multipel av varje primtal som delar m
3) (a-1) är en multipel av 4 om m är det
Ex: a = 3, b = 7, m = 9
43210
n1n
x1x1x7x0x
)9mod(7x3x
Villkor 2 ej uppfyllt för full periodlängd!
Ex: a = 4, b = 7, m = 9
osv0x5x4x6x2x
1x3x8x7x0x
)9mod(7x4x
98765
43210
n1n
Alla villkor uppfyllda!
Ex: IBM:s generator
)12mod(x16807x 31n1n
Periodlängd 231-2 … eftersom 0x0x 10
Implementering av IBM:s generator
Antagligen vanligast med 32 bitars dator.
Problem med 16807 xn !
Krav på mer än 32 bitars ordlängd.
Recept! Gör enligt följande
17,12777316807
1231
• Sätt W = 127773 C = 231 - 1 - 16807• 127773 = 2836• Bilda
cWx
)Wmod(x16807x nn1n
Kommer alltid vara 231-1 heltalsdelen
• Om xn+1 < 0 sätt xn+1 + 231-1
• Låt un = xn / (231-1)
Generering av slumptal från andra fördelningar
Diskreta fördelningar
Bin(1,p) dvs
p1tsannolikhemed0
ptsannolikhemed1X
Teknik: Generera ett slumptal U från U(0,1)
sätt
p1,0Uom0
1,p1Uom1X
X=0 X=10 1-p 1
)pU(IntX
X är ett slumptal från Bin(1,p) eftersom
p1)p1,0U(P)0x(P
p)p1(1)1,p1U(P)1x(P
Bin(n,p).
Om Xi Bin(1,p), i=1,2,…,n samt oberoende så är
)p,n(BinXYn
i
Generera n st Bin(1,p) slumptal enligt ovan och sätt
n
1i in
i )pU(IntXY
så kommer Y vara ett slumptal från Bin(n,p).
Alternativ: Tabellmetoden
Ex: Generera slumptal från XBin(5,0.3)
P(X=0) = 0.17P(X=1) = 0.36P(X=2) = 0.31P(X=3) = 0.13P(X=4) = 0.03P(X=5) = 0.002
0.00 0.17 0.830.53X=0
X=4X=3X=2X=1
X=5
1.00
Generera ett slumptal från UU(0,1) och kontrollera vilket intervall dethamnade i.
Tillämpningar
Hur finner vi arean av sjön?
Använd millimeterpapper och räkna eller utnyttja planinometer.
Simulering: Slumpa ut N punkter i kvadraten K, dvs iid U(0,a)som x och y koordinater. Räkna antalet punkter som faller inom sjön, NS och uppskatta sjöarean med
AK • NS / N = AK •
Eftersom NS får vi att
E[ ] = E[NS/N] = N •PS / N = PS
V[ ] = N-2 V[NS] = N-2 N PS (1 - PS) = P(1-P)/N
SP̂
)P,N(Bin S
SP̂
SP̂
Och om vi utnyttjar CGS, (giltigt om NP(1-P) > 10 tex) kan vi konstruera konfidensintervall för vår skattning, dvs
AK •
En nackdel är dock att om man inte kan precisera konturen av sjön matematiskt är det lite svårt att implementera metoden på dator…
Integralskattning
En integral kan ganska lätt skattas mha simulering. Integralen kan uppfattas som arean mellan x-axeln och kurvan y = g(x).
Simulera U1, U2, …, UN pseudoslumptal och skatta integralenmed
SP̂ N)P̂1(P̂A SSK2/
)1,0(U
N
1i i )U(gN1
g
N
1
2i )g)U(g(
1N1
N1
gVar
Utnyttja CGS, och du kan göra konfidensintervall
gVarg 2/
Det fungerar eftersom E[g(U)] =
Tänk på att arean under kurvan är lika med medelhöjden på kurvan.
Variansen för skattningen blir då
1
0
U dx)x(gdx)x(f)x(g
0 1 2 3 4 5
x <- seq(0, 5, len = 100)
010
020
030
040
0
x^2
+ 3
* x
^3 +
3
Ex: Antag att vi vill bestämma integralen
5
0
32 dx)3x3x(
Det enklaste : ) är givetvis nu att integrera och bestämma den.
4167.525x34x3
3x
dx)3x3x(5
0
435
0
32
dx)x(f)x(g U
Men man skulle även kunna använda sig av den ovan nämnda tekniken, dvs att utnyttja simulering till att skatta integralen.
Eftersom vårt g(x) nu är lika med integralen ovan dvs
5
0
U32 dx)x(f)3x3x(
väljer vi f(x) så att 5
0
U dx)x(gdx)x(f)x(g)U(gE
Således, om vi väljer f(x) = 1/5 så är detta uppfyllt.
En simuleringskörning med 10000 U(0,5) ger
529.7g
541,5187.527.529gVarg 2/
5.7gD
Vi kan notera att sant värde är 525.4
Dock, en väldigt användbar teknik för komplicerade integraler.
Vilken sats bygger det här på?
Kontinuerliga fördelningar
Inversmetoden
Antag att vi vill generera slumptal från en fördelning med fördelningsfunktion F,vars invers F-1(U) är definierad på (0,1).
Sats: Om UU(0,1) så har den stokastiska variabeln X = F-1(U) fördelnings- funktionen F.
Man kan inse det på följande sätt
X = F-1(U) P(X≤x) = P( F-1(U) ≤x ) = P(U ≤F(x)) = F(x),
eftersom P(U ≤a) = a
Inversmetoden.
Om fördelningsfunktionen har en enkel invers kan vi utnyttja detta!Om X Exp(m) dvs X är exponentialfördelad med fördelningsfunktion
FX(x) = 1 - e -x / m, x≥0
Vi har
)1,0UUdäre1UU)X(F)U(FX x1
och om vi använder oss av inversmetoden, dvs lös ut X
)U1ln(mx
)u1ln(m/Xu1e m/X
Dvs generera ett slumptal U från U(0,1). Sätt in U i -m ln(1-U) = X.
X är vårt slumptal!
0 2 4 6 8
0.0
0.2
0.4
0.6
0.8
1.0
Exponential distribution function
Normalfördelningen låter sig å andra sidan inte inverteras så enkelt.
Det finns snabbvarianter… trots det.
Utnyttja CGS
Bilda
12
1i iU
Enligt CGS är nu
)1,0(N~12/12
6U12
1i i
Ger dock ”bara” normalfördelade slumptal mellan (-6,6).
Vad är 1-P(-6<X<6)?
2 9.886 10-10, dvs ungefär 2 10-9.
Mer komplicerad variant
Lite teori: Låt N1 och N2 vara oberoende N(0,1).Paret(N1,N2) definierar en punkt i två dimensionerTransformationen från kartesiska koordinater till polära koordinaterges av
N1 = R cos N2 = R sin
och transformationen är 1-1.
Alla partiella derivator är kontinuerliga vilket betyder att vi kan skrivasimultana täthetsfunktionen som
1,R21N,N J),r(f)n,n(f
21
Så man kan plocka fram simultana fördelningsfunktionen för R och
rcosrsin
sinrcosn
rn
nrn
J22
11
1
)nn(
21
exp2r
),r(f 22
2,R 1
Så…
2r
exp2r 2
r0,20
Vi ser att R och är oberoende sv med
)2,0(Udvs,2/1)(f
)2(ExpRdvs],2/rexp[r)r(f 22R
Ok, nu till metoden (Box-Muller)
))2(()2(Exp)NN(Rdär 222
21
2
)U2sin()Ulog2(N
)U2cos()Ulog2(N
22/1
1e2
22/1
1e1
Ger oss två oberoende normalfördelade slumptal
Ok. Visa nu detta! Obs jag skämtar…
Polar Marsaglia metoden bygger på samma idé men hoppar överAnvändandet av trigonometriska funktioner (cosinus och sinus).
Algoritm:1. Generera U1 och U2 från U(0,1) och bilda
2. Sätt R = V12 + V2
2 Om R > 1 gå tillbaka till 1.
3. Sätt
1U2V
)1,1(U1U2V
22
11
2/1
22
2/1
11
RRln2
VN
RRln2
VN
N1 och N2 är två oberoende slumptal från N(0,1)
Test av slumptalsgeneratorer
Pokertest
Betrakta en följd U1, U2, …, U5k, där varje Ui är ett slumptal som är likformigt fördelat på 0, 1, 2, …, 9.
Dela upp följden i k st 5-tupler (U1, U2,…, U5), (U6, …, U10),…,(U5k-4, …, U5k)
Bland dessa k st 5-tupler, räkna antalet av typen
Alla olika: a b c d e x1 P1 = P(alla olika)ett par: a a b c d x2 P2
två par: a a b b c x3 P3
triss: a a a b c x4 osvkåk: a a a b b x5
fyrtal: a a a a b x6
femtal: a a a a a x7
Typ Antal Sannolikhet
Formulera nu en hypotes som man brukar kalla för Nollhypotes H0
H0: Slumptalsgeneratorn genererar likformigt fördelade slumptal mellan 0 och 1 ( U(0,1)).
För att nu testa H0 används ett sk ”Chi-två test”, 2 -test.
2 -test metoden.
Antag att n ( i vårt fall n = 5k ) stycken oberoende försök har utförts.
Varje försök kan resultera i r st olika utfall; A1,A2,…,Ar med sannolikheterp1,p2, …,pr.
Låt x1,x2, …,xr vara de observerade antalet utfall på A1,A2,…,Ar.
P1,p2, …,pr antas vara okända och man vill testa en viss hypotes rörandedessa sannolikheter, dvs
H0: p1 = p1*, p2 = p2
*, …, pr = pr*
Konstruera en sk testvariabel
r
1i
2
värdeförväntatvärdeförväntatvärdeobserverat
Q
r
1i*i
2*ii
np
npx
Här är n antalet olika utfall som vi kan konstruera, dvs antalet 5-tupler i föregående exempel.
För att nu avgöra om vår generator ger bra ”slumptal” jämför vi vår
testvariabel med ett tabellvärde från 2 -fördelningen
x <- seq(0.05, 20, len = 299)
dch
isq
(x,
6)
0 5 10 15 20
0.0
0.0
20
.04
0.0
60
.08
0.1
00
.12
0.1
4
Man bestämmer då en gräns för när man inte tror att generatorn ger likformiga slumptal, dvs
förkasta H0 om där = signifikansnivån.)1r(Q 2
I pokertest testas H0 med
7
1i i
2ii
kpkpx
Arean =
Förkasta H0 om
)6(2
)6(Q 2
)6(2
= signifikansnivån, och den måste man välja själv. Det är vanligt med = 0.05, 0.01, 0.001.
Gap-test
Låt och vara två reella tal sådana att 10
Betrakta längden av delföljder Uj, Uj+1, …, Uj+r där Uj+r (, ) men därUj, Uj+1, …,Uj+r-1 (, ).
Ui pseudoslumptal från U(0,1)
Ex: =0.2, =0.5 Bestäm gaplängderna. Vi håller på tills vi fått n st gap
U1=0.023U2=0.354U3=0.462U4=0.791U5=0.553U6=0.304U7=0.212U8=0.893U9=0.491
1
0
2
0
1
Räkna hur många ”gap” man fått av längd 0,1,2, …., ≥ t
Sätt p = β – α (Sannolikhet att hamna i intervall (, ) )
Låt pj = P(”gap”-längden är j)
Då blir (geometrisk fördelad)pj = p (1-p)j
pt = P(”gap”-längden är t) = p(1-p)t + p(1-p)t+1 + … = = p(1-p)t (1+(1-p)+(1-p)2+ …) =
tt )p1()p1(1
1)p1(p
Testa med Q =
r
1i*i
2*ii
np
npx)1r(Q 2
Och jämför om
Man bör se till att n, t, och p är sådana att npi > 5 för alla ”gap” storlekar.
Typiskt fall för Gap-testet är = 0, β = 0.1
Många dåliga generatorer ger alldeles för många gap med ”för kort” längd
Allmänt gäller vid dessa 2-test att npi > 5.
Permutationstest
Betrakta en talföljd U1, U2, …, där Ui är slumptal från U(0,1)
Dela in talföljden i t-tupler (U1, …,Ut), (Ut+1, …,U2t), …
Map storleksföljden kan varje t-tupel vara ordnad på t! sätt.
Ex: t = 3, t! = 3! = 6
U1 < U2 < U3 U1 < U3 < U2 U2 < U1 < U3
U2 < U3 < U1 U3 < U1 < U2 U3 < U2 < U1
Varje ordningsföljd har sannolikhet 1/t! (1/6) att erhållas.
Bilda n st t-tupler och dela in i t! klasser.
Testa med 2-test!