Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
7
Добавлен:
02.05.2014
Размер:
196.61 Кб
Скачать

Министерство Образования Российской Федерации

Уфимский Государственный Авиационный Технический Университет

Кафедра ТК

Отчет по лабораторной работе №1

по предмету «Теоретические основы автоматизации управления»

на тему: Структурно-топологические характеристики систем и их применение

Выполнил: студент

гр.Т28-320 ФИРТ

Кривошеев А.С

Проверила: Валеева Р.Г.

Уфа 2005

Цель работы

Изучение методов получения на ЭВМ равномерно распределенных псевдослучайных чисел и тестов проверки их качества.

Листинг программы:

Unit1.cpp

#include <vcl.h>

#include <stdio.h>

#include <math.h>

#pragma hdrstop

#include "Unit1.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

FILE *out;

int N;

double *x_m1;

double *x_m2;

double *x_m3;

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

N = StrToInt(Edit4->Text);

}

void TForm1:: NewHTMLReport(void)

{

fprintf(out, "<html>\n");

fprintf(out, "<head>\n");

fprintf(out, " <title>Генерация случайных чисел и проверка их качества</title>\n");

fprintf(out, " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">\n");

fprintf(out, " <style>\n");

fprintf(out, " body { font-family: Verdana; }\n");

fprintf(out, " th { font-size: 9pt; padding: 3px; background-color: #e0e0e0; }\n");

fprintf(out, " td { font-size: 9pt; padding: 3px; }\n");

fprintf(out, " </style>\n");

fprintf(out, "</head>\n");

fprintf(out, "<body>\n");

}

void TForm1:: WriteGenResults(double *x,char *label)

{

fprintf(out, "<b><font size=3 Color = darkblue>%s</font></b>",label);

fprintf(out, ",<br><b><font size=2 Color = darkblue>Сгенеренные числа</font></b>");

fprintf(out, "<table cellpadding=\"0\" cellspacing=\"0\" border=\"1\" >\n");

fprintf(out, "<tr>");

for(int i=0;i<N;i++)

{

fprintf(out, "<td>%.7f</td>",x[i]);

if(!fmodl(i+1,13)) fprintf(out, "</tr><tr>\n");

}

fprintf(out, "</tr>\n");

fprintf(out, "</table><p>");

}

double TForm1:: avq(double x,double y)

{

char x_str[256];

double fraction, integer,integer2;

strcpy(x_str,FloatToStr(x).c_str());

int x_lng = strlen(x_str) - 2;

if(fmod(x_lng,2)) x_lng++;

x_lng/=2;

double xrez = x*y*pow10(3*x_lng);

fraction = modf(xrez, &integer);

xrez = modf(integer/pow10(2*x_lng),&integer2);

return(xrez);

}

double TForm1:: DecToBin(int x)

{

int i=0,n,l;

char bin[20],arr[20];

do{

if(fmod(x,2)) bin[i] ='1';

else bin[i] = '0';

x/=2;

i++;

}while(x);

n = i;

for(l=0;l<i;l++) arr[l]=bin[--n];

arr[l] = '\0';

return(StrToFloat(arr));

}

int TForm1:: BinToDec(double x)

{

int rez=0,i=0;

modf(x,&x);

char bin[16];

strcpy(bin, FloatToStr(x).c_str());

int bin_lng = strlen(bin);

do{

rez += StrToInt(bin[bin_lng-1])*pow(2,i);

bin_lng--;i++;

}while(bin_lng);

return(rez);

}

double TForm1:: DoubleCut(double x,int g)

{

char d_arr[16];

strcpy(d_arr, FloatToStr(x).c_str());

int arr_lng = strlen(d_arr);

int cmp = arr_lng - g;

if(cmp>0)

for(int i=0;i<cmp;i++) d_arr[i] = '0';

return(StrToFloat(d_arr));

}

void TForm1::AvqMethod()

{

x_m1 = new double[N];

x_m1[0]=StrToFloat(Edit1->Text);

for(int i=0;i<N-1;i++) x_m1[i+1] = avq(x_m1[i],x_m1[i]);

WriteGenResults(x_m1,cbxAvq->Caption.c_str());

}

void TForm1::AvmMethod(void)

{

x_m2 = new double[N];

x_m2[0]=StrToFloat(Edit1->Text);

x_m2[1]=StrToFloat(Edit2->Text);

for(int i=1;i<N-1;i++) x_m2[i+1] = avq(x_m2[i],x_m2[i-1]);

WriteGenResults(x_m2,cbxAvm->Caption.c_str());

}

void TForm1::MplMethod()

{

double X0,X1;

double h=5.0,temp;

x_m3 = new double[N];

int g=8;

X0=7;

for(int i=0;i<N;i++)

{

temp=X0*h;

temp = DecToBin(temp);

X1 = DoubleCut(temp,g);

X1 = BinToDec(X1);

x_m3[i] = X1/pow(2,g);

X0=X1;

}

WriteGenResults(x_m3,cbxMpl->Caption.c_str());

}

void TForm1::RndTest(double *x)

{

int *s_ln = new int[N];

int l=0,Z=0,Zm=0;

int *z = new int[10];

double temp=0;

for(int i=0;i<N;i++) s_ln[i]=0;

for(int i=0;i<N;i++) {

if(x[i]>=0.5) s_ln[l]++;

else l++;

}

for(int t=1;t<10;t++) {

z[t]=0;

for(int k=0;k<l;k++) if(s_ln[k]==t) z[t]++;

Z+=z[t];

}

for(int l=5;l<10;l++) Zm+= z[l];

for(int l=1;l<5;l++)

temp = pow((z[l] - 9*pow10(-l)*Z),2)/(9*pow10(-l)*Z);

temp += pow((Zm - pow10(-4)*Z),2)/(pow10(-4)*Z);

double z_lim = 0.5 * (N+1 - 1.65*sqrt(N-1));

double z_pr = 0.25 * (N - 1.65*sqrt(N+1));

double l_max = 33 *(log10(N)+1);

fprintf(out, "<b><font size=2 Color = darkblue>Тест проверки \"случайности\" последовательности</b>");

fprintf(out, "<table cellpadding=\"0\" cellspacing=\"0\" border=\"1\" >\n");

fprintf(out, "<tr>");

for(int i=1;i<5;i++) fprintf(out, "<th width=60>z[%d]</th>",i);

fprintf(out, "<th width=50>z[m+1]</th>");

fprintf(out, "<th width=50>Н.гр.</th>");

fprintf(out, "<th width=50>X^2</th>");

fprintf(out, "<th width=50>В.гр.</th>");

fprintf(out, "<th width=50>Z^n</th>");

fprintf(out, "<th width=50>Zп.р,Zв.р</th>");

fprintf(out, "<th width=50>l_max</th>");

fprintf(out, "</tr><tr>\n");

for(int i=1;i<5;i++) fprintf(out,"<td>%d</td>",z[i]);

fprintf(out, "<td>%d</td>",Zm);

fprintf(out, "<td width=50>0.71</td>");

fprintf(out, "<td width=50>%.2f</td>",temp);

fprintf(out, "<td width=50>9.5</td>");

fprintf(out, "<td width=50>%f</td>",z_lim);

fprintf(out, "<td width=50>%f</td>",z_pr);

fprintf(out, "<td width=50>%.f</th>",l_max);

fprintf(out, "</tr>\n");

fprintf(out, "</table><p>");

}

void TForm1:: RsprTest(double *x)

{

int *v = new int [10];

double temp=0,E=0,D=0;

for(int l=0;l<10;l++) {

v[l]=0;

for(int i=0;i<N;i++)

if(x[i]>=l*0.1 && x[i]<(l+1)*0.1) v[l]++;

}

for(int i=0;i<10;i++) temp+= pow(v[i] - 0.1*N,2)/(0.1*N);

for(int i=0;i<N;i++) E+=x[i];

double M = E/N;

for(int i=0;i<N;i++) D+= pow(x[i] - M,2);

D/=(N-1);

fprintf(out, "<b><font size=2 Color = darkblue>Проверка равномерности закона распределения</font></b>");

fprintf(out, "<table cellpadding=\"0\" cellspacing=\"0\" border=\"1\" >\n");

fprintf(out, "<tr>");

for(int i=0;i<10;i++) fprintf(out, "<th >v[%d]</th>",i);

fprintf(out, "<th width=50>Н.гр.</th>");

fprintf(out, "<th width=50>X^2</th>");

fprintf(out, "<th width=50>В.гр.</th>");

fprintf(out, "<th width=50>M[x]</th>");

fprintf(out, "<th width=50>D</th>");

fprintf(out, "</tr><tr>\n");

for(int i=0;i<10;i++) fprintf(out, "<td>%d</td>",v[i]);

fprintf(out, "<td>3.32</td>");

fprintf(out, "<td>%.2f</td>",temp);

fprintf(out, "<td>16.9</td>");

fprintf(out, "<td>%f</td>",M);

fprintf(out, "<td>%f</td>",D);

fprintf(out, "</tr>\n");

fprintf(out, "</table><p>");

}

void TForm1:: KorrTest(double *x)

{

double tmp1=0,tmp2=0,tmp3=0;

for(int i=0;i<N;i++) {

tmp1+=(i+1)*x[i];

tmp2+=x[i];

tmp3+=pow(x[i],2);

}

double p = ((tmp1/N) - ((N+1)*tmp2)/(2*N))/(sqrt((tmp3/N - pow(tmp2/N,2))*(N*N-1)/12));

double p_max = 1.95 * (1 - p*p)/sqrt(N);

fprintf(out, "<b><font size=2 Color = darkblue>Проверка независимости последовательности</font></b>>");

fprintf(out, "<table cellpadding=\"0\" cellspacing=\"0\" border=\"1\" >\n");

fprintf(out, "<tr>");

fprintf(out, "<th width=60>P(x)</th>");

fprintf(out, "<th width=50>Zb</th>");

fprintf(out, "<th width=50>Pmax</th>");

fprintf(out, "</tr><tr>\n");

fprintf(out, "<td>%f</td>",p);

fprintf(out, "<td>1.95</td>");

fprintf(out, "<td>%f</td>",p_max);

fprintf(out, "</tr>\n");

fprintf(out, "</table><p>");

}

void __fastcall TForm1::Button1Click(TObject *Sender)

{

out = fopen("rezults.htm", "w");

NewHTMLReport();

if(cbxAvq->Checked) {

AvqMethod();

if(cbxRnd->Checked) RndTest(x_m1);

if(cbxRspr->Checked) RsprTest(x_m1);

if(cbxKorr->Checked) KorrTest(x_m1);

}

if(cbxAvm->Checked) {

AvmMethod();

if(cbxRnd->Checked) RndTest(x_m2);

if(cbxRspr->Checked) RsprTest(x_m2);

if(cbxKorr->Checked) KorrTest(x_m2);

}

if(cbxMpl->Checked) {

MplMethod();

if(cbxRnd->Checked) RndTest(x_m3);

if(cbxRspr->Checked) RsprTest(x_m3);

if(cbxKorr->Checked) KorrTest(x_m3);

}

fcloseall();

}

void __fastcall TForm1::Button2Click(TObject *Sender)

{

Close();

}

Работа программы

Сгенеренный HTML файл

Метод серединных квадратов, Сгенеренные числа

0.1234000

0.5227000

0.3215000

0.3362000

0.3030000

0.0000001

0.0000025

0.0006397

0.9214599

0.6872359

0.1710043

0.5769443

0.5838413

0.7537627

0.6172278

0.8130530

0.7457671

0.4332707

0.3892622

0.9581565

0.6389938

0.8907208

0.2596598

0.4676849

0.2948070

0.0594262

0.9440768

0.5319149

0.0004212

0.3717396

0.2215495

0.1582113

0.5770195

0.1417493

0.7236597

0.4240614

0.4836686

0.8341734

0.1471933

0.7567410

0.0142147

0.7327912

0.2192093

0.6946289

0.5178409

0.2655870

0.7843045

0.4203531

0.6013081

0.8956415

0.8007302

0.2135354

0.7212040

0.3356370

0.7908672

0.1882928

0.4663150

0.8607641

0.2716872

0.7475952

0.6441515

0.6299798

0.3034648

0.8477442

0.2955691

0.8166568

0.4626670

0.9707062

0.6755358

0.4080270

0.3940094

0.8700543

0.1570649

0.2749878

0.9430291

0.4667294

0.9106939

0.1587732

0.3901175

0.2318165

0.7141128

0.2688505

0.6246591

0.3145635

0.0110248

0.5950931

0.1212565

0.4252300

0.3487808

0.1012212

0.5689203

0.6749655

0.2283973

0.4518182

0.6240863

0.4863240

0.6660019

0.6683607

0.8864249

0.6779048

0.9413496

0.5648063

0.9941856

0.8843830

0.0990664

0.5846938

0.5206841

0.0467552

0.2408311

0.0219869

0.3767101

0.1218507

0.8339348

0.9102937

0.0055582

0.0033664

0.7956553

0.6089449

0.6442068

0.8405783

0.0615804

0.9906012

0.0413523

0.9169955

0.2793115

0.9278210

0.4279730

0.8871878

0.1048603

0.9979723

Тест проверки "случайности" последовательности

z[1]

z[2]

z[3]

z[4]

z[m+1]

Н.гр.

X^2

В.гр.

Z^n

Zп.р,Zв.р

l_max

23

7

3

1

2

0.71

1136.01

9.5

56.129801

27.778722

103

Проверка равномерности закона распределения

v[0]

v[1]

v[2]

v[3]

v[4]

v[5]

v[6]

v[7]

v[8]

v[9]

Н.гр.

X^2

В.гр.

M[x]

D

14

12

14

12

13

11

16

11

14

13

3.32

1.69

16.9

0.497798

0.088411

Проверка независимости последовательности>

P(x)

Zb

Pmax

0.089466

1.95

0.169657

Метод середины произведения, Сгенеренные числа

0.1234000

0.9876500

0.8760100

0.6499994

0.6971641

0.9567455

0.2615959

0.1692747

0.4365219

0.2842928

0.4484211

0.2819252

0.7020452

0.4909000

0.2467882

0.1713305

0.7035445

0.7849619

0.7939964

0.2023476

0.9461152

0.0615897

0.0727433

0.3140718

0.7429672

0.0710851

0.0477639

0.1037785

0.8519762

0.8794458

0.3621682

0.9571070

0.0569339

0.0481381

0.1146974

0.9687534

0.3074315

0.5471730

0.5171299

0.5490421

0.1176226

0.0228225

0.5990394

0.0050620

0.3527632

0.6776337

0.5432593

0.4176235

0.4156700

0.2416108

0.2458315

0.2970577

0.3582657

0.6744748

0.3890897

0.0672114

0.8736710

0.3048280

0.3473562

0.8518473

0.9269937

0.7847285

0.1731151

0.2293062

0.6188408

0.3916318

0.2537476

0.4045722

0.2877349

0.1251715

0.7824017

0.5481121

0.9452895

0.1077583

0.8934378

0.9064664

0.4116035

0.2629024

0.7945906

0.0172758

0.4376557

0.8687301

0.5632382

0.9104583

0.6348606

0.2417358

0.9774491

0.7346028

0.7941681

0.2425697

0.2596228

0.7133029

0.3660246

0.7762699

0.8232870

0.4740549

0.7598936

0.0316955

0.2404292

0.3390440

0.8854304

0.4168000

0.0782847

0.6405997

0.7634648

0.0780755

0.7709590

0.2173158

0.6579842

0.9673403

0.0158319

0.7687863

0.9872901

0.0124579

0.3880823

0.7976023

0.2848310

0.6182847

0.6067636

0.0424254

0.0680826

0.0444237

0.8268103

0.1609007

0.6073164

0.9205633

0.4672345

0.0429020

0.5067964

0.9100854

Тест проверки "случайности" последовательности

z[1]

z[2]

z[3]

z[4]

z[m+1]

Н.гр.

X^2

В.гр.

Z^n

Zп.р,Zв.р

l_max

16

9

5

1

1

0.71

343.25

9.5

56.129801

27.778722

103

Проверка равномерности закона распределения

v[0]

v[1]

v[2]

v[3]

v[4]

v[5]

v[6]

v[7]

v[8]

v[9]

Н.гр.

X^2

В.гр.

M[x]

D

19

10

18

12

11

8

11

17

10

14

3.32

10.00

16.9

0.478464

0.094537

Проверка независимости последовательности>

P(x)

Zb

Pmax

0.046586

1.95

0.170655

Мультипликативный метод, Сгенеренные числа

0.1367188

0.6835938

0.4179688

0.0898438

0.4492188

0.2460938

0.2304688

0.1523438

0.7617188

0.8085938

0.0429688

0.2148438

0.0742188

0.3710938

0.8554688

0.2773438

0.3867188

0.9335938

0.6679688

0.3398438

0.6992188

0.4960938

0.4804688

0.4023438

0.0117188

0.0585938

0.2929688

0.4648438

0.3242188

0.6210938

0.1054688

0.5273438

0.6367188

0.1835938

0.9179688

0.5898438

0.9492188

0.7460938

0.7304688

0.6523438

0.2617188

0.3085938

0.5429688

0.7148438

0.5742188

0.8710938

0.3554688

0.7773438

0.8867188

0.4335938

0.1679688

0.8398438

0.1992188

0.9960938

0.9804688

0.9023438

0.5117188

0.5585938

0.7929688

0.9648438

0.8242188

0.1210938

0.6054688

0.0273438

0.1367188

0.6835938

0.4179688

0.0898438

0.4492188

0.2460938

0.2304688

0.1523438

0.7617188

0.8085938

0.0429688

0.2148438

0.0742188

0.3710938

0.8554688

0.2773438

0.3867188

0.9335938

0.6679688

0.3398438

0.6992188

0.4960938

0.4804688

0.4023438

0.0117188

0.0585938

0.2929688

0.4648438

0.3242188

0.6210938

0.1054688

0.5273438

0.6367188

0.1835938

0.9179688

0.5898438

0.9492188

0.7460938

0.7304688

0.6523438

0.2617188

0.3085938

0.5429688

0.7148438

0.5742188

0.8710938

0.3554688

0.7773438

0.8867188

0.4335938

0.1679688

0.8398438

0.1992188

0.9960938

0.9804688

0.9023438

0.5117188

0.5585938

0.7929688

0.9648438

0.8242188

0.1210938

0.6054688

0.0273438

0.1367188

0.6835938

Тест проверки "случайности" последовательности

z[1]

z[2]

z[3]

z[4]

z[m+1]

Н.гр.

X^2

В.гр.

Z^n

Zп.р,Zв.р

l_max

12

8

0

2

4

0.71

6312.81

9.5

56.129801

27.778722

103

Проверка равномерности закона распределения

v[0]

v[1]

v[2]

v[3]

v[4]

v[5]

v[6]

v[7]

v[8]

v[9]

Н.гр.

X^2

В.гр.

M[x]

D

12

15

12

12

14

12

15

12

12

14

3.32

1.23

16.9

0.502464

0.083961

Проверка независимости последовательности>

P(x)

Zb

Pmax

0.148262

1.95

0.167267

Вывод: