Добавил:
Yanus
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:gumen_kurs / progr / =progr1= / sv1
.cpp#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();
}