Sunteți pe pagina 1din 12

Lucrarea de laborator 5

Generarea variabilelor aleatoare prin metoda respingerii

Obiective

 Familiarizarea cu principiul metodei respingerii

 Aplicarea metodei respingerii pentru generarea variabilelor


aleatoare gaussiene (metoda polară, metoda înfăşurătoarei)

Enunţul şi scopul lucrării


Aplicaţia 5.1.
Să se genereze câte n realizări pentru două variabile aleatoare 𝑋1 şi 𝑋2
independente şi repartizate 𝑁(0,1). Utilizaţi metoda polară (vezi Figura 5.1).

Aplicaţia 5.2.
Să se utilizeze metoda înfăşurătoarei (vezi Figura 5.6) pentru a genera n
realizări ale unei variabile aleatoare 𝑋~𝑁(0,1).

Suport teoretic

 Metoda respingerii
Metoda respingerii, cunoscută în literatura de specialitate şi ca metoda
acceptării şi respingerii, se referă la o serie întreagă de algoritmi care au în
comun faptul că variabilele care provin dintr-o anumită repartiţie dorită sunt
generate doar după un număr de iteraţii. După fiecare iteraţie în care se
generează valori aleatoare după procedee cunoscute, se testează dacă acestea
verifică o anumită condiţie: dacă acea condiţie este îndeplinită, algoritmul se
opreşte şi se “acceptă” rezultatul furnizat, iar în caz contrar valorile generate
se “resping” şi se reiau iteraţiile. Evident numărul de iteraţii fiind aleator, este
de dorit ca un astfel de algoritm să aibă în medie un număr de respingeri mic.
Din mulţimea de algoritmi care funcţionează după principiul metodei
respingerii, foarte importanţi sunt algoritmii care generează variabile

45
Modele de simulare. Îndrumar de laborator

aleatoare gaussiene (repartizate normal). Doi dintre ei, Metoda polară şi o


aplicaţie a unei metode de respingere mai generale numită Metoda
înfăşurătoarei vor fi prezentaţi în continuare.

Metoda polară
Algoritmul metodei polare este prezentat în Figura 5.1 [8].
Repetă
generează 𝑈1 ~𝑈(0,1)
generează 𝑈2 ~𝑈(0,1)
𝑉1 = 2𝑈1 − 1
𝑉2 = 2𝑈2 − 1
𝑆 = 𝑉1 2 + 𝑉2 2
Până când 𝑆 < 1
−2ln(𝑆) −2ln(𝑆)
𝑋1 = 𝑉1 √ , 𝑋2 = 𝑉2 √
𝑆 𝑆
Stop
Figura 5.1. Algoritmul metodei polare

Observaţie. Interpretarea geometrică a algoritmului este următoarea.


Deoarece 𝑈1 ~𝑈(0,1) şi 𝑈2 ~𝑈(0,1) rezultă că 𝑉1 ~𝑈(−1,1) şi 𝑉2 ~𝑈(−1,1).
Fie 𝛤 punctul de coordonate (𝑉1 , 𝑉2 ) reprezentat într-un sistem de coordonate
cartezian (vezi Figura 5.2). Geometric, putem spune că punctul 𝛤 este
generat uniform aleator pe pătratul care are vârfurile în punctele de
coordonate (−1, −1), (1, −1), (1,1), (−1,1). Se generează punctele 𝛤(𝑉1 , 𝑉2 )
până când 𝑆 < 1, adică până când punctul 𝛤 “cade” în interiorul cercului
unitate (cercul de rază 1 cu centrul în originea sistemului cartezian). Se
demonstrează că 𝑋1 şi 𝑋2 sunt independente şi repartizate 𝑁(0,1). Metoda se
numeşte polară pentru că, în cadrul demonstraţiei, coordonatele carteziene ale
punctului 𝛤 sunt transformate în coordonate polare.

1 respins

𝛤(𝑉1 , 𝑉2 )

