МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"
Інститут КНІТ
Кафедра ПЗ
ЗВІТ
До лабораторної роботи № 1
На тему: “Формування вхідних потоків і контролю їх якості для комп’ютерного моделювання складних систем статистичними методами”
З дисципліни : "Моделювання програмного забезпечення"
Мета роботи: одержання послідовностей псевдовіпадковіх квазірівномірно розподілених чисел запропонованими методами та перевірка їх якості.
Завдання:
1.Одержати послідовності псевдовіпадковіх квазірівномірно розподілених чисел при заданих параметрах для кожного з ніжчевказаніх способів:
- методу серединний квадратів;
- мультіплікатівного методу;
- за допомогою вбудованих функцій із програмного забезпечення комп'ютера.
2.Кожну з генерованіх послідовностей перевірити на рівномірність двома методами:
- за гістограмою;
- за непрямими ознаками.
3.Кожну з генерованіх послідовностей провірити на незалежність методом, оснований на обчисленні кореляційного моменту.
4.Перевірити одержані послідовності на стохастічність.
Код програми
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{Label6->Caption="";
Label7->Caption="";
//метод серединних квадратів
long double mas_s_k[100000];
Memo1->Clear();
double X1 = StrToFloat(Edit1->Text);
mas_s_k[0]= X1;
int N = StrToInt(CSpinEdit1->Text);
Memo1->Text = Memo1->Text + FloatToStrF(X1,ffFixed,6,4)+" ";
double Xi = X1;
int k= Edit1->Text.Length();
int s =ceil((k-2)/2);
if(s*2!=(k-2))
k=k+1;
double mn1=1;
double mn2=1;
for(int i1=0;i1<ceil((k-2)/2);i1++)
mn1*=10.0;
for(int i1=0;i1<k-2;i1++)
mn2*=10.0;
for(int i=1; i<N; i++)
{
double dtmp;
Xi = Xi*Xi;
Xi = modf(Xi*mn1 ,&dtmp);
Xi = modf(Xi*mn2,&dtmp);
Xi = dtmp/mn2;
if(CheckBox1->Checked)
Memo1->Text = Memo1->Text + FloatToStrF(Xi,ffFixed,6,k-2)+" ";
mas_s_k[i]= Xi;
Image2->Canvas->Pixels[floor(mas_s_k[i-1]*100)][floor(mas_s_k[i]*100)]=clRed;
}
//закінчення методу серединних квадратів
int m[21];
//обнулення масиву
for(int i=0;i<21;i++)
m[i]=0;
//кількість чисел на проміжку
for( int i=0;i<N;i++)
for(int j=1;j<=20;j++)
{
if(mas_s_k[i]<=0.05*j)
{m[j-1]=m[j-1]+1;
break;
}
}
//побудова гістограми
for(int i=0;i<20;i+=1)
{
Series1->Add((m[i]),IntToStr(i),clRed);
}
//задання розмірів зображення
Image2->Width=100;
Image2->Height=100;
Image2->Canvas->Brush->Color=clRed;
//перевірка на стохастичність
double hi2 = 0;
int d = 5;
double mas1[10];
double p[10];
double cnt = 0;
int a = 0;
double dl = 1.0 / d;
for (double j = 0; j < 1; j += dl)
{
cnt = 0;
for (int i = 0; i < N; i++)
{
if (mas_s_k[i] > j && mas_s_k[i] <= (j + dl))
cnt++;
}
mas1[a] = cnt;
p[a] = mas1[a] / N;
a++;
}
for (int i = 0; i < d; i++)
if (p[i] != 0)
hi2 = hi2 + pow((mas1[i] - N * p[i]), 2) / (N * p[i]);
double hia2 = 0.352;
if (hi2 >= hia2)
Label6->Caption = "Гіпотеза не вірна";
else
Label6->Caption =Label6->Caption+"Гіпотеза вірна зі імовірністю 95% " + " Критерій Х2=" +FloatToStr(hi2);
//завершення перевірки
// кореляційні моменти
double SXi = 0, SXit = 0, SXiXit = 0, SXi2 = 0, SXit2 = 0;
int t=0;
for (int i = 0; i < N - t; i++)
{
SXi += mas_s_k[i];
SXit += mas_s_k[i + t];
SXiXit += mas_s_k[i] * mas_s_k[i + t];
SXi2 += mas_s_k[i] * mas_s_k[i];
SXit2 += mas_s_k[i + t] * mas_s_k[i + t];
}
double DXi, DXit;
DXi = 1.0 / (N - t) * SXi2 - 1.0 / ((N - t) * (N - t)) * SXi * SXi;
DXit = 1.0 / (N - t) * SXit2 - 1.0 / ((N - t) * (N - t)) * SXit * SXit;
double Pt;
Pt = (1.0 / (N - t) * SXiXit - (1.0) / ((N - t) * (N - t)) * SXi * SXit) / sqrt(DXi * DXit);
double B;
B=1- (abs(Pt)*sqrt(1.0/N));
if ((Pt >=0) && (Pt <=1))
Label7->Caption = "Послідовність незалежна з імовірністю " +FloatToStrF(B,ffFixed,4,4) ;
else Label7->Caption = "Послідовність залежна з імовірністю "+FloatToStr(Pt) ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2Change(TObject *Sender)
{
Series1->Clear();
Image2->Picture->LoadFromFile("1.bmp");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CSpinEdit1Change(TObject *Sender)
{
Series1->Clear();
Image2->Picture->LoadFromFile("1.bmp");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Series1->Clear();
Image2->Picture->LoadFromFile("1.bmp");randomize();
Edit2->Visible=false;Edit3->Visible=false;
Label4->Visible=false;Label5->Visible=false;
Button1->Visible=false;
Edit1->Visible=false;
Label2->Visible=false;
Image2->Picture->LoadFromFile("1.bmp");
Button4->Visible=true;
Button6->Visible=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Label6->Caption = "";
Label7->Caption = "";
// початок вбудованого методу
long double mas_v_m[100000];
randomize();
Memo1->Clear();
int N = StrToInt(CSpinEdit1->Text);
for(int i=0; i<N; )
{
mas_v_m[i]= random(1000);
if( mas_v_m[i]!=0)
{ mas_v_m[i]=mas_v_m[i]/1000;
Image2->Canvas->Pixels[floor(mas_v_m[i-1]*100)][floor(mas_v_m[i]*100)]=clRed;
if(CheckBox1->Checked)
Memo1->Text = Memo1->Text + FloatToStrF(mas_v_m[i],ffFixed,6,4)+" ";
i++;
}
}
//кінець
int m[21];
//обнулення масиву
for(int i=0;i<20;i++)
m[i]=0;
float tmp=1/10;
for( int i=0;i<N;i++)
for(int j=1;j<=20;j++)
{
if(mas_v_m[i]<=0.05*j)
{m[j-1]=m[j-1]+1;
break;
}
}
//Build graph with help TChart
for(int i=0;i<20;i+=1)
{
Series1->Add((m[i]),IntToStr(i),clRed);
}
Image2->Width=100;
Image2->Height=100;
//стохастичність
double hi2 = 0;
int d = 5;
double mas1[10];
double p[10];
double cnt = 0;
int a = 0;
double dl = 1.0 / d;
for (double j = 0; j < 1; j += dl)
{
cnt = 0;
for (int i = 0; i < N; i++)
{
if (mas_v_m[i] > j && mas_v_m[i] <= (j + dl))
cnt++;
}
mas1[a] = cnt;
p[a] = mas1[a] / N;
a++;
}
for (int i = 0; i < d; i++)
if (p[i] != 0)
hi2 = hi2 + pow((mas1[i] - N * p[i]), 2) / (N * p[i]);
//кореляція
double hia2 = 0.352;
if (hi2 >= hia2)
Label6->Caption = "Гіпотеза не вірна";
else
Label6->Caption = Label6->Caption + "Гіпотеза вірна зі імовірністю 95";
Label6->Caption = Label6->Caption + " "+" Критерій Х2=" +FloatToStr(hi2);
double SXi = 0, SXit = 0, SXiXit = 0, SXi2 = 0, SXit2 = 0;
int t=0;
for (int i = 0; i < N - t; i++)
{
SXi += mas_v_m[i];
SXit += mas_v_m[i + t];
SXiXit += mas_v_m[i] * mas_v_m[i + t];
SXi2 += mas_v_m[i] * mas_v_m[i];
SXit2 += mas_v_m[i + t] * mas_v_m[i + t];
}
double DXi, DXit;
DXi = 1.0 / (N - t) * SXi2 - 1.0 / ((N - t) * (N - t)) * SXi * SXi;
DXit = 1.0 / (N - t) * SXit2 - 1.0 / ((N - t) * (N - t)) * SXit * SXit;
double Pt;
Pt = (1.0 / (N - t) * SXiXit - (1.0) / ((N - t) * (N - t)) * SXi * SXit) / sqrt(DXi * DXit);
//Label7->Caption = FloatToStr(Pt);
double B;
B=1- (abs(Pt)*sqrt(1.0/N));
if ((Pt >=0) && (Pt <=1))
Label7->Caption = "Послідовність незалежна з імовірністю " +FloatToStrF(B,ffFixed,4,4) ;
else Label7->Caption = "Послідовність залежна з імовірністю "+FloatToStr(Pt) ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
Series1->Clear();
Image2->Picture->LoadFromFile("1.bmp");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Series1->Clear();
Image2->Picture->LoadFromFile("1.bmp");Button6->Visible=false;
Button4->Visible=false;
Button1->Visible=true;
Edit2->Visible=false;Edit3->Visible=false;
Label4->Visible=false;Label5->Visible=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{ Button6->Visible=false;
Button4->Visible=false;
Edit2->Visible=false;Edit3->Visible=false;
Label4->Visible=false;Label5->Visible=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Series1->Clear();
Edit2->Visible=true;Edit3->Visible=true;
Label4->Visible=true;Label5->Visible=true;
Button6->Visible=true;
Button1->Visible=false;
Series1->Clear();
Image2->Picture->LoadFromFile("1.bmp");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit3Change(TObject *Sender)
{
Series1->Clear();
Image2->Picture->LoadFromFile("1.bmp");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
Memo1->Clear();
Label6->Caption="";
Label7->Caption="";
double L=StrToInt(Edit3->Text);
double N=StrToInt(CSpinEdit1->Text);
double Xi;
double M =pow(10, 9);
Xi=StrToInt(Edit2->Text);
long double mas_m_m[100000];
for (int i = 0; i < N; i++)
{
Xi = fmod((Xi * L),M);
mas_m_m[i]= Xi/M;
if(CheckBox1->Checked)
Memo1->Text = Memo1->Text + FloatToStrF((float) mas_m_m[i],ffFixed,4,4)+" ";
Image2->Canvas->Pixels[floor(mas_m_m[i-1]*100)][floor(mas_m_m[i]*100)]=clRed;
}
int m[21];
//обнулення масиву
for(int i=0;i<20;i++)
m[i]=0;
for( int i=0;i<N;i++)
for(int j=1;j<=20;j++)
{
if(mas_m_m[i]<=0.05*j)
{m[j-1]=m[j-1]+1;
break;
}
}
//Build graph with help TChart
for(int i=0;i<20;i+=1)
{
Series1->Add((m[i]),IntToStr(i),clRed);
}
Image2->Width=100;
Image2->Height=100;
//стохастичність
double hi2 = 0;
int d = 5;
double mas1[10];
double p[10];
double cnt = 0;
int a = 0;
double dl = 1.0 / d;
for (double j = 0; j < 1; j += dl)
{
cnt = 0;
for (int i = 0; i < N; i++)
{
if (mas_m_m[i] > j && mas_m_m[i] <= (j + dl))
cnt++;
}
mas1[a] = cnt;
p[a] = mas1[a] / N;
a++;
}
for (int i = 0; i < d; i++)
if (p[i] != 0)
hi2 = hi2 + pow((mas1[i] - N * p[i]), 2) / (N * p[i]);
double hia2 = 0.352;
if (hi2 >= hia2)
Label6->Caption = "Гіпотеза не вірна";
else
Label6->Caption = Label6->Caption+" "+ "Гіпотеза вірна зі імовірністю 95";
Label6->Caption = Label6->Caption + " "+" Критерій Х2=" +FloatToStr(hi2);
double SXi = 0, SXit = 0, SXiXit = 0, SXi2 = 0, SXit2 = 0;
int t=0;
for (int i = 0; i < N - t; i++)
{
SXi += mas_m_m[i];
SXit += mas_m_m[i + t];
SXiXit += mas_m_m[i] * mas_m_m[i + t];
SXi2 += mas_m_m[i] * mas_m_m[i];
SXit2 += mas_m_m[i + t] * mas_m_m[i + t];
}
double DXi, DXit;
DXi = 1.0 / (N - t) * SXi2 - 1.0 / ((N - t) * (N - t)) * SXi * SXi;
DXit = 1.0 / (N - t) * SXit2 - 1.0 / ((N - t) * (N - t)) * SXit * SXit;
double Pt;
Pt = (1.0 / (N - t) * SXiXit - (1.0) / ((N - t) * (N - t)) * SXi * SXit) / sqrt(DXi * DXit);
//Label7->Caption = FloatToStr(Pt);
double B;
B=1- (abs(Pt)*sqrt(1.0/N));
if ((Pt >=0) && (Pt <=1))
Label7->Caption = "Послідовність незалежна з імовірністю " +FloatToStrF(B,ffFixed,4,4) ;
else Label7->Caption = "Послідовність залежна з імовірністю "+FloatToStr(Pt) ;
}
//---------------------------------------------------------------------------
Протокол роботи програми:
Серединних квадратів:
Вбудований метод:
Мультиплікативний метод:
Висновок: в даній роботі я навчився одержувати послідовності псевдовіпадковіх квазірівномірно розподілених чисел запропонованими методами та перевірка їх на рівномірність за допомогою гістограми та за непрямими ознаками.