Sunteți pe pagina 1din 20

Proiect Tehnici de Simulare - An 3, I.D.

Tema numarul 15

Simularea Variabilei Beta(a,b)

Student:

1.

Introducere

- formularea problemei, definitii si notiuni necesare -

Formularea problemei
Construiti doua metode de simularea variabilei Beta(a; b), din care
una sa includa cazul 0 < a < 1 ; b > 1

Definitii si notiuni necesare


Repartitia uniforma
Una din repartitiile de probabilitate importante, dar care este
naturala, este repartitia uniforma pe un interval[a, b] care are densitatea
de repartitie de forma

1
g ( x ) = k ,daca x [a ,b ] , g ( x ) dx=1 k=
ba
0,rest

Variabila V avand densitatea de repartitie sus mentionata se spune


ca este repartizata uniform pe [a, b]. Deci toate valorile variabilei V sunt
egal probabile.
Functia de repartitie corespunzand densitatii sus mentionate este

0, daca x< a
x
a
G ( x )= g ( u ) du=
, daca x [a , b ]
ba

1, daca x >b
x

Sa notam cu U variabila aleatoare uniforma pe [0, 1], pe care o vom


numi pe scurt variabila uniforma 01. Densitatea de repartitie si functia
de repartitie a lui U sunt respectiv

0, daca x <0
f ( x )= 1, daca x [0,1] F ( x )= x , daca x [0,1]
0,rest
1,daca x >1

Repartitia Beta
Variabila X are repartitia Beta(a, b), a > 0, b > 0 daca densitatea sa de
repartitie este

f(x) =

1
x a1 (1x )b1 , daca x [0,1]
B(a , b)
0 altfel

unde
1

B ( a ,b )= x a1 (1x )b1 dx , B ( a , b ) =
0

(a) (b)
(a+ b)

Urmtoarea teorema permite simularea variabilei Beta(a, b)


Teorema. Daca
independent de

X=

X2

X 1 Gamma(0, 1, a),

X2

Gamma(0, 1, b),

X1

, atunci variabila

X1
X 1+ X 2

este o variabila Beta(a,b).

Demonstratie. Densitatea comuna de repartitie a lui (


f ( x 1 , x 2 )=

X1 , X2

) este

1
x a1
x b1
e(x + x )
1
2
( a) ( b)
1

Facand in ultima integrala transformarea


u=

x1
( x1 + x 2)
v
, v=x 2 , J =
=
, 0<u<1,
x 1+ x 2
(u , v) 1u

avem

1
ua 1 v a +b1 1u
f ( x 1 (u , v ) , x 2 ( u , v ) ) =g ( u , v )=
e , 0< v <
(a) (b) ( 1u)a

Densitatea de repartitie a variabilei

h ( u )= g ( u , v ) dv=
0

a1

a +b1

X1
X 1+ X 2

este

1
u v e 1u dv
( a) (b) 0 (1u)a

adica dupa calcule deducem


h ( u )=

(a+b) a1
u (1u)b1
( a) (b)

si teorema este demonstrata.

Deoarece aceasta formula presupune generarea prealabila a doua


variabile gamma, rezulta ca aceasta metoda are o complexitate mare. In
cazurile particulare, care nu necesita o complexitate mare, se pot folosi
alte teoreme.

Teorema. Daca variabila aleatoare X are repartitie Beta(a, b), ( a >


0, b 0) , atunci momentele initiale de ordinul k sunt
mk ( X )=

a ( a+1 ) ( a+k 1)
, k N
(a+ b)(a+b +1) (a+ b+k 1)

Din relatia de mai sus se deduce ca media si dispersia variabilei X


cu repartitia Beta(a, b) sunt
E ( X )=m1 ( X )=

2
a
ab
, Var ( X )=m2 ( X ) [ m1 ( X ) ] =
2
a+ b
( a+ b ) (a+ b+1)

Legea numerelor mari.


Aceasta lege este necesara la validarea algoritmilor, deoarece
repetand experimentul de un numar suficient de mare de ori, vom observa
ca rezultatele - media si dispersia variabilelor aleatoare obtinute- isi vor
pierde caracterul intamplator, apropiindu-se tot mai mult de rezultatele
teoretice.

