Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаба 1,2.docx
Скачиваний:
16
Добавлен:
21.03.2015
Размер:
319.76 Кб
Скачать

Лаба2 Краткая теоретическая часть

Проверка статистических гипотез заключается в том, что необходимо подтвердить или опровергнуть утверждение, что заданная выборка из элементов принадлежит некоторому распределению с заданным параметром, который показывает вероятностную ошибку. Для датчиков псевдослучайных чисел это означает, что нужно определить, будет ли генерируемая ими последовательность значений принадлежать соответствующему закону распределения.

Существует не один десяток критериев проверки гипотез. Наиболее популярные из них следующие: критерий согласия , критерий Крамера-фон Мизеса, критерий Колмогорова-Смирнова. В данной лабораторной работе мы будем использовать последний критерий.

Критерий Колмогорова-Смирнова хорошо зарекомендовал себя для выборок объемом от 10 до 100 элементов. Он применяется в тех случаях, когда проверяемое распределение непрерывно и известно среднее значение и дисперсия проверяемой совокупности.

Для проверки гипотезы по критерию Колмогорова-Смирнова необходимо подготовить исходные данные, которые можно собрать в таблице следующего вида.

Табл. 1. Исходные данные для проверки гипотезы по критерию Колмогорова-Смирнова

Событие

Наблюд-я частота

Наблюд-я вер-ть

Теор-я вер-ть

Наблюд-е распр-е

Теор-е распр-е

Абсол-я разность

В таблице использованы следующие значения:

- полученное датчиком псевдослучайное число;

- количество интервалов разбиения исходного отрезка- количество рассматриваемых событий;

- интервал, которому принадлежит. Объединение интервалов длядолжно быть равно.

- абсолютная наблюдаемая частота; показывает, сколько раз произошло событие;

- относительная наблюдаемая частота;

- вычисляется как определенный интеграл функции плотности вероятностей по отрезку.

Из полученной таблицы в последней колонке необходимо взять наибольшую абсолютную разность . Данное значение проверяется с соответствующим критическим значением для заданной вероятностной ошибки-. Если, то гипотеза верна, в противном случае – нет.

Ниже приведена таблица Критических чисел Колмогорова-Смирнова.

Степень свободы (объем выборки)

0,10

0,05

0,01

1

0,950

0,975

0,995

2

0,776

0,842

0,929

3

0,642

0,708

0,828

4

0,564

0,624

0,733

5

0,510

0,565

0,669

6

0,470

0,521

0,618

7

0,438

0,486

0,577

8

0,411

0,457

0,543

9

0,388

0,432

0,514

10

0,368

0,410

0,490

11

0,352

0,391

0,468

12

0,338

0,375

0,450

13

0,325

0,361

0,433

14

0,314

0,349

0,418

15

0,304

0,338

0,404

16

0,295

0,328

0,392

17

0,286

0,318

0,381

18

0,278

0,309

0,371

19

0,272

0,301

0,363

20

0,264

0,294

0,356

25

0,240

0,270

0,320

30

0,220

0,240

0,290

35

0,210

0,230

0,270

Более 35

Реализация:

#include "stdafx.h"

#include "conio.h"

#include "math.h"

double rundum (long b){

long y;

double r;

y = b*1220703125;

if (y < 0){

y+=1073741824;

y+=1073741824;

};

r = y*0.4656613/1000000000;

return r;

};

void rm (void){

//количество рассчитанных случайных чисел

double x[1000];

//границы интервалов для равномерного распределения

double m[2][10] = {{0.0,0.1,0.15,0.20,0.21,0.3,0.46,0.64,0.7,0.91},{0.1,0.15,0.20,0.21,0.3,0.46,0.64,0.7,0.91,1}};

//сколько раз попадает в каждый интервал

int p[10] = {0,0,0,0,0,0,0,0,0,0};

//относительная частота попадания

double pp[10];

//значение определенного интеграла функции плотности вероятности

double ppp[10];

//абсолютная разность

double delta[10];

//максимум по дельтам

double max_delta;

double alfa[3]={0.368,0.41,0.49};

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

x[i] = rundum(i+267);

};

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

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

if (x[i] >= m[0][j] && x[i] < m[1][j]){

p[j] = p[j] + 1;

};

};

};

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

pp[i]=p[i]*0.001;

ppp[i]=abs(m[1][i]-m[0][i]);

delta[i] = abs(ppp[i]-pp[i]);

};

max_delta = delta[0];

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

if (delta[i]>max_delta) max_delta=delta[i];

};

printf ("Ravnomernoe:\nnum\tdlina\tn_ver\t\tt_ver\t\tdelta\n");

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

printf ("%d\t%g\t%f\t%f\t%f\n", i,abs(m[1][i]-m[0][i]) ,pp[i],ppp[i],delta[i]);

};

printf("\nNaibolshee otklonenie: %f\n\n",max_delta);

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

if (max_delta<alfa[i]){

printf("dlja alfa = %g gipoteza verna\n",alfa[i]);

};

};

};

