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

gumen_kurs / progr / =progr1= / sv1

.cpp
Скачиваний:
16
Добавлен:
15.06.2014
Размер:
4.58 Кб
Скачать
#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();
}
Соседние файлы в папке =progr1=