Teorema lui Bernoulli:


Fie A un eveniment a carui probabilitate de realizare este p si fie
fn(A) frecventa relativa de realizare a evenimentului A in n repetari
independente ale experimentului in care se produce A.
Atunci pentru fiecare >0
lim P ( {|f n ( A ) p| E } )=1

Demonstratie:Asociem fiecarei efectuare a experimentului o


variabila aleatoare X care poate lua valori 1 daca experimentul i s-a
realizat si 0 in caz contrar. Numarul de realizari ale lui A in cele n repetari
independente ale experimentul e dat de:
n

a= x i
i=1

unde

0 ,
X i= 1
p 1 p vom avea

M ( X i )= p ; Var ( X i )= p (1 p)

Xi
Xi
n

=np(1 p)
1
n

=np ; Var
1

Deci

M ( f n ( A ) ) =M

( an )= p ; Var (f ( A ) )= p ( p1)
n
n

Aplicam inegalitatea lui Cebisev si obtinem


P (|f n ( A ) p|< E ) 1

Pentru ca

p(1p)
n E2

p (1p ) 4

rezulta

lim P ( {|f n ( A ) p| E } )=1

2.

Tratarea matematica a problemei

In continuare vor fi prezentate doua cazuri particulare pentru


simularea variabilei Beta(a, b).
1. 0 < a < 1 si 0 < b < 1
2. 0 < a < 1 si b > 1

Primul caz particular de simulare


Vom folosi urmatoarea teorema.

U 1 ,U 2

Teorema. Daca 0 < a < 1, 0 < b < 1 si

sunt variabile

aleatoare uniforme 0 1 si independente si daca


repartitia variabilei

X=

V
V +T

conditionata de

V =V 1a , T =U 2b ,

V +T <1

atunci

este Beta(a,b).

Demonstratie:
Observam ca

F ( x )=P ( V < x )=P U a < x =P ( U < x a )=x a , x [0,1]


de unde rezulta ca densitatea de repartitie a lui V este
f ( x )=a x a1 , x [0,1]
si densitatea de repartitie a lui T este
h ( y )=b y b 1 , y [0,1]

rezulta ca densitatea de repartitie a variabilei

X=

V
V +T

este

a1

g ( x , y )=

ax
a1
b1
(a x +b y )

iar
P (V +T <1 )=

ab
B(a , b)
a+ b

Deci densitatea variabilei X conditionata de

V +T <1

este

a1

(a+b)(x )
q ( x , y )=
a 1
b 1
b ( a x +b y ) B(a , b)
Si teorema este demonstrata.

Al doilea caz particular de simulare


7

Vom folosi urmatoarea teorema.


Teorema. Daca 0 < a < 1,

b > 1 si

uniforme 0 1 independente si consideram


repartitia variabilei V conditionata de

U 1 ,U 2
1
a
1

sunt variabile

V =U , T =U

V +T <1

1
b1
2

, atunci

este Beta(a,b).

Demonstratie:
Mai intai observam ca

F ( x )=P ( V < x )=P U a < x =P ( U < x a )=x a , x [0,1]


de unde rezulta ca densitatea de repartitie a lui V este
f ( x )=a x a1 , x [0,1] .
si densitatea de repartitie a lui T este
b2
h ( y )=( b1 ) y , y [0,1]

Rezulta ca densitatea comuna de repartitie a variabilelor V,Tindependente este


g ( x , y )=a (b1) x a1 y b2
iar
1 x

y b2 dy

x a1 dx=aB (a , b)
0

P (V +T <1 )=a(b1)
0

Deci densitatea comuna a variabilelor (V,T) conditionata de


p ( x , y )=

V +T <1

este

b1 a1 b2
x y , x [ 0,1 ] y [ 0,1]
B(a , b)

De aici rezulta ca densitatea lui V conditionata de

V +T <1

este
8

1 x

q ( x )= p ( x , y ) dy=
0

1
x a1 (1x )b1
B (a , b)

Si teorema este demonstrata.

3. Descrierea algoritmilor
Algoritmul de simulare variabilei Beta(a,b),
0<a <1,b <1
Datele de intrare: a si b
Datele de iesire: Variabila Beta(a,b) X
Repeat
Genereaza
VU

1
a
1

U 1 ,U 2

uniforme 0 1 si independente;

T U 2b
Until

V +T <1 ;

Calculeaza

X=

V
V +T

Probabilitatea de acceptare a acestui algoritm este


ab
pa=
B(a , b)
a+ b

Algoritmul de simularea variabilei Beta(a,b) unde


0<a <1,b >1

Datele de intrare: a si b
Datele de iesire: Variabila Beta(a,b)V

Repeat

U 1 ,U 2

Genereaza

unifirme 0 1 independente ;

V U 1a

;
1

T U 2b 1
Until

V +T <1 ;

Probabilitatea de acceptare a acestui algoritm este


pa=aB(a , b)

4. Validarea algoritmilor.
Vom folosi pentru validarea algoritmilor de simulare doua metode,
respectiv aproximarea graficului densitatii de repartitie si verificarea
aproximarii mediei si dispersiei.

Aproximarea densitatii de repartitie


Pentru a verifica acuratetea rezultatelor obtinute in urma
algoritmului de generare a unui set de date, se analizeaza in ce masura
histograma asociata setului obtinut aproximeaza densitatea de repartitie a
variabilelor generate.
Validarea algortimului s-a facut cu ajutorul graficului densitatii de probabilitate
folosind histograme.
La fiecare rulare a programului se va afisa si histograma. K = 25 intervale.

Cazul 1- Beta(a,b), 0<a <1,b <1


Mai jos se gaseste histograma pentru 5000 de variabile generate cu alfa = 0.5 si beta = 0.5

10

Mai jos se gaseste histograma pentru 4000 de variabile generate cu alfa = 0.3 si beta = 0.7

11

Cazul 2 - Beta(a,b) unde

0<a <1,b >1

Mai jos se gaseste histograma pentru 2000 de variabile generate cu alfa = 0.5 si beta = 1.3

Mai jos se gaseste histograma pentru 4000 de variabile generate cu alfa = 0.7 si beta = 1.9

12

Verificarea mediei si a dispersiei


Se observa ca dimensiunea multimii de selectie influenteaza
rezultatele mediei si dispersiei aferente setului de date, in sensul ca le
apropie foarte mult de valorile teoretice corespunzatoare tipului de date
din multimea de selectie (o consecinta a legii numerelor mari).
In tabelul urmator se gasesc rezultatele obtinute pentru diferite
dimensiuni ale multimii de selectie in comparatie cu valorile teoretice
corespunzatoare.

Nr.Cr
t

Volum de
selectie

Media
obtinuta

Media
teoreti
a

10

0.5

50

0.59381
57
0.51354
61

0.5

Eroare

Dispersi
a
obtinut
a
0.0938 0.0865
1
94
0.0135 0.1215
4
38

Dispers
ia
teoretic
a
0.125

Eroar
e

0.125

0.04

0.1

13

200

300

0.51327
67
0.50518
22

0.5
0.5

0.0132 0.1246
7
88
0.005
0.1249
56

0.125

0.001

0.125

0.001

5. Codul sursa
Programul a fost scris in C# folosind ca IDE Visual Studio Express
2010. Pentru rulare este necesar sa aveti instalat .NET.

Codul sursa pentru simularea variabilei Beta(a,b) unde


0<a <1,b >1
using
using
using
using
using
using
using
using
using
using

System;
System.IO;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Linq;
System.Text;
System.Windows.Forms;
System.Windows.Forms.DataVisualization.Charting;

