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

gumen_kurs / progr / =progr3= / func3

.cpp
Скачиваний:
16
Добавлен:
15.06.2014
Размер:
12.51 Кб
Скачать
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <iostream.h>

#define n 500		// MAX количество точек апроксимации начальной функции плотности
#define n_v 5000	// размер выборки св  
#define m 100		// количество карманов 
#define n_i 10		// количество интервалов 

void main (void) 
{
	float tmp;			// временная переменная
	float tmp2;			// временная переменная

	int n_real=0;		// рельное число точек апроксимации
	int m_real;			// реальное количество карманов
	
	float integral;		// интеграл
	float y_min=0;		// минимальное значение св
	float y_max;		// максисмальное значение св

	float kolm;			// метрика по КОЛМОГОРОВУ
	float pirs;			// метрика по ПИРСОНУ

	int i=0;			// счетчик итераций
	int j=0;			// счетчик итераций

	float mas_y[2][n];  // массив значений функции плотности и её переменной 

	//--- Массив элементарных интегралов ---
	// [0] - нижняя граница
	// [1] - верхняя граница
	// [2] - интреграл от верхней до нижней границы
	float mas_integr[3][n-1]; 
	//--- Конец массива элементарных интегралов ---

	//--- Массив значений функции распределения вероятностей и её переменная ---
	// [0] - нижняя граница
	// [1] - верхняя граница
	// [2] - интреграл от верхней до нижней границы + все предыдущие интегралы
	float mas_fy[3][n];			
	//--- Конец массива значений функции распределения вероятностей и её переменных ---

	//--- Массив значений функции распределения вероятностей для сформированной св и её переменная ---
	// [0] - нижняя граница
	// [1] - верхняя граница
	// [2] Количество попаданий св и интервал от верхней границы до нуля деленное на размер выборки
	float mas_fy_sv[3][n];			
	int   mas_fy_sv_count[n]; // количество по интервалам
	//--- Конец массива значений функции распределения вероятностей ---

	float mas_bsv[n_v];		// массив значений БСВ

	//--- Массив карманов ---
	// [0] нижний предел кармана 
	// [1] верхний предел кармана
	// [2] объем кармана
	// [3] длинна кармана
	float mas_karman[4][m];	
	//--- Конец массива карманов ---

	float karman_vel;	// объем (интеграл, площадь) кармана
	float karman_real;	// объем текущего кармана
	
	//--- Массив карманов соответствия---
	// [0] Номер п/п
	// [1] Верхняя граница по СВ
	// [2] Верхняя граница по БСВ
	float mas_karman_sootv[3][m];
	//--- Конец массива карманов соответствия ---
	
	float mas_sv[n_v];	// массив случайной величины

	//--- Массив числа попаданий св в интервалы ---
	// [0] Нижняя граница интервала
	// [1] Верхняя граница интервала
	// [2] Количество попаданий случайной величины в интервал
	float mas_i[3][n_i];
	float mas_i_Pk[3][n_i]; // то же само, но для первоначальной функции
	//--- Конец массива попаданий св в интервалы ---

	FILE *f1, *f2, *f3, *f4, *f5;

	srand((unsigned)time(NULL));

	//--- Ввод из файла file1.txt ------------------------------------
	//----------------------------------------------------------------
	//-- Первый столбец = значения случайной величины               --
	//-- Второй столбец = вероятность этой сл. величины             --
	//----------------------------------------------------------------
	if((f1=fopen("file1.txt","r"))==NULL) {
		printf("NO!!!\n");
	} else {
		for(i=0; i<n; i++) {
			fscanf(f1,"%f",&mas_y[0][i]);
			fscanf(f1,"%f",&mas_y[1][i]);
		}
		fclose(f1);
	}
	//--- Конец ввода из файла file1.txt -----------------------------

	//--- Генерция БСВ ---
	for (i=0, tmp=0; i<n_v; i++)
	{
		tmp=(float)(rand()%100);
		tmp/=99;
		mas_bsv[i]=tmp;
	}
	//--- Конец генерции БСВ ---

	//--- Вычисление элементарных интегралов ---------
	//-- общего интеграла, и фактическое количество --
	//-- точек апроксимации --------------------------
	for (i=1, integral=0, tmp=0; i<n; i++) {
		mas_integr[0][i-1]=mas_y[0][i-1];
		mas_integr[1][i-1]=mas_y[0][i];
		tmp = ( (mas_y[0][i]-mas_y[0][i-1]) * (mas_y[1][i]+mas_y[1][i-1])/2 );
		integral += tmp;
		if (integral<1.000000000) {
			mas_integr[2][i-1]=tmp;
		} else {
			mas_integr[2][i-1]=float(integral-1.000000000);
			n_real = i;
			y_max  = mas_y[0][i];
			break;
		}
	}
	//--- Конец вычисления элементарных интегралов ---

	//--- Вычисление функции распределения вероятностей ---
	for (i=0, tmp=0; i<n_real; i++) {
		mas_fy[0][i]=mas_integr[0][i];
		mas_fy[1][i]=mas_integr[1][i];
		tmp+=mas_integr[2][i];
		mas_fy[2][i]=tmp;
	}
	//--- Конец вычисления функции распределения вероятностей ---

	//--- Вычисление пределов карманов на основе количества корманов ---
	karman_vel=1;
	karman_vel/=m;
	for (i=0, karman_real=0, j=0; i<n_real; i++) {
		if (karman_real==0) {
			mas_karman[0][j]=mas_integr[0][i];
		}
		karman_real+=mas_integr[2][i];
		if (karman_real>karman_vel) {
			mas_karman[1][j] = mas_integr[1][i];
			mas_karman[2][j] = karman_real;
			mas_karman[3][j] = mas_karman[1][j]-mas_karman[0][j];
			karman_real=0;
			j++;				
		}
	}
	m_real = j;
	//--- Конец вычисления пределов карманов ---

	//--- Вычисление соответствия номерами карманов и БСВ ---
	tmp=y_max/(m_real);
	tmp2=float((1.0)/(m_real));
	mas_karman_sootv[0][0]=float(0);
	mas_karman_sootv[1][0]=tmp;
	mas_karman_sootv[2][0]=tmp2;
	for (i=1; i<m_real; i++) {
		mas_karman_sootv[0][i]=float(i);
		mas_karman_sootv[1][i]=mas_karman_sootv[1][i-1]+tmp;
		mas_karman_sootv[2][i]=mas_karman_sootv[2][i-1]+tmp2;
	}
	//--- Конец вычисления соответствия номерами карманов и БСВ ---

	//--- Вычисление СВ ---
	for (i=0; i<n_v; i++) {
		for (j=0; j<=m_real; j++) {
			if (mas_karman_sootv[2][j]>=mas_bsv[i]) {
				mas_sv[i]=mas_karman[0][j]+(mas_karman[3][j]*mas_bsv[n_v-i-1]);
				break;
			}
		}
	}
	//--- Конец вычисления СВ ---

	//----------------------------------------------------------------
	//--- Вычисление числа попаданий св в интервалы ------------------
	tmp=float((y_max-y_min)/n_i);

	//*** Обнуление массива и задание первоначальных значений ********
	for (i=0, tmp2=0; i<n_i; i++, tmp2+=tmp) {
		mas_i[0][i]=tmp2;
		mas_i[1][i]=tmp2+tmp;
		mas_i[2][i]=0;
	}
	//****************************************************************
	
	for (i=0; i<n_v; i++) {
		for (j=0; j<n_i; j++) {
			if ((mas_sv[i]>=mas_i[0][j])&&(mas_sv[i]<mas_i[1][j])) {
				mas_i[2][j]++;
				break;
			}
		}
	}
	//--- Конец вычисления числа попаданий св в интревалы ------------
	//----------------------------------------------------------------

	//----------------------------------------------------------------
	//--- ВЫВОД в файл func3_fun.txt ---------------------------------
	//----------------------------------------------------------------
	//-- Первый столбец = нижняя граница интервла	                --
	//-- Второй столбец = верхняя граница интервла	                --
	//-- Третий столбец = количество св попавших в интервал			--
	//----------------------------------------------------------------
	if((f2=fopen("func3_fun.txt","w"))==NULL) {
		printf("NO!!!\n");
	} else {
		for(i=0; i<n_real; i++) {
			fprintf(f2,"%f %f\n", mas_y[0][i],mas_y[1][i]);
		}
		fclose(f2);
	}
	//--- КОНЕЦ ВЫВОДА в файл func3_fun.txt --------------------------
	//----------------------------------------------------------------

	//----------------------------------------------------------------
	//--- ВЫВОД в файл func3_sv.txt ----------------------------------
	//----------------------------------------------------------------
	//-- Первый столбец = нижняя граница интервла	                --
	//-- Второй столбец = верхняя граница интервла	                --
	//-- Третий столбец = количество св попавших в интервал			--
	//----------------------------------------------------------------
	if((f3=fopen("func3_sv.txt","w"))==NULL) {
		printf("NO!!!\n");
	} else {
		for(i=0; i<n_i; i++) {
			fprintf(f3,"%f %f %f\n", mas_i[0][i],mas_i[1][i],mas_i[2][i]);
		}
		fclose(f3);
	}
	//--- КОНЕЦ ВЫВОДА в файл func3_sv.txt ---------------------------
	//----------------------------------------------------------------

	//----------------------------------------------------------------
	//--- ВЫВОД в файл func3_first50.txt -----------------------------
	//----------------------------------------------------------------
	//-- Первые 50 случайных величин ---------------------------------
	if((f3=fopen("func3_first50.txt","w"))==NULL) {
		printf("NO!!!\n");
	} else {
		for(i=0; i<50; i++) {
			fprintf(f3,"%f\n", mas_sv[i]);
		}
		fclose(f3);
	}
	//--- КОНЕЦ ВЫВОДА в файл func3_first50.txt ----------------------
	//----------------------------------------------------------------

	//----------------------------------------------------------------------------------
	//--- Вычисление по КОЛМОГОРОВУ ----------------------------------------------------

	for (i=0; i<n_real; i++) {
		mas_fy_sv[0][i]=mas_fy[0][i];
		mas_fy_sv[1][i]=mas_fy[1][i];
		mas_fy_sv_count[i]=0;
	}
	for (i=0; i<n_v; i++) {
		for (j=0; j<n_real; j++) {
			if ((mas_sv[i]>=mas_fy_sv[0][j])&&(mas_sv[i]<mas_fy_sv[1][j])) {
				mas_fy_sv_count[j]++;
				break;
			}
		}
	}
	for (i=0, j=0, tmp=0; i<n_real; j+=mas_fy_sv_count[i], i++) {
		tmp=float(mas_fy_sv_count[i]+j);
		tmp/=n_v;
		mas_fy_sv[2][i]=tmp;
	}
	//*** Сравнение ***************************************************************
	for (i=0, kolm=0, tmp=0; i<n_real; i++) {
		tmp=float(fabs(mas_fy_sv[2][i]-mas_fy[2][i]));
		if (tmp>kolm) {
			kolm=tmp;
		}
	}
	//*****************************************************************************

	//--- Конец вычисления по КОЛМОГОРОВУ -----------------------------------------
	//-----------------------------------------------------------------------------

	//--- РЕЗУЛЬТАТ ПО КОЛМОГОРОВУ в файл kolm.txt ---
	if((f4=fopen("kolm.txt","w"))==NULL) {
		printf("NO!!!\n");
	} else {
		fprintf(f4,"Максимальное отклонение по КОЛМОГОРОВУ = %f \n",kolm);
		fprintf(f4,"Объем выборки = %d \n",n_v);
		//fprintf(f4,"Количество интервалов = %d \n",n_real);
		fclose(f4);
	}
	//--- КОНЕЦ РЕЗУЛЬТАТА ПО КОЛМОГОРОВУ в файл kolm.txt ---

	//*******************************************************************************
	//*** Вычисление по ПИРСОНУ *****************************************************

	//****  Вариант 1  ************
	// n_v					->	N
	// n_real-1				->	M
	// mas_integr[2][k]		->	Pk  
	// mas_fy_sv_count[k]	->	Nk
	//*****************************
	/*
	for (i=1, pirs=0, tmp=0; i<n_real; i++) {
		tmp=n_v*mas_integr[2][i];
		pirs+=float(pow((mas_fy_sv_count[i]-tmp),2)/tmp);
	}
	*/

	//****  Вариант 2  ************
	// n_v					->	N
	// n_i					->	M
	// mas_i[3][n_i]		->	Nk
	// mas_i_Pk[3][n_i]		->	Pk ; для формирования исп-ся -> mas_integr[3][n_real]; 
	//*****************************

	for (i=0; i<n_i; i++) {
		mas_i_Pk[0][i]=mas_i[0][i]; 
		mas_i_Pk[1][i]=mas_i[1][i];
		mas_i_Pk[2][i]=0;
	}

	for (i=0, j=0; i<n_real; i++) {
		if (mas_integr[1][i]>mas_i_Pk[1][j]) {
			j++;
		}
		mas_i_Pk[2][j]+=mas_integr[2][i];
	}
	
	for (i=1, pirs=0, tmp=0; i<n_i; i++) {
		tmp=n_v*mas_i_Pk[2][i];
		pirs+=float(pow((mas_i[2][i]-tmp),2)/tmp);
	}

	if((f5=fopen("pirs.txt","w"))==NULL) 
	{
		printf("NO!!!\n");
	} else {
		fprintf(f5,"Величина ХИ-квадрат для критерия согласия Пирсона = %f \n",pirs);
		fprintf(f5,"Объем выборки = %d \n",n_v);
		fprintf(f5,"Количество карманов = %d \n",m_real);
		fprintf(f5,"Количество интервалов = %d \n",n_i);
		fclose(f5);
	  }

	//*** Конец Вычисления по Пирсону ***********************************************
	//*******************************************************************************


	//----------------------------------------------------------------
	//--- ВЫВОД в файл func3_sv_parent.txt ---------------------------
	//----------------------------------------------------------------
	//-- Первый столбец = нижняя граница интервла	                --
	//-- Второй столбец = верхняя граница интервла	                --
	//-- Третий столбец = количество св попавших в интервал			--
	//----------------------------------------------------------------
	if((f2=fopen("func3_sv_parent.txt","w"))==NULL) {
		printf("NO!!!\n");
	} else {
		for(i=0; i<n_i; i++) {
			fprintf(f2,"%f %f %f \n", mas_i_Pk[0][i], mas_i_Pk[1][i], mas_i_Pk[2][i]);
		}
		fclose(f2);
	}
	//--- КОНЕЦ ВЫВОДА в файл func3_sv_parent.txt --------------------
	//----------------------------------------------------------------
}


	
Соседние файлы в папке =progr3=
  • #
    15.06.20145.63 Кб19file.xls
  • #
    15.06.20148.11 Кб17file1.txt
  • #
    15.06.201412.51 Кб16func3.cpp
  • #
    15.06.20143.39 Кб15func3.dsp
  • #
    15.06.2014535 б15func3.dsw
  • #
    15.06.201441.98 Кб15func3.ncb
  • #
    15.06.201449.66 Кб16func3.opt
  • #
    15.06.2014731 б15func3.plg