Sunteți pe pagina 1din 16

Lucrarea de laborator 5_1

Metoda respingerii. Aplicaţii

Obiective

 Familiarizarea cu algoritmul metodei respingerii

 Aplicarea metodei respingerii pentru generarea variabilelor


aleatoare cu diverse distribuţii

 Utilizarea valorilor generate cu metoda respingerii pentru


rezolvarea unor aplicaţii practice

Enunţul şi scopul lucrării


Utilizând metoda respingerii, să se rezolve următoarele aplicaţii:

Aplicaţia 1.
Să se genereze n valori ale unei variabile aleatoare cu repartiţie normală 𝑁(𝑚, 𝜎 2 ). Să se
calculeze media aritmetică a valorilor generate şi să se compare cu media teoretică a repartiţiei
normale. Aproximativ câte valori trebuie generate, astfel încât în mod constant (în experimente
succesive), media aritmetică să aproximeze cu o precizie bună (la primele două zecimale) media
teoretică?

Aplicaţia 2.
Să se genereze n valori ale unei variabile aleatoare repartizate exponenţial negativ. Să se
compare media aritmetică a valorilor generate cu media teoretică a repartiţiei exponenţial
negative.

Aplicaţia 3.
Cunoscând că variabila aleatoare reprezentând timpul de funcţionare a unui echipament
(în ani) are o repartiţie exponenţial negativă de parametru λ, care este probabilitatea ca un astfel
de echipament să mai funcţioneze corespunzător şi după t ani? Să se calculeze probabilitatea
teoretică si apoi să se calculeze această probabilitate şi în mod empiric (prin aproximare cu
frecvenţa).

1
Modele de simulare. Îndrumar de laborator

Suport teoretic
 Metoda respingerii

Algoritmul metodei respingerii foloseşte funcţia densitate de repartiţie a variabilei


generate. Într-un reper cartezian, se generează puncte aleatoare în domeniul dat de un interval
(a,b) pe axa Ox (se vor obţine valori ale variabilei între a şi b) şi de intervalul (0,M) pe axa Oy,
unde M este maximul funcţiei densitate de repartiţie pe intervalul (a,b). Un punct generat
deasupra graficului este respins, un punct generat dedesubtul graficului este acceptat.

Algoritmul este prezentat în figura 6.1.

respins
Algoritmul metodei respingerii:
M
repetă
generează 𝜂1 ~𝑈(𝑎, 𝑏)
(𝜂1 , 𝜂2 ) generează 𝜂2 ~𝑈(0, 𝑀)

acceptat până când 𝜂1 < 𝑓(𝜂2 )


𝑋 ← 𝜂1
0 a X b

Figura 6.1. Algoritmul metodei respingerii

 Repartiţia normală N(m, σ2 )

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

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

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


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

2
Lucrarea de laborator 6

1
- Media: M ( X )  (6.6)

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

Funcţii şi resurse C# utilizate


 controale folosite în interfaţa grafică a aplicaţiei: label, textBox, button,
chart etc. (cu atributele şi funcţiile aferente);
 Random r=new Random() - un obiect din clasa Random, declarat şi instanţiat;
 r.NextDouble() - metodă a clasei Random pentru generarea unui număr aleator
real în intervalul [0,1];
 Math.Sqrt(),Math.Exp(), Math.PI – funcţii şi constante din clasa Math.

Modul de lucru
Aplicaţia 1.

Se vor parcurge următorii paşi:

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

textBox6

textBox1

textBox2

textBox3

textBox4

textBox5
chart1
button1

button2

Figura 6.2. Interfaţa grafică a aplicaţiei (Aplicaţia 1)

3
Modele de simulare. Îndrumar de laborator

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


