Documente Academic
Documente Profesional
Documente Cultură
27 octombrie 2020
1
4. ’shuffle’: analog instrucţiunii C + + srand (time (N U LL)), se iniţializează parametrii
metodei congruenţiale liniare pornind de la timpul curent (ceasul computerului). Acesta
va fi ales ı̂n aplicaţii.
5. structure: se iniţializează generatorul bazat pe cele trei câmpuri ale unei structuri —
Type, Seed şi State.
Propoziţia 1 (Lema lui Hincin) Dacă X este variabilă aleatoare cu funcţia de repartiţie F ,
atunci variabila aleatoare Y = F (X) este uniformă pe intervalul [0, 1].
Prin urmare, dacă ştim formula analitică pentru F −1 , o variabilă aleatoare X cu funcţia de
repartiţie F se generează astfel: se generează U uniform pe [0, 1], pentru ca apoi să calculăm
X = F −1 (U ).
În cazul variabilelor aleatoare discrete, X este valoarea cea mai mare astfel ı̂ncât suma
probabilităţilor până la valoarea respectivă să nu depăşească U .
Programul Mathcad pentru metoda inversei ı̂n cazul variabilei uniforme discrete este următorul
function X=gendiscr(n)
rng(’shuffle’);
U=rand;
S=1/n;
X=1;
while S<U
X=X+1;
S=S+1/n;
end
end
2
Apelul ı̂n Mathcad este
U := gendiscr (n),
iar ı̂n Matlab
U = gendiscr (n).
Pentru variabila X ∼ Bin (n, p), programul Mathcad este
function X=generbin(n,p)
rng(’shuffle’);
U=rand;
X=0;
pk=1;
for j=1:n
pk=pk*(1-p);
end
S=pk;
while S<U
X=X+1;
pk=pk*p*(n-X+1)/(1-p)/X;
S=S+pk;
end
end
3
genergeom (ro) := seed ← 23
U ← rnd (1)
X←0
pk ← 1 − ro
S ← 1 − ro
while S < U
X ←X +1
pk ← pk · ro
S ← S + pk
return X
function X=genergeom(ro)
rng(’shuffle’);
U=rand;
X=0;
pk=1-ro;
S=1-ro;
while S<U
X=X+1;
pk=pk*ro;
S=S+pk;
end
end
function X=generpo(lambda)
rng(’shuffle’);
U=rand;
X=0;
pk=1/exp(lambda);
4
S=pk;
while S<U
X=X+1;
pk=pk*lambda/X;
S=S+pk;
end
end
În cazul variabilei uniforme discrete, se ţine cont că dacă U ∈ [0, 1], atunci n·U ∈ [0, n]. Deci
variabila uniform discretă este X = dn · U e (partea ı̂ntreagă superioară a lui n · U ). Programul
Mathcad este următorul.
generdiscr1 (n) := seed ← 23
U ← rnd (1)
X ← ceil (n · U )
return X
function X=gendiscr1(n)
rng(’shuffle’);
U=rand;
X=ceil(n*U);
end
În cazul repartiţiei geometrice, se ţine cont ı̂n primul rând că dacă U este uniformă pe
[0, 1], atunci 1 − U este de asemenea uniformă pe [0, 1]. Rezultă că, ı̂n urma simulării variabilei
uniforme 1 − U avem două posibilităţi:
În al doilea caz de mai sus, rezultă că variabila geometrică este X = b lnlnUρ c − 1 (partea
ı̂ntreagă inferioară minus unu). Aplicând aceeaşi formulă şi ı̂n cazul ρ < U rezultă că valoarea
X obţinută este strict negativă, ceea ce e imposibil. Deci trebuie să considerăm ı̂n acest caz
X = 0. Programul Mathcad este următorul.
5
function X=genergeom1(ro)
rng(’shuffle’);
U=rand;
X=floor(log(U)/log(ro))-1;
if X<0
X=0;
end
end
Pentru variabile aleatoare continue, se scrie ı̂ntâi ı̂nainte de programul Mathcad expre-
sia analitică a inversei funcţiei de repartiţie, depinzând de U şi de lista de parametri. Dacă
repartiţia depinde de un singur parametru, programul Mathcad este următorul.
În versiunea Matlab, funcţia F inv (U, teta) se defineşte ulterior funcţiei care generează o
variabilă aleatoare. În exemplul de mai sus, scriem ı̂ntâi
function X=genercont(teta)
rng(’shuffle’);
U=rand;
X=Finv(U,teta);
end
ln (U )
F inv (U, teta) := −
teta
În Matlab, scriem la sfârşit
function Y=Finv(U,teta)
Y=-log(U)/teta;
end
6
Deci scriem, analog
1
F inv (U, teta) := (− ln (U )) ν ,
deci scriem
1
F inv (U, teta1, teta2) := teta2 · tan π · U − + teta1
2
şi versiunea Matlab se scrie analog cazului exp (λ), dar intervin doi parametri.
Există de asemenea repartiţii ce depind de trei parametri. Acestea provin din practică, aşa
cum repartiţia Pareto se utilizează ı̂n hidrologie, pentru debitele şi volumele râurilor. În acest
caz avem
h i 1 −1
1 a(x−c) a
f (x, a, b, c) = b 1 − b
h i1 , (5)
a(X−c) a
F (X, a, b, c) = 1 − 1 − b =1−U
−1
F (U, a, b, c) = c + ab (1 − U a )
deci scriem
teta2 · (1 − U teta1 )
F inv (U, teta1, teta2, teta3) := teta3 +
teta1
şi versiunea Matlab se scrie analog cazurilor anterioare, dar intervin trei parametri.
O altă metodă generală de simulare este metoda amestecului. Se presupun cunoscute metode
de simulare pentru două variabile aleatoare: Y şi X |Y . Se aplică formulei probabilităţii totale,
care se scrie
∞
X
P (X = i) = P (X = i |Y = j ) · P (Y = j), (6)
j=0
7
dacă X |Y este discretă şi Y este continuă cu densitatea de repartiţie g
∞
X
f (x) = f (x |Y = j ) · P (Y = j), (6”)
j=0
8
function X=genhip(n,vlambda,vp)
rng(’shuffle’);
lambda=gensimpla(n,vlambda,vp);
X=genexp(lambda);
end
function X=gensimpla(n,vx,vp)
rng(’shuffle’);
U=rand;
k=1;
S=vp(1);
while S<U
k=k+1;
S=S+vp(k);
end;
X=vx(k);
end
În final se scriu ı̂n ordine funcţia de simulare a unei variabile exp (λ), genexp (lambda) prin
metoda inversei, şi funcţia F inv (U, teta) din cazul exponenţialei.
Tot prin metoda compunerii, folosind generarea exponenţialei se simulează variabila Laplace,
care are următoarea densitate de repartiţie:
λ −λ|x|
f (x) = ·e , x ∈ R. (8)
2
Se simulează o variabilă aleatoare exponenţială şi semnul aleator, conform programului
următor.
function X=genlapl(lambda)
rng(’shuffle’);
U=rand;
X=genexp(lambda);
if U>0.5
X=-X;
end
end
9
Precizăm că genexp (lambda) se defineşte, ca de obicei, ı̂nainte de genlapl (lambda), şi ı̂n
Matlab după.
O altă metodă generală de simulare este metoda respingerii. Prima metodă de respingere
este bazată pe teorema ı̂nfăşurătorii, după cum urmează. Presupunem că dorim să simulăm
variabila aleatoare X cu densitatea de repartiţie f , şi se cunoaşte o metodă de generare a
unei variabile aleatoare Y , având acelaşi suport (acelaşi domeniu ı̂n care cele două densităţi de
repartiţie au valori nenule — deci nu putem face pereche de exemplu Gama de suport [0, ∞) şi
normala de suport R). Presupunem de asemenea că există α > 1 astfel ı̂ncât fg(x) (x)
< α pentru
orice x din suport.
f (Y )
Metoda constă ı̂n generarea succesivă de perechi (Y, U ) până când α·g(Y )
≥ U . Valoarea
1
lui α se interpretează ca probabilitatea ca perechea (Y, U ) să nu fie respinsă (probabilitatea de
acceptare), iar raportul fg(Y
(Y )
)
este privit, dacă are valoare subunitară, ca probabilitatea ca Y să
aibă repartiţia dorită, condiţionată de faptul că perechea (Y, U ) a fost acceptată. Înmulţind
deci cu probabilitatea de acceptare, α1 , obţinem probabilitatea ca Y să fie acceptat ca având
f (Y )
repartiţia căutată, şi anume cu densitatea de repartiţie f . Această valoare este chiar α·g(Y )
de mai sus, şi trebuie să fie suficient de mare pentru ca metoda să fie corectă. Alegerea
ca această valoare să fie mai mare sau egală cu U trebuie privită prin analogie cu aplicarea
metodei inverse ı̂n cazul repartiţiilor discrete, când se alege ı̂n fiecare caz prima valoare pentru
care suma probabilităţilor este mai mare sau egală cu valoarea uniformă U generată iniţial.
Evident, raportul poate fi şi supraunitar, dar ı̂nmulţit cu α1 este tot subunitar, ţinând cont că
α a fost ales astfel ı̂ncât să fie mai mare sau egal cu acest raport. Dacă notăm cu ρ = 1 − α1
probabilitatea de respingere, rezultă că numărul de respingeri este N ∼ Geom (ρ).
Un exemplu de aplicare a primei metode de respingere este cazul repartiţiei Γ (a, 1) cu a < 1.
Considerăm Y ∼ W eib (a), adică repartiţia Weibul prezentată anterior. Prin calcule rezultă
a
f (x) ex −x
= . (9)
g (x) Γ (a + 1)
1
Prin derivare, maximul exponentului se obţine pentru x0 = a 1−a , deci
a
1−a
ea (1−a)
α= . (9’)
Γ (a + 1)
Deoarece Γ (a + 1) apare la numitor atât ı̂n (9) cât şi ı̂n (90 ), se poate considera α =
a
a
e , şi fg(x)
a 1−a (1−a) (x)
se ı̂nlocuieşte cu ex −x . Evident, α1 ı̂şi pierde interpretarea de probabilitate.
Programul Mathcad este următorul.
10
gengama1 (a) := seed ← 23
a
alf a ← ea ·(1−a)
1−a
r ← −1
U ←1
while r < U
U ← rnd (1)
Y ← genweib (a)
Y a −Y
r ← e alf a
X←Y
return X
function X=gengama1(a)
rng(’shuffle’);
alfa=exp(a^(a/(1-a))*(1-a));
r=-1;
U=1;
while r<U
U=rand;
Y=genweib(a);
r=exp(Y^a-Y)/alfa;
end
X=Y;
end
function X=genweib(a)
rng(’shuffle’);
U=rand;
X=(-log(U))^(1/a);
end
11
unde deducem că pentru variabila aleatoare φ (Y ) avem P (φ (Y ) ≤ a) = P (Y ≤ φ−1 (a)) =
Q (φ−1 (a)). Deci problema se reduce de la Y şi Z la φ (Y ) şi Z. Dacă φ este descrescătoare, se
ţine cont că dacă U este uniformă pe [0, 1], atunci 1 − U este uniformă pe [0, 1] (analog cazurilor
simulării variabilelor aleatoare exponenţiale şi Weibul prin metoda inversei).
De exemplu generăm variabila aleatoare cu densitate de repartiţie
cu c = λ+µλ
.
În Mathcad se defineşte ı̂ntâi funcţia genexp (lambda), care generează X ∼ exp (λ), apoi
repartiţia dublu exponenţială, după cum urmează.
function X=genexpd(lambda,miu)
rng(’shuffle’);
Y=0;
Z=1;
while Y<Z
Y=genexp(miu);
Z=genexp(lambda);
end
X=Y;
end
12
e1−x , pentru x ≥ 1
r (x) = . (12’)
0 in rest
1
Programul Mathcad este următorul, pentru b = − 1−a .
function X=gengamatrst(b)
rng(’shuffle’);
Y=1;
Z=0;
while Y>Z
U=rand;
V=rand;
Y=1-log(V);
Z=U^b;
end
end
unde G este funcţia de repartiţie a unei variabile aleatoare continue, şi g0 este densitatea de
repartiţie a unei variabile aleatoare continue (posibil aceeaşi, posibil diferită). Din lim F (x) =
x→∞
1, rezultă
Z∞
pa = e−G(x) · g0 (x)dx. (13’)
−∞
13
2. Dacă Z0 < Z1 ne oprim considerând k = 1. Altfel generăm ı̂n continuare Zi cu funcţia
de repartiţie G, adică până când Z0 ≥ Z1 ≥ ... ≥ Zk−1 < Zk .
Interpretarea acestei metode este legată de repartiţiile Poisson şi exponenţială. Vom vedea
ı̂n secţiunile următoare că aceste repartiţii sunt legate. Condiţia de a ne opri când k este
impar rezultă din monotonia probabilităţilor pentru repartiţia Poisson (iniţial crescătoare, apoi
descrescătoare), şi din faptul că se poate demonstra că
(G (x))k−1
P (x ≥ Z1 ≥ ... ≥ Zk−1 ) = . (14)
(k − 1)!
Tocmai de aici rezultă legătura cu repartiţia Poisson, şi k par conduce la ambiguitatea
existenţei a două numere cel mai probabile. Se demonstrează prin calcul că pa din (13) şi (130 )
este de fapt probabilitatea de a ne opri (probabilitatea de acceptare).
Prezentăm ı̂n continuare cazul ı̂n care Z0 şi Zi , i > 0 sunt uniforme pe [0, 1]. Rezultă,
aplicând (13)
0, daca x < 0
1−e−x
F (x) = , daca 0 ≤ x ≤ 1 . (15)
1−e−1
1, daca x > 1
Deci repartiţia este exp (1) trunchiată la dreapta ı̂n 1. Programul Mathcad este următorul.
function X=genexptrunc()
rng(’shuffle’);
k=0;
while mod(k,2)==0
k=1;
14
Z0=rand;
Zcrt=Z0;
Z=rand;
while Z<=Zcrt
k=k+1;
Zcrt=Z;
Z=rand;
end
X=Z0;
end
function X=gengamatrdr(a)
rng(’shuffle’);
k=0;
while mod(k,2)==0
k=1;
U=rand;
Z0=U^a;
15
Zcrt=Z0;
Z=rand;
while Z<=Zcrt
k=k+1;
Zcrt=Z;
Z=rand;
end
X=Z0;
end
function X=gengamacr(a)
rng(’shuffle’);
U=rand;
if U<=gammainc(1,a)
X=gengamatrdr(1/a);
else
X=gengamatrst(-1/(1-a));
end
end
16