Documente Academic
Documente Profesional
Documente Cultură
Proiect Tehnici de Simulare
Proiect Tehnici de Simulare
Tema numarul 15
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
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
, -
( ) { ∫ ( )
( ) ∫ ( ) { , -
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
( ) ( )
( ) ∫ ( ) ( )
( )
( ) ( )
( ) ( )
avem
( ( ) ( )) ( )
( ) ( ) ( )
3
( ) ∫ ( ) ∫
( ) ( ) ( )
( )
( ) ( )
( ) ( )
Teorema. Daca variabila aleatoare X are repartitie Beta(a, b), ( a > 0, b 0) , atunci
momentele initiale de ordinul k sunt
( ) ( )
( )
( )( ) ( )
( ) ( ) ( ) ( ) , ( )-
( ) ( )
4
Atunci pentru fiecare ℰ>0
(*| ( ) | ℰ+)
(∑ ) (∑ ) ( )
( )
Deci ( ( )) . / ( ( ))
( )
(| ( ) | ℰ)
ℰ
Pentru ca ( ) rezulta
(*| ( ) | ℰ+)
5
2. Tratarea matematica a problemei
Teorema. Daca 0 < a < 1, 0 < b < 1 si sunt variabile aleatoare uniforme 0 –
Demonstratie:
Observam ca
( ) ( ) ( ) ( ) , -
( ) , -
( ) , -
( )
( )
iar
( ) ( )
( )( )
( )
( ) ( )
6
Al doilea caz particular de simulare
Demonstratie:
( ) ( ) ( ) ( ) , -
( ) , -.
( ) ( ) , -
( ) ( )
iar
( ) ( ) ∫ (∫ ) ( )
( ) , - , -
( )
( ) ∫ ( ) ( )
( )
7
3. Descrierea algoritmilor
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
( )
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.
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
10
Mai jos se gaseste histograma pentru 4000 de variabile generate cu alfa = 0.7 si beta = 1.9
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.
namespace Beta
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
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();
}
}
}
}
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();
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();
}
}
}
}
17
6. Bibliografie
http://en.wikipedia.org/wiki/Beta_distribution
18