Documente Academic
Documente Profesional
Documente Cultură
Tema numarul 15
Student:
1.
Introducere
Formularea problemei
Construiti doua metode de simularea variabilei Beta(a; b), din care
una sa includa cazul 0 < a < 1 ; b > 1
1
g ( x ) = k ,daca x [a ,b ] , g ( x ) dx=1 k=
ba
0,rest
0, daca x< a
x
a
G ( x )= g ( u ) du=
, daca x [a , b ]
ba
1, daca x >b
x
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)
X=
X2
X 1 Gamma(0, 1, a),
X2
Gamma(0, 1, b),
X1
, atunci variabila
X1
X 1+ X 2
X1 , X2
) este
1
x a1
x b1
e(x + x )
1
2
( a) ( b)
1
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
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
(a+b) a1
u (1u)b1
( a) (b)
a ( a+1 ) ( a+k 1)
, k N
(a+ b)(a+b +1) (a+ b+k 1)
2
a
ab
, Var ( X )=m2 ( X ) [ m1 ( X ) ] =
2
a+ b
( a+ b ) (a+ b+1)
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
Pentru ca
p(1p)
n E2
p (1p ) 4
rezulta
2.
U 1 ,U 2
sunt variabile
X=
V
V +T
conditionata de
V =V 1a , T =U 2b ,
V +T <1
atunci
este Beta(a,b).
Demonstratie:
Observam ca
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
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.
b > 1 si
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
y b2 dy
x a1 dx=aB (a , b)
0
P (V +T <1 )=a(b1)
0
V +T <1
este
b1 a1 b2
x y , x [ 0,1 ] y [ 0,1]
B(a , b)
V +T <1
este
8
1 x
q ( x )= p ( x , y ) dy=
0
1
x a1 (1x )b1
B (a , b)
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
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 ;
4. Validarea algoritmilor.
Vom folosi pentru validarea algoritmilor de simulare doua metode,
respectiv aproximarea graficului densitatii de repartitie si verificarea
aproximarii mediei si dispersiei.
10
Mai jos se gaseste histograma pentru 4000 de variabile generate cu alfa = 0.3 si beta = 0.7
11
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
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.
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
form
din form
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
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
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
20