- se adaugă pe formă următoarele controale:
o textBox1 – pentru introducerea valorii pentru media repartiţiei normale;
o textBox2 – pentru introducerea valorii pentru dispersie;
o textBox3 – pentru introducerea valorii lui n (numărul de valori generate);
o textBox4 şi textBox5 – pentru introducerea intervalului [a,b] în care
se vor genera valori;
o label1,label2,label3,label4,label5 – pentru etichetarea
datelor de intrare;
o textBox6 – pentru afişarea valorilor generate (cu proprietatea Multiline
activată);
o button1 – buton pentru generarea, afişarea şi reprezentarea grafică a
valorilor generate;
o button2 – buton pentru calculul mediei;
o chart1 – componentă de tip grafic, căreia i se adaugă două serii de puncte: o
serie pentru graficul funcţiei densitate de repartiţie (serie de tip Line) şi o
serie pentru punctele generate (de tip Point).

2. Se defineşte densitatea de repartiţie N(m, σ2 ), (relaţia (6.1) din secţiunea Suport


teoretic) ca o funcţie utilizator definită în clasa asociată formei Form1 (s-au folosit
parametrii m şi d pentru medie, respectiv dispersia σ2 ).
double f(double x,double m,double d)
{
return 1/Math.Sqrt(2*Math.PI*d)*Math.Exp(-(x-m)*(x-m)/(2*d));
}
3. Se declară variabilele globale:
double m, d, a, b;
int n;
double[] x;

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


 declararea variabilelor locale:
double eta1, eta2, k, M;
int i, j;
Random r = new Random();

 preluarea datelor de intrare:


m = Convert.ToDouble(textBox1.Text);
d = Convert.ToDouble(textBox2.Text);
n = Convert.ToInt32(textBox3.Text);
a = Convert.ToDouble(textBox4.Text);
b = Convert.ToDouble(textBox5.Text);

4
Lucrarea de laborator 6

 reprezentarea graficului funcţiei densitate de repartiţie pe intervalul [a,b]:


chart1.Series[0].Points.Clear();
for (k = a; k <= b; k += 0.01)
chart1.Series[0].Points.AddXY(k, f(k, m, d));

 aplicarea metodei respingerii pentru a genera n valori cu repartiţie N(m, σ2 ):

chart1.Series[1].Points.Clear();
x = new double[n];
M = f(m, m, d);
j = 0;
textBox6.Clear();
for (i=0;i<n;i++)
{
do
{
eta1 = a + (b - a) * r.NextDouble();
eta2 = M * r.NextDouble();
chart1.Series[1].Points.AddXY(eta1, eta2);
if (eta2 > f(eta1, m, d))
{
chart1.Series[1].Points[j].Color = Color.Red;
chart1.Series[1].Points[j].MarkerStyle =
System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Star5;
}
else chart1.Series[1].Points[j].Color = Color.Green;
j++;
}
while (eta2>f(eta1, m, d));
x[i] = eta1;
textBox6.AppendText(x[i].ToString()+"\n");
}

Observaţii

- M, maximul funcţiei densitate de repartiţie (vârful clopotului lui Gauss) se atinge în


medie, M = f(m, m, d);
- î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 au fost memorate în vectorul x.
- în cazul repartiţiei normale, este indicat ca intervalul [a,b] pe care se generează
cele n valori să fie simetric faţă de medie. Deşi se poate introduce un interval [a,b]
oricât de mare, regula celor 3σ spune că variabila ia valori semnificative numai în
intervalul (𝑚 − 3σ, 𝑚 + 3σ). Mai exact, 99.7% din valorile generate aparţin
intervalului (𝑚 − 3σ, 𝑚 + 3σ), 95.4% din valorile generate aparţin intervalului
(𝑚 − 2σ, 𝑚 + 2σ), 68% din valorile generate aparţin intervalului (𝑚 − σ, 𝑚 + σ);
- în Figura 6.3 este prezentat un exemplu de rulare a aplicaţiei, pentru generarea a 10
valori cu repartiţie normală standard N(0,1).

5
Modele de simulare. Îndrumar de laborator

Figura 6.3. Exemplu de rulare a aplicaţiei (Aplicaţia 1)

5. Pentru calculul mediei aritmetice a valorilor generate şi compararea cu media teoretică,