-1 0 1
𝛤(𝑉1 , 𝑉2 )
acceptat

-1
Figura 5.2. Ilustrarea grafică a metodei polare

46
Lucrarea de laborator 5

Metoda înfăşurătoarei
Să presupunem că vrem să generăm o variabilă aleatoare 𝑋 de densitate
cunoscută 𝑝(𝑥) , adică 𝑋~𝑝(𝑥) . Presupunem de asemenea că există o
densitate de repartiţie 𝑔(𝑥) definită pe acelaşi domeniu 𝐷 ca şi 𝑝(𝑥), care
satisface următoarele două condiţii:
1. Există un algoritm eficient de generare a variabilei 𝑌~𝑔(𝑥);
2. Există un număr real 𝑐 > 0 astfel încât 𝑝(𝑥) ≤ 𝑐𝑔(𝑥) , adică 𝑝(𝑥) este
“înfăşurată” de 𝑔(𝑥).
În aceste condiţii, algoritmul din Figura 5.3 generează 𝑋~𝑝(𝑥) [11].

Repetă
generează 𝑌~𝑔(𝑥)
generează u~𝑈(0,1)
𝑝(𝑥)
Până când 𝑢 <
𝑐𝑔(𝑥)
𝑋←𝑌
Stop
Figura 5.3. Algoritmul metodei înfăşurătoarei - varianta generală
O variantă simplificată, dar mai puţin eficientă a metodei înfăşurătoarei este
următoarea. Considerăm că există 𝑀 număr real pozitiv astfel încât
𝑀 = max𝑥∈𝐷 𝑝(𝑥). Dacă domeniul de definiţie 𝐷 este intervalul [𝑎, 𝑏], unde
𝑎 < 𝑏, atunci algoritmul de generare este cel din Figura 5.4.

Repetă
generează 𝜂1 ~𝑈(𝑎, 𝑏)
generează 𝜂2 ~𝑈(0, 𝑀)
Până când 𝜂1 < 𝑝(𝜂2 )
𝑋 ← 𝜂1
Stop
Figura 5.4. Algoritmul metodei înfăşurătoarei- varianta simplificată

Interpretarea geometrică a algoritmului (vezi Figura 5.5) este următoarea.


Deoarece 𝜂1 ~𝑈(𝑎, 𝑏) şi 𝜂2 ~𝑈(0, 𝑀) rezultă că punctul 𝛤 (𝜂1 , 𝜂2 ) este
Stop
generat aleator pe dreptunghiul care are vârfurile în punctele de coordonate
(𝑎, 0) , (𝑏, 0) , (𝑏, 𝑀) , (𝑎, 𝑀 ). Execuţia algoritmului se opreşte când
coordonatele 𝜂1 şi 𝜂2 ale punctului aleator 𝛤 satisfac condiţia
𝜂2 < 𝑝(𝜂1 ), adică atunci când punctul 𝛤(𝜂1 , 𝜂2 ) este sub graficul densităţii
repartiţiei 𝑝(𝑥).

47
Modele de simulare. Îndrumar de laborator

respins

y=p(x)
𝛤(𝜂1 , 𝜂2 )

acceptat

0 a X b

Figura 5.5. Ilustrarea grafică a metodei înfăşurătoarei


(varianta simplificată)

Algoritm de generare a unei variabile repartizate 𝑁(0,1)

Algoritmul din Figura 5.6 este o aplicaţie a metodei înfăşurătoarei şi


furnizează valoarea unei variabile aleatoare 𝑁(0,1) [11].

Repetă
generează 𝜏~𝑈(0,1)
𝑌 ← −ln(𝜏)
generează 𝑢~𝑈(0,1)
𝑌2 1
𝑌− −
Până când 𝑢 < 𝑒 2 2

generează 𝜂~𝑈(0,1)
𝑠 ← −1
1
Dacă 𝜂 ≥ atunci
2
𝑠←1
𝑋 ← 𝑠𝑌
Stop
Figura 5.6. Algoritmul pentru generarea unei variabile 𝑁(0,1)

