Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
gumen_kurs / Моё_РЕЛИЗ.doc
Скачиваний:
25
Добавлен:
15.06.2014
Размер:
381.95 Кб
Скачать

Приложение 1.

#include <math.h>

#include <stdio.h>

#include <time.h>

#include <stdlib.h>

#define V_VIB 500 //объем выборки

#define KOL_INT 10 //количество интевалов

//-----------------------------------------------------------

//-----------------------------------------------------------

// Обратная функция от интеграла заданой функции плотности

//-----------------------------------------------------------

double fun_obrint(double x)

{

return (asin(1-x*x)/2);

}

//-----------------------------------------------------------

// Заданая функция плотности

//-----------------------------------------------------------

double fun_plt(double x)

{

return(sin(x)+cos(x));

}

//----------------------------------------------------------

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

//-----------------------------------------------------------

double fun_frv(double x)

{

return(sin(x)-cos(x));

}

//------------------------------------------------------------

// Минимальное/максимальное значение массива

//-------------------------------------------------------------

double arr_minmax(bool min, double *arr, int arrsize)

{

double t;

int i;

t=arr[0];

for (i=0; i<arrsize; i++)

{

if (min && t>arr[i]) t=arr[i];

if (!min && t<arr[i]) t=arr[i];

}

return t;

}

//--------------------------------------------------------------

// Entry point

//---------------------------------------------------------------

void main()

{

double sv_bsv[V_VIB]; //массив случайных величин с БСВ

double sv_gen[V_VIB]; //СВ сгенерированные прогой

double sv_min, sv_max, sv_int; //мин, макс знач-е СВ и длина интрвала

double sv_grint; //длина интервалов

double gr_int[KOL_INT+1]; //границы интервалов

double ap_teor[KOL_INT]; //значения теор ф-ции плотности

double ver[KOL_INT]; //вероятности опадания величин в интервалы

double first[50]; //первые 50 значений сгенерированой СВ

double kol_frv[KOL_INT]; //функция распр-я вер-ей сген-х вел-н

double kol_max;

double hi_kv; //хи-квадрат

double square[KOL_INT];

int ch_pop[KOL_INT]; //числа попаданий СВ в интервалы

double t;

int i, j;

FILE *f;

srand((unsigned)time(NULL));

//генерируем СВ с ГБСВ

for (i=0; i<V_VIB; i++)

{

sv_bsv[i]=rand()%1000;

sv_bsv[i]/=999;

}

//генерируем СВ с заданой функцией плотности

for (i=0; i<V_VIB; i++)

{

sv_gen[i]=fun_obrint(sv_bsv[i]);

if (i<50) first[i]=sv_gen[i];

}

sv_min=arr_minmax(true, sv_gen, V_VIB);

sv_max=arr_minmax(false, sv_gen, V_VIB);

sv_int=sv_max-sv_min;

sv_grint=sv_int/KOL_INT;

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

for (i=0; i<(KOL_INT+1); i++)

{

gr_int[i]=sv_min+sv_grint*i;

if (i<KOL_INT) ch_pop[i]=0;

}

//вычисляем количество попаданий СВ в интервалы

for (i=0; i<V_VIB; i++)

{

for (j=0; j<(KOL_INT); j++)

{

if (sv_gen[i]>=gr_int[j] && sv_gen[i]<gr_int[j+1])

{

ch_pop[j]++;

break;

}

if (j==(KOL_INT-1) && sv_gen[i]==gr_int[j+1]) ch_pop[j]++;

}

}

//вычисляем аппроксимированную теоретическую функцию плотности

//берем точку в середине интервала

for (i=0; i<KOL_INT; i++)

{

ap_teor[i]=fun_plt((gr_int[i+1]+gr_int[i])/2);

}

//вычисляем вероятность попадения СВ в заданые интервалы

for (i=0; i<KOL_INT; i++)

{

ver[i]=(double)ch_pop[i]/V_VIB;

}

//проверка генератора по критерию Колмогорова

for (i=0, kol_max=0; i<KOL_INT; i++)

{

if (i==0) kol_frv[i]=ver[i]; else kol_frv[i]=kol_frv[i-1]+ver[i];

t=fabs(kol_frv[i]-fun_frv((gr_int[i+1]+gr_int[i])/2));

if (kol_max<t) kol_max=t;

}

//проверка генератора по критерию Пирсона

for (i=0, hi_kv=0; i<KOL_INT; i++)

{

square[i]=fun_plt((gr_int[i+1]+gr_int[i])/2)*sv_grint;

hi_kv+=(ch_pop[i]-V_VIB*square[i])*(ch_pop[i]-V_VIB*square[i])/(V_VIB*square[i]);

}

//DEBUG OUTPUT

f=fopen("output.txt", "w");

for (i=0, t=0, j=0; i<KOL_INT; i++)

{

fprintf(f, "%6.5f\t%6.5f\t%6.5f\t%6.5f\n", gr_int[i], gr_int[i+1], ver[i], square[i]);

printf("%d\t%6.5f\t%6.5f\n", ch_pop[i], ver[i], kol_frv[i]);

t+=ver[i];

j+=ch_pop[i];

}

fclose(f);

f=fopen("first50.txt", "w");

for (i=0; i<50; i++)

{

fprintf(f, "%f\n", first[i]);

}

fclose(f);

f=fopen("pirkol.txt", "w");

fprintf(f, "По Колмогорову = %6.5f\n", kol_max);

fprintf(f, "По Пирсону = %6.5f\n", hi_kv);

fprintf(f, "Объем выборки = %d\n", V_VIB);

fprintf(f, "Количество интервалов = %d\n", KOL_INT);

fclose(f);

printf("\n%d\t%6.5f\t%6.5f\t%6.5f\n", j, t, kol_max, hi_kv);

getchar();

}