void norm (void){

//количество рассчитанных случайных чисел

double x[100];

//границы интервалов для равномерного распределения

double m[2][100];

//сколько раз попадает в каждый интервал

int p[100];

//переменные для накопления суммы, мат ожидание, дисперсия

double a=0, M=0.5, D=0.15;

//массив с нормально распределенными числами

double s[1000];

//относительная частота попадания

double pp[100];

//значение определенного интеграла функции плотности вероятности

double ppp[100];

//абсолютная разность

double delta[10];

//максимум по дельтам

double max_delta;

double dop_pp[10];

double dop_ppp[10];

int i_min, i_max;

double alfa[3]={0.368,0.41,0.49};

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

p[i] = 0;

ppp[i] = 0;

};

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

dop_pp[i] = 0;

dop_ppp[i] = 0;

};

//расчет чисел и заполнение массива

for (int j=0; j<1000; j++){

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

x[i] = rundum(i*j+834);

a += x[i];

};

s[j] = M+(a-50)*D;

a=0;

}

//расчет границ интервалов

m[0][0] = 0;

m[1][99] = 1;

double shag;

shag = (m[1][99]-m[0][0])/100;

for (int i=1; i<100; i++){

m[0][i]=m[0][i-1]+shag;

};

for (int i=98; i>=0; i--){

m[1][i]=m[1][i+1]-shag;

};

//подсчет сколько чисел попадает в каждый интервал

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

for (int j = 0; j < 1000; j++){

if (s[j] >= m[0][i] && s[j] < m[1][i]){

p[i] = p[i] + 1;

};

};

};

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

pp[i] = p[i]*0.001;

};

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

ppp[i]=abs(m[1][i]-m[0][i])*0.5*(pp[i]+pp[i+1]);

};

ppp[99]=abs(m[1][99]-m[0][99])*pp[99];

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

i_min = i*10;

i_max = (i+1)*10;

for (int j=0; j<100; j++){

if (j>=i_min && j<i_max){

dop_pp[i]=dop_pp[i]+pp[j]*0.01;

dop_ppp[i]=dop_ppp[i]+ppp[j];

};

};

};

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

delta[i] = abs(dop_ppp[i]-dop_pp[i]);

};

max_delta = delta[0];

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

if (delta[i]>max_delta) max_delta=delta[i];

};

printf ("Normalnoe:\nnum\tdlina\tn_ver\t\tt_ver\t\tdelta\n");

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

printf ("%d\t%g\t%f\t%f\t%f\n", i,abs(m[1][i]-m[0][i]),dop_pp[i],dop_ppp[i],delta[i]);

};

printf("\nNaibolshee otklonenie: %f\n\n",max_delta);

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

if (max_delta<alfa[i]){

printf("dlja alfa = %g gipoteza verna\n",alfa[i]);

};

};

};

void exp (void){

//массив экспотенциально распределенных случайных чисел

double x[1000];

//границы интервалов для равномерного распределения

double m[2][100];

//сколько раз попадает в каждый интервал

int p[100];

//переменные для накопления суммы, мат ожидание, дисперсия

double a=0, M=0.5, D=0.15;

//относительная частота попадания

double pp[100];

//значение определенного интеграла функции плотности вероятности

double ppp[100];

//абсолютная разность

double delta[10];

//максимум по дельтам

double max_delta;

double dop_pp[10];

double dop_ppp[10];

int i_min, i_max;

double alfa[3]={0.368,0.41,0.49};

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

p[i] = 0;

ppp[i] = 0;

};

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

dop_pp[i] = 0;

dop_ppp[i] = 0;

};

//расчет и заполнение массива

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

x [i] = -log(rundum(i+67))*M;

};

//расчет границ интервалов

m[0][0] = 0;

m[1][99] = 1;

double shag;

shag = (m[1][99]-m[0][0])/100;

for (int i=1; i<100; i++){

m[0][i]=m[0][i-1]+shag;

};

for (int i=98; i>=0; i--){

m[1][i]=m[1][i+1]-shag;

};

//подсчет сколько чисел попадает в каждый интервал

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

for (int j = 0; j < 1000; j++){

if (x[j] >= m[0][i] && x[j] < m[1][i]){

p[i] = p[i] + 1;

};

};

};

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

pp[i] = p[i]*0.001;

};

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

ppp[i]=abs(m[1][i]-m[0][i])*0.5*(pp[i]+pp[i+1]);

};

ppp[99]=abs(m[1][99]-m[0][99])*pp[99];

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

i_min = i*10;

i_max = (i+1)*10;

for (int j=0; j<100; j++){

if (j>=i_min && j<i_max){

dop_pp[i]=dop_pp[i]+pp[j]*0.01;

dop_ppp[i]=dop_ppp[i]+ppp[j];

};

};

};

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

delta[i] = abs(dop_ppp[i]-dop_pp[i]);

};

max_delta = delta[0];

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

if (delta[i]>max_delta) max_delta=delta[i];

};

printf ("Expotencialnoe:\nnum\tdlina\tn_ver\t\tt_ver\t\tdelta\n");

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

printf ("%d\t%g\t%f\t%f\t%f\n", i,abs(m[1][i]-m[0][i]),dop_pp[i],dop_ppp[i],delta[i]);

};

printf("\nNaibolshee otklonenie: %f\n\n",max_delta);

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

if (max_delta<alfa[i]){

printf("dlja alfa = %g gipoteza verna\n",alfa[i]);

};

};

};

int _tmain(int argc, _TCHAR* argv[])

{

rm();

norm();

exp();

getchar();

return 0;

}

Результат:

Вывод:критические значения для заданной вероятностной ошибкине превосходят табличных допустимых значений, следовательно гипотеза подтверждена.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]