namespace Beta
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Output.Text = "";
//initializez variabilele
int i = 0;
double alfa = 0, beta = 0, U1=0, U2=0, V = 0, T=0;
Random rand = new Random();
double[] rezultat;
try
{
//verific numarul de valori de calculat si dau lungimea vectorului ce le va contine
if (nr_valori.Text != "")
{
rezultat = new double[Convert.ToInt64(nr_valori.Text)];
}
else
{
nr_valori.Text = "1";
rezultat = new double[Convert.ToInt64(nr_valori.Text)];
Output.Text = "Casuta nr de variabile este goala, se va calcula o singura
variabila!";
}

14

if (input.Text!="") alfa = Convert.ToDouble(input.Text); // atribui lui alfa valoarea din

form
din form

if (input1.Text!="") beta = Convert.ToDouble(input1.Text);//atribui lui beta valoarea


if ((alfa > 0) && (alfa < 1) && (beta > 1))// verific ca 0<alfa<1, b>1
{
do
{
U1 = rand.NextDouble();
U2 = rand.NextDouble();
V = Math.Pow(U1,(1/alfa)); //generez U1 uniform pe 0 - 1 cu V=U1^(1/alfa)
T = Math.Pow(U2,(1/(beta-1))); //generez U2 uniform pe 0 - 1 cu T=U2^(1/beta-

1)

U1 = rand.NextDouble();
U2 = rand.NextDouble();//generez alt U uniform pe 0 - 1
if (V+T <= 1) // verific conditia de inegalitate V+T<1
{
rezultat[i] = V ; //pastrez V ca rezultat daca inegalitatea este respectata
i++;
}
} while (i < Convert.ToInt64(nr_valori.Text)); // reaplic pasul pana cand calculez nr
necesar de variabile
histograma(rezultat); //apelez functia pentru a crea histograma
for (int q = 0; q < Convert.ToInt64(nr_valori.Text); q++)
{
Output.AppendText(rezultat[q] + "\r\n");
}
double xb = xbar(rezultat);
xbr.Text = xb + "";
double sp = spatrat(rezultat, xb);
sptext.Text = sp + "";
}
else
{
if (alfa < 0) { MessageBox.Show("a trebuie sa fie mai mare decat 0","Eroare"); }
else if (alfa > 1) { MessageBox.Show("a trebuie sa fie mai mic decat 1"); }
if (beta < 1) { MessageBox.Show("b trebuie sa fie mai mare decat 1"); };
}
}
catch (Exception ex)
{
Output.Text = ex + "";
}

}
public double xbar(double[] rezultat)
{
double suma = 0;
for (int i = 0; i < rezultat.Length - 1; i++)
{
suma = suma + rezultat[i];
}
return suma / rezultat.Length;
}
public double spatrat(double[] rezultat, double xbar)
{
double sumap = 0;
for (int i = 0; i < rezultat.Length - 1; i++)
{
sumap = sumap + rezultat[i] * rezultat[i];

15

}
return ((sumap / rezultat.Length) - (xbar * xbar));
}
public void histograma(double[] rezultat)
{
int k = 25;
double[] bins = new double[k + 1];
double m = rezultat.Min();
double M = rezultat.Max();
double ratio = (M - m) / (k);
for (int i = 0; i < bins.Length; i++)
{
bins[i] = i * ratio + m; //stabilesc intervalele pentru histograma
}
double[] frequency = new double[k];
for (int i = 0; i < rezultat.Length; i++)
{
for (int j = 0; j < bins.Length; j++)
if ((rezultat[i] > bins[j]) && (rezultat[i] <= bins[j + 1])) frequency[j]++; //iau
fiecare element din rezultat si verific frecventa lui in intervalele stabilite
}
for (int i = 0; i < frequency.Length; i++)
{
chart2.Series["Series1"].Points.AddXY(Math.Round(bins[i + 1], 2), frequency[i] /
rezultat.Length); //fac histograma folosing intervalele si frecventa variabilelor
}
TextWriter tw = new StreamWriter("bins.txt");
for (int i = 0; i < bins.Length; i++)
{
tw.WriteLine(bins[i]);
}
tw.Close();
TextWriter tw1 = new StreamWriter("frequency.txt");
for (int i = 0; i < frequency.Length; i++)
{
tw1.WriteLine(frequency[i]);
}
tw1.Close();
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}

16

Codul sursa pentru simularea variabilei Beta(a,b) unde


0<a <1,b <1
using
using
using
using
using
using
using
using
using
using

System;
System.IO;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Linq;
System.Text;
System.Windows.Forms;
System.Windows.Forms.DataVisualization.Charting;