se defineşte funcţia asociată butonului button2, la evenimentul Click:

private void button2_Click(object sender, EventArgs e)


{
double s = 0;
int i;
for (i = 0; i < n; i++)
s += x[i];
s = s / n;
textBox6.AppendText("Media teoretica=" + m.ToString());
textBox6.AppendText("\r\nMedia empirica=" + s.ToString());
}

În Figura 6.4 se poate observa că la generarea a 100 de valori cu repartiţie N(2,1), media
aritmetică a valorilor generate este 2.032, o aproximaţie destul de bună a mediei teoretice.

În Tabelul 6.1 sunt prezentate rezultate ale mai multor experimente de simulare, pentru
diverse valori ale datelor de intrare. Completaţi tabelul cu rezultatele propriilor experimente.

6
Lucrarea de laborator 6

Figura 6.4. Media teoretică vs. media empirică (Aplicaţia 1)

Tabelul 6.1. Rezultate ale experimentelor (Aplicaţia 1)


Parametrii Media
Experiment

Numărul de
distribuţiei Media empirică (media
valori Media teoretică
media (m) aritmetică a valorilor
generate (exactă)
dispersia (d) generate)
Exp.1 0.00 -0.217983041060149
n=10 Exp.2 0.00 -0.385121569216774
Exp.3 0.00 0.213302658504482
Exp.1 0.00 -0.0210136184566719
n=100 Exp.2 0.00 0.00660864040563284
m=0 Exp.3 0.00 -0.00788649409445307
d=1 Exp.1 0.00 0.0309608101802696
n=1000 Exp.2 0.00 -0.00374669268436111
Exp.3 0.00 0.0475363586086483
Exp.1 0.00 -0.00811779316333951
n=10000 Exp.2 0.00 0.000189853469463898
Exp.3 0.00 0.00138187768234959
n=10 Exp.1 2.50 1.43737428893213
m=2.5 n=100 Exp.1 2.50 2.88305380827424
d=9 n=1000 Exp.1 2.50 2.49564916146903
n=10000 Exp.1 2.50 2.50456899965022

7
Modele de simulare. Îndrumar de laborator

Aplicaţia 2.

Pornind de la aplicaţia realizată anterior (Aplicaţia 1), se vor parcurge următorii paşi:

1. Construirea interfeţei grafice. Putem construi interfaţa în mod similar cu cea din
Aplicaţia 1, cu modificarea: în locul parametrilor Medie şi Dispersie ai repartiţiei
normale, se introduce parametrul Lambda pentru repartiţia exponenţial negativă (Figura
6.5).

Figura 6.5. Interfaţa grafică a aplicaţiei (Aplicaţia 2)

2. Definirea funcţiei densitate de repartiţie exponenţial negativă de parametru λ (relaţia (6.4)


din secţiunea Suport teoretic). S-a folosit parametrul L pentru λ:
double f(double x,double L)
{
return L * Math.Exp(-L*x);
}

3. Declararea variabilelor globale:


double L, a, b;
int n;
double[] x;

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

8
Lucrarea de laborator 6
private void button1_Click(object sender, EventArgs e)
{
double eta1, eta2, M, k;
int i, j;
Random r = new Random();
L = Convert.ToDouble(textBox1.Text);
n = Convert.ToInt32(textBox3.Text);
a = Convert.ToDouble(textBox4.Text);
b = Convert.ToDouble(textBox5.Text);

chart1.Series[0].Points.Clear();
for (k = a; k <= b; k += 0.01)
chart1.Series[0].Points.AddXY(k, f(k, L));

chart1.Series[1].Points.Clear();
x = new double[n];
M = f(a,L);
j = 0;
textBox6.Clear();
for (i=0;i<n;i++)
{
do
{
eta1 = a + (b - a) * r.NextDouble();
eta2 = M * r.NextDouble();
chart1.Series[1].Points.AddXY(eta1, eta2);
if (eta2 > f(eta1, L))
{
chart1.Series[1].Points[j].Color = Color.Red;
chart1.Series[1].Points[j].MarkerStyle =
System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Star5;
}
else chart1.Series[1].Points[j].Color = Color.Green;
j++;
}
while (eta2>f(eta1, L));
x[i] = eta1;
textBox6.AppendText(x[i].ToString()+"\n");
}
}

