Documente Academic
Documente Profesional
Documente Cultură
Tema numarul 15
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
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
𝑔(𝑥) = { , ∫ 𝑔(𝑥)𝑑𝑥 = 1 → 𝑘=
0, 𝑖𝑛 𝑟𝑒𝑠𝑡 𝑏−𝑎
−∞
𝑥 0, 𝑑𝑎𝑐𝑎 𝑥 < 𝑎
𝑥−𝑎
𝐺(𝑥) = ∫ 𝑔(𝑢)𝑑𝑢 = { , 𝑑𝑎𝑐𝑎 𝑥 ∈ [𝑎, 𝑏]
𝑏−𝑎
−∞ 1, 𝑑𝑎𝑐𝑎 𝑥 > 𝑏
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
0, 𝑑𝑎𝑐𝑎 𝑥 < 0
1, 𝑑𝑎𝑐𝑎 𝑥 ∈ [0,1]
𝑓(𝑥) = { 𝐹(𝑥) = {𝑥, 𝑑𝑎𝑐𝑎 𝑥 ∈ [0,1]
0, 𝑖𝑛 𝑟𝑒𝑠𝑡
1, 𝑑𝑎𝑐𝑎 𝑥 > 1
2
Repartitia Beta
Variabila X are repartitia Beta(a, b), a > 0, b > 0 daca densitatea sa de repartitie este
1
𝑥 𝑎−1 (1 − 𝑥)𝑏−1 , 𝑑𝑎𝑐𝑎 𝑥 ∈ [0,1]
f(x) = {𝐵(𝑎,𝑏)
0 𝑎𝑙𝑡𝑓𝑒𝑙
unde
1 Г(𝑎)Г(𝑏)
𝐵(𝑎, 𝑏) = ∫0 𝑥 𝑎−1 (1 − 𝑥)𝑏−1 𝑑𝑥, 𝐵(𝑎, 𝑏) = Г(𝑎+𝑏)
𝑋1
𝑋=
𝑋1 + 𝑋2
1
𝑓(𝑥1 , 𝑥2 ) = 𝑥1𝑎−1 𝑥2𝑏−1 𝑒 −(𝑥1 +𝑥2)
Г(𝑎)Г(𝑏)
avem
1 𝑢𝑎−1 𝑣 𝑎+𝑏−1 − 𝑣
𝑓(𝑥1 (𝑢, 𝑣), 𝑥2 (𝑢, 𝑣)) = 𝑔(𝑢, 𝑣) = 𝑒 1−𝑢 , 0 < 𝑣 < ∞
Г(𝑎)Г(𝑏) (1 − 𝑢)𝑎
𝑋1
Densitatea de repartitie a variabilei este
𝑋1 + 𝑋2
3
∞ ∞
1 𝑢𝑎−1 𝑣 𝑎+𝑏−1 − 𝑣
ℎ(𝑢) = ∫ 𝑔(𝑢, 𝑣)𝑑𝑣 = ∫ 𝑒 1−𝑢 𝑑𝑣
Г(𝑎)Г(𝑏) (1 − 𝑢)𝑎
0 0
Г(𝑎 + 𝑏) 𝑎−1
ℎ(𝑢) = 𝑢 (1 − 𝑢)𝑏−1
Г(𝑎)Г(𝑏)
Teorema. Daca variabila aleatoare X are repartitie Beta(a, b), ( a > 0, b 0) , atunci
momentele initiale de ordinul k sunt
𝑎(𝑎 + 1) ∙∙∙ (𝑎 + 𝑘 − 1)
𝑚𝑘 (𝑋) = , 𝑘 ∈ 𝑁∗
(𝑎 + 𝑏)(𝑎 + 𝑏 + 1) ∙∙∙ (𝑎 + 𝑏 + 𝑘 − 1)
𝑎 𝑎𝑏
𝐸(𝑋) = 𝑚1 (𝑋) = , 𝑉𝑎𝑟(𝑋) = 𝑚2 (𝑋) − [𝑚1 (𝑋)]2 =
𝑎+𝑏 (𝑎 + 𝑏)2 (𝑎 + 𝑏 + 1)
4
Atunci pentru fiecare ℰ>0
𝑎 = ∑ 𝑥𝑖
𝑖=1
1 0
unde 𝑋𝑖 = ( ), vom avea 𝑀(𝑋𝑖 ) = 𝑝; 𝑉𝑎𝑟(𝑋𝑖 ) = 𝑝(1 − 𝑝)
𝑝 1−𝑝
𝑛 𝑛
𝑎 𝑝(𝑝−1)
Deci 𝑀(𝑓𝑛 (𝐴)) = 𝑀 (𝑛) = 𝑝; 𝑉𝑎𝑟(𝑓𝑛 (𝐴)) = 𝑛
𝑝(1 − 𝑝)
𝑃(|𝑓𝑛 (𝐴) − 𝑝| < ℰ) ≥ 1 −
𝑛ℰ 2
Pentru ca 𝑝(1 − 𝑝) ≤ 4 rezulta
5
2. Tratarea matematica a problemei
Teorema. Daca 0 < a < 1, 0 < b < 1 si 𝑈1 , 𝑈2 sunt variabile aleatoare uniforme 0 –
1 1
𝑎 𝑏 𝑉
1 si independente si daca 𝑉 = 𝑉1 , 𝑇 = 𝑈2 , atunci repartitia variabilei 𝑋 = 𝑉+𝑇 conditionata
de 𝑉 + 𝑇 < 1 este Beta(a,b).
Demonstratie:
Observam ca
1
𝐹(𝑥) = 𝑃(𝑉 < 𝑥) = 𝑃 (𝑈 𝑎 < 𝑥) = 𝑃(𝑈 < 𝑥 𝑎 ) = 𝑥 𝑎 , 𝑥 ∈ [0,1]
𝑎𝑥 𝑎−1
𝑔(𝑥, 𝑦) =
(𝑎𝑥 𝑎−1 + 𝑏𝑦 𝑏−1 )
iar
𝑎𝑏
𝑃(𝑉 + 𝑇 < 1) = 𝐵(𝑎, 𝑏)
𝑎+𝑏
Deci densitatea variabilei X conditionata de 𝑉 + 𝑇 < 1 este
(𝑎 + 𝑏)(𝑥 𝑎−1 )
𝑞(𝑥, 𝑦) =
𝑏(𝑎𝑥 𝑎−1 + 𝑏𝑦 𝑏−1 )𝐵(𝑎, 𝑏)
6
Si teorema este demonstrata.
Demonstratie:
iar
1 1−𝑥
𝑃(𝑉 + 𝑇 < 1) = 𝑎(𝑏 − 1) ∫ (∫ 𝑦 𝑏−2 𝑑𝑦)𝑥 𝑎−1 𝑑𝑥 = 𝑎𝐵(𝑎, 𝑏)
0 0
𝑏 − 1 𝑎−1 𝑏−2
𝑝(𝑥, 𝑦) = 𝑥 𝑦 , 𝑥 ∈ [0,1] 𝑦 ∈ [0,1]
𝐵(𝑎, 𝑏)
7
3. Descrierea algoritmilor
Datele de intrare: a si b
Datele de iesire: Variabila Beta(a,b) X
Repeat
Genereaza 𝑈1 , 𝑈2 uniforme 0 – 1 si independente;
1
𝑎
𝑉 ≔ 𝑈1 ;
1
𝑇 ≔ 𝑈2𝑏 ;
Until 𝑉 + 𝑇 < 1;
𝑉
Calculeaza 𝑋 = 𝑉+𝑇
Probabilitatea de acceptare a acestui algoritm este
𝑎𝑏
𝑝𝑎 = 𝐵(𝑎, 𝑏)
𝑎+𝑏
Datele de intrare: a si b
Datele de iesire: Variabila Beta(a,b)V
Repeat
Genereaza 𝑈1 , 𝑈2 unifirme 0 – 1 independente ;
1
𝑎
𝑉 ≔ 𝑈1 ;
1
𝑇 ≔ 𝑈2𝑏−1 ;
Until 𝑉 + 𝑇 < 1;
Probabilitatea de acceptare a acestui algoritm este
𝑝𝑎 = 𝑎𝐵(𝑎, 𝑏)
8
4. Validarea algoritmilor.
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
10
Cazul 2 - Beta(a,b) unde 𝟎 < 𝐚 < 𝟏, 𝐛 > 𝟏
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
11
Verificarea mediei si a dispersiei
12
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();
13
{
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];
}
return ((sumap / rezultat.Length) - (xbar * xbar));
14
}
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();
}
}
}
}
Codul sursa pentru simularea variabilei Beta(a,b) unde 𝟎 < 𝒂 < 𝟏, 𝒃 < 𝟏
15
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();
16
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++)
17
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();
}
}
}
}
6. Bibliografie
18
[1] Ion Vaduva, „ Modele de simulare ”, Bucuresti, 2004
http://en.wikipedia.org/wiki/Beta_distribution
19