Observaţii
 Se observă uşor că densitatea de repartiţie 𝑁(0,1) notată 𝑝(𝑥) se poate
scrie ca o amestecare aleatoare de două densităţi de repartiţie 𝑝1 (𝑥) şi
𝑝2 (𝑥). Mai precis, avem:
1 1
𝑝(𝑥) = 𝑝1 (𝑥) + 𝑝2 (𝑥) , (5.1)
2 2
Stop
unde:

48
Stop
Lucrarea de laborator 5

2 𝑥2

√ 𝑒 2 , 𝑑𝑎𝑐ă 𝑥 > 0
𝑝1 (𝑥) = { 𝜋 (5.2)
0, 𝑑𝑎𝑐ă 𝑥 ≤ 0

0, 𝑑𝑎𝑐ă 𝑥 > 0
𝑝2 (𝑥) = { 2 − 𝑥2 (5.3)
√ 𝑒 2 , 𝑑𝑎𝑐ă 𝑥 ≤ 0
𝜋

Din acest motiv, este suficient să găsim o înfăşurătoare pentru 𝑝1 (𝑥), cu


𝑥 > 0;
 Înfăşurătoarea găsită este densitatea de repartiţie exponenţială negativă,
pentru x  0 şi parametrul   1 ;
 O dată generată o variabilă aleatoare 𝑌~𝑝1 (𝑥) , variabila 𝑋~𝑁(0,1) se
obţine (datorită simetriei densităţii normale reduse faţă de axa 𝑂𝑦) cu
relaţia 𝑋 = 𝑠𝑌 , unde 𝑠 este un semn aleator, adică o variabilă
bernoulliană cu legea de probabilitate

−1 1
𝑠=( 1 1) (5.4)
2 2

 Repartiţia normală 𝐍(𝐦, 𝛔𝟐 )

( x  m) 2
1 
- Funcţia densitate de repartiţie: f ( x) 
2 2
e (5.5)
 2
- Media: M ( X )  m (5.6)

- Dispersia: D 2 ( X )   2 (5.7)

 Repartiţia exponenţială negativă de parametru λ


e  x , x  [0, ),   0
- Funcţia densitate de repartiţie: f ( x)   (5.8)
0, x  0
1  e  x , x  0
- Funcţia de repartiţie: F ( x)  P( X  x)   (5.9)
0, x  0
1
- Media: M ( X )  (5.10)

1
- Dispersia: D 2 ( X )  (5.11)
2

49
Modele de simulare. Îndrumar de laborator

Funcţii şi resurse C# utilizate


 controale folosite în interfaţa grafică a aplicaţiei: label, textBox,
button, chart (cu proprietăţile şi metodele aferente);
 Random r=new Random() - un obiect din clasa Random, declarat şi
instanţiat;
 r.NextDouble() - metodă a clasei Random pentru generarea unei
variabile aleatoare repartizată 𝑈(0,1);
 Math.Sqrt(),Math.Log(), Math.Exp()– funcţii din clasa
Math;
 Secvenţe de tip try-catch pentru tratarea excepţiilor.

Modul de lucru
Aplicaţia 5.1.

Se va implementa algoritmul metodei polare descris în pseudocod în Figura 5.1,


precum şi reprezentarea grafică ilustrată în Figura 5.2 din secţiunea Suport
teoretic. Se vor parcurge următorii paşi:
1. Construirea interfeţei grafice a aplicaţiei (Figura 5.7):

button1
label1 textBox1
textBox2

button2
chart1

Figura 5.7. Interfaţa grafică a Aplicaţiei 5.1.

- se setează proprietăţile formei Form1 (titlu, culoare, dimensiune etc.);


- se adaugă pe formă următoarele controale:

50
Lucrarea de laborator 5

o label1 – pentru etichetarea datei de intrare n (numărul de valori


generate pentru fiecare variabilă 𝑋1 , 𝑋2 ~𝑁(0,1));
o textBox1 – pentru introducerea valorii lui n;
o button1 – buton pentru desenarea cercului unitate (cercul de rază 1
cu centrul în originea sistemului cartezian);
o button2 – buton pentru generarea variabilelor 𝑋1 , 𝑋2 ~𝑁(0,1);
o textBox2 – pentru afişarea valorilor generate (cu proprietatea
Multiline activată);
o chart1 – componentă de tip grafic, pentru desenarea cercului unitate;
se vor seta următoarele proprietăţi:
- fără legendă (Legends -> Remove);
- proprietăţile axelor (pentru ambele axe Ox şi Oy):
ChartArea -> Axes:
- Scale: Minimun=-1, Maximum=1;
- MajorGrid: Interval=1;
- MajorTickMark: Interval=0.5;
- Interval: Interval=0.5;
- se adaugă trei serii de puncte: două serii pentru reprezentarea
cercului unitate (serii de tip Line, de aceeaşi culoare) şi o
serie pentru punctele generate (de tip Point).
2. Se defineşte funcţia asociată butonului button1, la evenimentul Click:

private void button1_Click(object sender, EventArgs e)


{
chart1.Series[0].Points.Clear();
chart1.Series[1].Points.Clear();
for (double t = -1; t <= 1; t += 0.001)
{
chart1.Series[0].Points.AddXY(t, Math.Sqrt(1 - t * t));
chart1.Series[1].Points.AddXY(t, -Math.Sqrt(1 - t * t));
}
}

3. Se defineşte funcţia asociată butonului button2, la evenimentul Click:

private void button2_Click(object sender, EventArgs e)


{
double U1,U2,V1,V2,X1,X2,S;
int n, i, j;
Random r = new Random();
n = Convert.ToInt32(textBox1.Text);
chart1.Series[2].Points.Clear();
textBox2.Clear();

51
Modele de simulare. Îndrumar de laborator

j = 0;
for (i = 0; i < n; i++)
{
do
{
U1 = r.NextDouble();
U2 = r.NextDouble();
V1 = 2 * U1 - 1;
V2 = 2 * U2 - 1;
S = V1 * V1 + V2 * V2;
chart1.Series[2].Points.AddXY(V1, V2);
if (S>1)
{
chart1.Series[2].Points[j].Color = Color.Red;
chart1.Series[2].Points[j].MarkerStyle =
System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Star5;
}
else chart1.Series[2].Points[j].Color = Color.Green;
j++;
}
while (S>1);
X1 = V1 * Math.Sqrt(-2 * Math.Log(S) / S);
X2 = V2 * Math.Sqrt(-2 * Math.Log(S) / S);
textBox2.AppendText("\r\nExperimentul " + (i+1).ToString() + ": ");
textBox2.AppendText("\r\nX1 = " + X1.ToString());
textBox2.AppendText("\r\nX2 = " + X2.ToString());
textBox2.AppendText("\r\n=======================");
}
}

Observaţii
- Pentru desenarea cercului unitate (de ecuaţie 𝑥 2 + 𝑦 2 = 1 ), s-au
reprezentat grafic semicercurile formate din totalitatea punctelor de
coordonate (𝑡, √1 − 𝑡 2 ) , respectiv (𝑡, −√1 − 𝑡 2 ) , unde t parcurge
intervalul [−1, 1] cu un pas foarte mic;
- Pentru a genera câte n valori pentru variabilele 𝑋1 , 𝑋2 ~𝑁(0,1), se repetă de
n ori algoritmul metodei polare (iteraţia în care se generează puncte
uniform aleatoare pe pătrat, până când un punct “cade” în interiorul
cercului);
- În grafic s-au reprezentat toate punctele generate: cele respinse cu steluţe
de culoare roşie, cele acceptate cu pătrăţele de culoare verde;
- Cele n valori generate pentru fiecare variabilă 𝑋1 , 𝑋2 ~𝑁(0,1) nu au rămas
memorate în totalitatea lor, singurul scop momentan fiind afişarea şi
vizualizarea lor. O eventuală utilizare ulterioară a valorilor generate ar fi
necesitat memorarea acestora în variabile de tip vector.

52
Lucrarea de laborator 5

În Figura 5.8 este ilustrat cazul generării a câte 20 de valori pentru


variabilele 𝑋1 , 𝑋2 ~𝑁(0,1) (în caseta de rezultate sunt vizibile doar ultimele 5
perechi de valori, având posibilitatea derulării casetei până la vizualizarea
primelor valori generate). În grafic, se poate observa că în procesul iterativ de
generare, dintre punctele generate uniform aleator pe pătrat, au fost respinse 7
puncte şi au fost acceptate 20 de puncte.

Figura 5.8. Rezultate – 20 de valori generate pentru variabilele 𝑋1 , 𝑋2 ~𝑁(0,1)


În Figura 5.9 este ilustrat cazul generării a câte 1000 de valori pentru
variabilele 𝑋1 , 𝑋2 ~𝑁(0,1). Se poate observa umplerea uniformă a pătratului pe
care s-au generat puncte.

Figura 5.9. Rezultate – 1000 de valori generate pentru variabilele


𝑋1 , 𝑋2 ~𝑁(0,1)

53
Modele de simulare. Îndrumar de laborator

Aplicaţia 5.2.

Se va implementa algoritmul metodei înfăşurătoarei pentru generarea unei


variabile 𝑁(0,1) , descris în pseudocod în Figura 5.6, din secţiunea Suport
teoretic. Se vor parcurge următorii paşi:

1. Construirea interfeţei grafice a aplicaţiei (Figura 5.10).


- se setează proprietăţile formei Form1 (titlu, culoare, dimensiune etc.);
- se adaugă pe formă următoarele controale:
o label1 – pentru scurtă descriere a aplicaţiei;
o label2 – pentru etichetarea datei de intrare n (numărul de valori
generate pentru variabila 𝑋~𝑁(0,1));
o textBox1 – pentru introducerea valorii lui n;
o button1 – buton pentru generarea celor n valori pentru variabila
𝑋~𝑁(0,1);
o textBox2 – pentru afişarea valorilor generate.

textBox2

label1 textBox1

label2 button1

Figura 5.10. Interfaţa grafică a Aplicaţiei 5.2.

2. Se defineşte funcţia care tratează evenimentul Click corespunzător


componentei button1:

54
Lucrarea de laborator 5

private void button1_Click(object sender, EventArgs e)


{
int n, i, s;
double X, Y, t, u, z;
Random r = new Random();
try
{
n = Convert.ToInt32(textBox1.Text);
textBox2.Clear();
for (i = 0; i < n; i++)
{
do
{
t = r.NextDouble();
Y = -Math.Log(t);
u = r.NextDouble();
}
while (u >= Math.Exp(Y - Y * Y / 2 - 0.5));
z = r.NextDouble();
s = -1;
if (z >= 0.5)
s = 1;
X = s * Y;
textBox2.AppendText("\r\nX = " + X.ToString());
}
}
catch
{
MessageBox.Show("Introduceti un numar natural pentru n!");
}
}

Observaţii

- Pentru a genera n valori pentru variabila 𝑋~𝑁(0,1), se repetă de n ori


algoritmul metodei înfăşurătoarei (vezi Figura 5.6);
- Cele n valori generate pentru variabila 𝑋~𝑁(0,1) nu s-au memorat într-un
vector, ci într-o variabilă simplă X, actualizată la fiecare generare.
În Figura 5.11 este prezentat un exemplu de generare a 15 valori pentru
variabila 𝑋~𝑁(0,1).

55
Modele de simulare. Îndrumar de laborator

Figura 5.11. Rezultate – 15 valori generate pentru variabila 𝑋~𝑁(0,1)

56

S-ar putea să vă placă și