Observaţii

- M, maximul funcţiei densitate de repartiţie pe intervalul [a,b] se atinge întotdeauna


în capătul a al intervalului, M = f(a,L);
- î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 au fost memorate în vectorul x;
- în Figurile 6.6 şi 6.7 sunt prezentate două exemple de rulare a aplicaţiei, pentru
generarea a 10 valori cu repartiţie exponenţial negativă, schimbând valoarea
parametrului λ.

9
Modele de simulare. Îndrumar de laborator

Figura 6.6. Exemplul 1 de rulare a aplicaţiei (Aplicaţia 2)

Figura 6.7. Exemplul 2 de rulare a aplicaţiei (Aplicaţia 2)

10
Lucrarea de laborator 6

Observaţii

- Cum influenţează parametrul λ valorile generate? Observând graficele din Figurile 6.6 si 6.7,
o valoare mică a parametrului λ (0.02) conduce la o curbă care se apropie lent de axa Ox. Pe
intervalul [a,b], aria de sub grafic este destul de mare. O valoare mai mare a parametrului
λ (s-a folosit 2 în exemplu) conduce la o curbă care coboară foarte rapid spre axa Ox, lăsând
dedesubtul graficului o arie mică (pe orizontală). Astfel se explică valorile generate: valori
mai mari pentru λ mic (Figura 6.6), valori mai mici pentru λ mai mare (Figura 6.7);
- O valoare mică a parametrului λ determină ca probabilitatea ca un punct generat să fie
acceptat să fie mult mai mare decât în cazul unei valori mai mari a lui λ. Se poate observa în
Figura 6.7, cât de multe puncte au fost respinse până când să se obtină cele n valori dorite;
- De asemenea, se poate remarca faptul că deşi utilizatorul poate stabili intervalul [a,b] pe
care să se genereze valori, în realitate parametrul λ determină o limită maximă. De la un
punct încolo, graficul se apropie atât de mult de axa Ox, încât probabilitatea de generare a
unui punct dedesubtul graficului devine practic nulă.

5. Pentru calculul mediei aritmetice a valorilor generate şi compararea cu media teoretică,


se defineşte funcţia asociată butonului button2, la evenimentul Click:

private void button2_Click(object sender, EventArgs e)


{
double s = 0;
int i;
for (i = 0; i < n; i++)
s += x[i];
s = s / n;
textBox6.AppendText("Media teoretica=" + (1/L).ToString());
textBox6.AppendText("\r\nMedia empirica=" + s.ToString());
}

În Figura 6.8 se poate observa că la generarea a 10 valori cu repartiţie exponenţial


negativă de parametru λ = 0.01, nu s-a obţinut o bună aproximaţie a mediei (media teoretică este
100, media aritmetică a valorilor generate este 131.99). Repetând generarea pentru aceleaşi
valori ale datelor de intrare, se pot obţine aproximaţii mai bune sau mai puţin bune ale mediei
teoretice.

11
Modele de simulare. Îndrumar de laborator

Figura 6.8. Media teoretică vs. media empirică (Aplicaţia 1)

În Tabelul 6.2 sunt prezentate rezultatele mai multor experimente de simulare, pentru
diverse valori ale datelor de intrare. Completaţi tabelul cu rezultatele propriilor experimente.

Tabelul 6.2. Rezultate ale experimentelor (Aplicaţia 2)


Media
Experiment

