Sunteți pe pagina 1din 18

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

Tema numarul 15

Simularea Variabilei Beta(a,b)

Student:
Militaru Maria
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

, -
( ) { ∫ ( )

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

( ) ∫ ( ) { , -

Sa notam cu U variabila aleatoare uniforma pe [0, 1], pe care o vom numi pe scurt
variabila uniforma 0−1. Densitatea de repartitie si functia de repartitie a lui U sunt respectiv

, -
( ) { ( ) { , -

2
Repartitia Beta

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

( ) , -
f(x) = { ( )

unde
( ) ( )
( ) ∫ ( ) ( )
( )

Următoarea teorema permite simularea variabilei Beta(a, b)

Teorema. Daca ⤳ Gamma(0, 1, a), ⤳ Gamma(0, 1, b), independent de ,


atunci variabila

este o variabila Beta(a,b).

Demonstratie. Densitatea comuna de repartitie a lui ( ) este

( ) ( )
( ) ( )

Facand in ultima integrala transformarea


( )
( )

avem

( ( ) ( )) ( )
( ) ( ) ( )

Densitatea de repartitie a variabilei este

3
( ) ∫ ( ) ∫
( ) ( ) ( )

adica dupa calcule deducem

( )
( ) ( )
( ) ( )

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

( ) ( )
( )
( )( ) ( )

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


Beta(a, b) sunt

( ) ( ) ( ) ( ) , ( )-
( ) ( )

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.

4
Atunci pentru fiecare ℰ>0

(*| ( ) | ℰ+)

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:

unde ( ) vom avea ( ) ( ) ( )

(∑ ) (∑ ) ( )

( )
Deci ( ( )) . / ( ( ))

Aplicam inegalitatea lui Cebisev si obtinem

( )
(| ( ) | ℰ)

Pentru ca ( ) rezulta

(*| ( ) | ℰ+)

5
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.

Teorema. Daca 0 < a < 1, 0 < b < 1 si sunt variabile aleatoare uniforme 0 –

1 si independente si daca atunci repartitia variabilei conditionata


de este Beta(a,b).

Demonstratie:

Observam ca

( ) ( ) ( ) ( ) , -

de unde rezulta ca densitatea de repartitie a lui V este

( ) , -

si densitatea de repartitie a lui T este

( ) , -

rezulta ca densitatea de repartitie a variabilei este

( )
( )

iar

( ) ( )

Deci densitatea variabilei X conditionata de este

( )( )
( )
( ) ( )

Si teorema este demonstrata.

6
Al doilea caz particular de simulare

Vom folosi urmatoarea teorema.

Teorema. Daca 0 < a < 1, b > 1 si sunt variabile uniforme 0 – 1

independente si consideram , atunci repartitia variabilei V conditionata de


este Beta(a,b).

Demonstratie:

Mai intai observam ca

( ) ( ) ( ) ( ) , -

de unde rezulta ca densitatea de repartitie a lui V este

( ) , -.

si densitatea de repartitie a lui T este

( ) ( ) , -

Rezulta ca densitatea comuna de repartitie a variabilelor V,T- independente este

( ) ( )

iar

( ) ( ) ∫ (∫ ) ( )

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

( ) , - , -
( )

De aici rezulta ca densitatea lui V conditionata de este

( ) ∫ ( ) ( )
( )

Si teorema este demonstrata.

7
3. Descrierea algoritmilor

Algoritmul de simulare variabilei Beta(a,b),

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

Repeat
Genereaza uniforme 0 – 1 si independente;

;
Until ;
Calculeaza
Probabilitatea de acceptare a acestui algoritm este

( )

Algoritmul de simularea variabilei Beta(a,b) unde

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

Repeat
Genereaza unifirme 0 – 1 independente ;

;
Until ;
Probabilitatea de acceptare a acestui algoritm este
( )

8
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),

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

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

Cazul 2 - Beta(a,b) unde


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

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

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.Crt Volum de Media Media Eroare Dispersia Dispersia Eroare


selectie obtinuta teoretia obtinuta teoretica
1 10 0.5938157 0.5 0.09381 0.086594 0.125 0.1
2 50 0.5135461 0.5 0.01354 0.121538 0.125 0.04
3 200 0.5132767 0.5 0.01327 0.124688 0.125 0.001
4 300 0.5051822 0.5 0.005 0.124956 0.125 0.001

11
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


using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using 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

12
if (input1.Text!="") beta = Convert.ToDouble(input1.Text);//atribui
lui beta valoarea din form
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++)

13
{
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++)
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)


{

}
}
}

14
Codul sursa pentru simularea variabilei Beta(a,b) unde
using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using 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)

15
T = Math.Pow(U2,(1/beta)); //generez U2 uniform pe 0 - 1 cu
T=U2^(1/beta)
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];

16
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)


{

}
}
}

17
6. Bibliografie

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

[2] Enciclopedia Wikipedia, Beta distribution

http://en.wikipedia.org/wiki/Beta_distribution

18

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