namespace Beta
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Output.Text = "";
//initializez variabilele
int i = 0;
double alfa = 0, beta = 0, U1=0, U2=0, V = 0, T=0;
Random rand = new Random();
double[] rezultat;
try
{
//verific numarul de valori de calculat si dau lungimea vectorului ce le va contine
if (nr_valori.Text != "")
{
rezultat = new double[Convert.ToInt64(nr_valori.Text)];
}
else
{
nr_valori.Text = "1";
rezultat = new double[Convert.ToInt64(nr_valori.Text)];
Output.Text = "Casuta nr de variabile este goala, se va calcula o singura
variabila!";
}
if (input.Text!="") alfa = Convert.ToDouble(input.Text); // atribui lui alfa valoarea din
form

if (input1.Text!="") beta = Convert.ToDouble(input1.Text);//atribui lui beta valoarea

din form

if ((alfa > 0) && (alfa < 1) && (beta > 0 ) && (beta < 1 ))// alfa si beta verific sa fie
intre 0 si 1
{
do
{
U1 = rand.NextDouble();
U2 = rand.NextDouble();
V = Math.Pow(U1,(1/alfa)); //generez U1 uniform pe 0 - 1 cu V=U1^(1/alfa)
T = Math.Pow(U2,(1/beta)); //generez U2 uniform pe 0 - 1 cu T=U2^(1/beta)

17

U1 = rand.NextDouble();
U2 = rand.NextDouble();//generez alt U uniform pe 0 - 1
if (V+T <= 1) // verific conditia de inegalitate V+T<1
{
rezultat[i] = V / (V + T); //pastrez V/(V+T) ca rezultat daca inegalitatea
este respectata
i++;
}
} while (i < Convert.ToInt64(nr_valori.Text)); // reaplic pasul pana cand calculez nr
necesar de variabile
histograma(rezultat); //apelez functia pentru a crea histograma
for (int q = 0; q < Convert.ToInt64(nr_valori.Text); q++)
{
Output.AppendText(rezultat[q] + "\r\n");
}
double xb = xbar(rezultat);
xbr.Text = xb + "";
double sp = spatrat(rezultat, xb);
sptext.Text = sp + "";
}
else
{
Output.Text = "Variabila de intrare trebuie sa fie intre 0 si 1";
}
}
catch (Exception ex)
{
Output.Text = ex + "";
}
}
public double xbar(double[] rezultat)
{
double suma = 0;
for (int i = 0; i < rezultat.Length - 1; i++)
{
suma = suma + rezultat[i];
}
return suma / rezultat.Length;
}
public double spatrat(double[] rezultat, double xbar)
{
double sumap = 0;
for (int i = 0; i < rezultat.Length - 1; i++)
{
sumap = sumap + rezultat[i] * rezultat[i];
}
return ((sumap / rezultat.Length) - (xbar * xbar));
}
public void histograma(double[] rezultat)
{
int k = 25;
double[] bins = new double[k + 1];
double m = rezultat.Min();
double M = rezultat.Max();
double ratio = (M - m) / (k);
for (int i = 0; i < bins.Length; i++)
{
bins[i] = i * ratio + m; //stabilesc intervalele pentru histograma
}
double[] frequency = new double[k];
for (int i = 0; i < rezultat.Length; i++)
{
for (int j = 0; j < bins.Length; j++)

18

if ((rezultat[i] > bins[j]) && (rezultat[i] <= bins[j + 1])) frequency[j]++; //iau
fiecare element din rezultat si verific frecventa lui in intervalele stabilite
}
for (int i = 0; i < frequency.Length; i++)
{
chart2.Series["Series1"].Points.AddXY(Math.Round(bins[i + 1], 2), frequency[i] /
rezultat.Length); //fac histograma folosing intervalele si frecventa variabilelor
}
TextWriter tw = new StreamWriter("bins.txt");
for (int i = 0; i < bins.Length; i++)
{
tw.WriteLine(bins[i]);
}
tw.Close();
TextWriter tw1 = new StreamWriter("frequency.txt");
for (int i = 0; i < frequency.Length; i++)
{
tw1.WriteLine(frequency[i]);
}
tw1.Close();
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}

6. Bibliografie

19

[1] Ion Vaduva, Modele de simulare , Bucuresti, 2004


[2] Enciclopedia Wikipedia, Beta distribution
http://en.wikipedia.org/wiki/Beta_distribution

20