Parametrul Numărul de
Media empirică (media
distribuţiei valori Media teoretică
aritmetică a valorilor
λ generate (exactă)
generate)
Exp.1 100.00 89.8151259356249
n=10 Exp.2 100.00 112.9993564113971
Exp.3 100.00 86.5761636554152
Exp.1 100.00 81.0731338993987
n=100 Exp.2 100.00 102.928648545839
λ = 0.01 Exp.3 100.00 83.59451484801
Exp.1 100.00 79.7347434306213
n=1000 Exp.2 100.00 93.3877782339173
Exp.3 100.00 102.119980154615
Exp.1 100.00 100.079932128815
n=10000 Exp.2 100.00 98.830666443185
Exp.3 100.00 99.6228392138254
n=10 Exp.1 0.40 0.367102210580885
λ =2.5 n=100 Exp.1 0.40 0.435022510744176
n=1000 Exp.1 0.40 0.410734737182844
n=10000 Exp.1 0.40 0.398810077863425

12
Lucrarea de laborator 6

Aplicaţia 3.

Prin definiţie, funcţia de repartiţie a unei variabile aleatoare X este 𝐹: 𝑅 → [0,1], unde:

𝐹(𝑡) = P(𝑋 < 𝑡) (6.8)

Dacă valoarea F(t) reprezintă probabilitatea ca timpul de funcţionare să fie mai mic decât t,
atunci probabilitatea ca timpul de funcţionare să fie cel puţin t va fi:

Pr = 1 − 𝐹(𝑡) (6.9)

Dacă se generează n timpi de funcţionare (repartizaţi exponenţial negativ) şi se studiază câţi


dintre ei depăşesc timpul t, atunci probabilitatea ca un echipament să mai funcţioneze
corespunzător şi după t ani poate fi aproximată prin frecvenţa de apariţie a acestui caz favorabil.
𝑛𝑢𝑚ă𝑟𝑢𝑙 𝑐𝑎𝑧𝑢𝑟𝑖𝑙𝑜𝑟 𝑓𝑎𝑣𝑜𝑟𝑎𝑏𝑖𝑙𝑒 𝑛𝑟(𝑋≥𝑡)
Pr ≈ = (6.10)
𝑛𝑢𝑚ă𝑟𝑢𝑙 𝑑𝑒 𝑒𝑥𝑝𝑒𝑟𝑖𝑚𝑒𝑛𝑡𝑒 𝑛

Pornind de la aplicaţia realizată anterior (Aplicaţia 2), se vor parcurge următorii paşi:

1. Interfaţa grafică a aplicaţiei (Figura 6.9). În interfaţa Aplicaţiei 2 se adaugă următoarele


controale: label5,textBox5.

label5

textBox6

Figura 6.9. Interfaţa grafică a aplicaţiei (Aplicaţia 3)

2. Se defineşte funcţia de repartiţie exponenţial negativă (relaţia (6.5) din secţiunea Suport
teoretic):
double F(double x, double L)
{
return 1- Math.Exp(-L * x);
}

13
Modele de simulare. Îndrumar de laborator

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

private void button1_Click(object sender, EventArgs e)


{
double eta1, eta2, M, k, t,pt,pe;
int i, nr_fav=0;
Random r = new Random();
L = Convert.ToDouble(textBox1.Text);
n = Convert.ToInt32(textBox2.Text);
a = Convert.ToDouble(textBox3.Text);
b = Convert.ToDouble(textBox4.Text);

chart1.Series[0].Points.Clear();
for (k = a; k <= b; k += 0.01)
chart1.Series[0].Points.AddXY(k, f(k, L));

chart1.Series[1].Points.Clear();
x = new double[n];
M = f(a,L);
t= Convert.ToDouble(textBox6.Text);
textBox5.Clear();
for (i=0;i<n;i++)
{
do
{
eta1 = a + (b - a) * r.NextDouble();
eta2 = M * r.NextDouble();
}
while (eta2>f(eta1, L));
x[i] = eta1;
chart1.Series[1].Points.AddXY(eta1, eta2);
if (x[i]>=t)
{
nr_fav++;
chart1.Series[1].Points[i].Color = Color.Green;
chart1.Series[1].Points[i].MarkerStyle =
System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
}
else chart1.Series[1].Points[i].Color = Color.Red;
textBox5.AppendText(x[i].ToString()+"\n");
}
pt = 1 - F(t, L);
pe = (double)nr_fav / n;
textBox5.AppendText("Probabilitatea teoretica=" + pt.ToString("0.00000"));
textBox5.AppendText("\r\nProbabilitatea empirica=" + pe.ToString("0.00000"));
}

Observaţii
- în grafic nu se mai reprezintă şi punctele respinse de metoda de generare, ci doar
punctele acceptate: cu pătrăţele roşii timpii de funcţionare mai mici decât t, cu
cerculeţe de culoare verde timpii consideraţi cazuri favorabile, peste t ani;
- în variabila pt s-a calculat probabilitatea teoretică (folosind funcţia de repartiţie) ca un
echipament să mai funcţioneze şi după t ani;

14
Lucrarea de laborator 6

- în variabila pe s-a calculat probabilitatea empirică (prin aproximaţie cu frecvenţa) ca un


echipament să mai funcţioneze şi după t ani;
- în Figurile 6.10 şi 6.11 sunt prezentate două exemple de rulare a aplicaţiei, pentru
calculul probabilităţii ca un echipament să mai funcţioneze şi după un timp t = 8 ani,
considerând timpul de funcţionare repartizat exponenţial negativ de parametru λ = 0.2. Se
observă că generarea a doar 10 valori nu este suficientă pentru ca probabilitatea calculată
empiric să fie o bună aproximaţie a probabilităţii teoretice.

Figura 6.10. Experiment pentru calculul probabilităţii cu n=10, t=8

Figura 6.11. Experiment pentru calculul probabilităţii cu n=1000, t=8

15
Modele de simulare. Îndrumar de laborator

În Tabelul 6.3 sunt prezentate rezultate ale mai multor experimente de simulare, pentru
diverse valori ale datelor de intrare. Completaţi tabelul cu rezultatele propriilor experimente.

Tabelul 6.3. Rezultate ale experimentelor (Aplicaţia 3)


Probabilitatea ca echipamentul să mai

Experiment
Numărul de funcţioneze după t ani
Parametrul λ
valori
Timpul t Probabilitatea Probailitatea empirică
generate
teoretică (exactă) (frecvenţa)

Exp.1 0.36788 0.40000


n=10
Exp.2 0.36788 0.30000
Exp.1 0.36788 0.34000
n=100
λ=0.5 Exp.2 0.36788 0.32000
t=2 Exp.1 0.36788 0.37300
n=1000
Exp.2 0.36788 0.35800
Exp.1 0.36788 0.36180
n=10000
Exp.2 0.36788 0.36820
Exp.1 0.54881 0.60000
n=10
Exp.2 0.54881 0.60000
Exp.1 0.54881 0.58000
n=100
Exp.2 0.54881 0.51000
λ=1.2
Exp.1 0.54881 0.54000
t=0.5 n=1000
Exp.2 0.54881 0.54200
Exp.1 0.54881 0.54970
n=10000
Exp.2 0.54881 0.54170
n=100000 Exp.1 0.54881 0.54820

Concluzii

 În această lucrare de laborator s-a utilizat metoda respingerii pentru a genera o variabilă
aleatoare de repartiţie cunoscută;
 Valorile generate cu ajutorul metodei respingerii se folosesc în aplicaţiile de modelare şi
simulare, pentru a estima diverşi parametri sau indicatori statistici;
 Aplicaţiile rezolvate au demonstrat că pentru a obţine bune aproximări ale indicatorilor
teoretici (uneori imposibil de calculat), numărul valorilor generate trebuie să fie suficient
de mare. În majoritatea experimentelor realizate, un număr de n=10000 de valori generate
s-a dovedit a fi suficient pentru o bună aproximare a mediei teoretice a unei variabile sau
pentru estimarea probabilităţii de producere a unui eveniment.

16

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