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

vm_labs / lr_7 / LR_7

.CPP
Скачиваний:
5
Добавлен:
09.02.2015
Размер:
4.77 Кб
Скачать
#include	<conio.h>
#include	<stdio.h>
#include	<stdlib.h>
#include	<math.h>

#define		_n0	4
#define		_a	M_PI_4
#define		_b	M_PI_2

double	F(double x);

double	rectang(double a, double b, int n);

double	trapec(double a, double b, int n);

double	simpson(double a, double b, int n);

void	runge_rect(double eps, FILE *f_out);

void	runge_trap(double eps, FILE *f_out);

void	runge_simp(double eps, FILE *f_out);

//*************************************************
void	main()
{
	double	eps;
	int	i;

//*************************************************
	FILE *f_out1, *f_out2, *f_out3;

	if ((f_out1 = fopen("out1.txt","w")) == NULL)
	{
		fprintf(stderr, "\nCan't open out1.txt\n");
		exit(1);
	}
	if ((f_out2 = fopen("out2.txt","w")) == NULL)
	{
		fprintf(stderr, "\nCan't open out2.txt\n");
		exit(1);
	}
	if ((f_out3 = fopen("out3.txt","w")) == NULL)
	{
		fprintf(stderr, "\nCan't open out3.txt\n");
		exit(1);
	}
//*************************************************

	clrscr();

	eps = 0.01;

	for (i=0; i<3; i++)
	{
		runge_rect(eps,f_out1);
		runge_trap(eps,f_out2);
		runge_simp(eps,f_out3);
		eps /= 10;
	}





	fclose(f_out1);
	fclose(f_out2);
	fclose(f_out3);
	return;
}
//*************************************************


//*************************************************
double	F(double x)
{
	return log(sin(x));
}
//*************************************************


//*************************************************
double	rectang(double a, double b, int n)
{
	double	integral = 0,
		h = (b-a)/n,
		x=a;
	int	i;

	if (n%2>0)
	{
		fprintf(stderr, "\nWrong n value!\n");
		exit(1);
	}

	x = a + h/2;
	for (i=0; i<n; i++)
	{
		integral += F(x);
		x += h;
	}
	integral *= h;

	return integral;
}
//*************************************************


//*************************************************
double	trapec(double a, double b, int n)
{
	double	integral = 0,
		h = (b-a)/n,
		xi,xi1;
	int	i;

	if (n%2>0)
	{
		fprintf(stderr, "\nWrong n value!\n");
		exit(1);
	}

	xi = a;
	xi1 = a + h;
	for (i=0; i<n; i++)
	{
		integral += F(xi) + F(xi1);
		xi = xi1;
		xi1 += h;
	}

	integral *= h/2;

	return integral;
}
//*************************************************


//*************************************************
double	simpson(double a, double b, int n)
{
	double	integral = 0,
		h = (b-a)/n,
		x=a;
	int	i;

	if (n%2>0)
	{
		fprintf(stderr, "\nWrong n value!\n");
		exit(1);
	}


	x = a;
	for (i=0; i<n/2-1; i++)
	{
		integral += F(x);
		x += h;
		integral += 4*F(x);
		x += h;
		integral += F(x);
	}

	integral *= h/3;

	return integral;
}
//*************************************************


//*************************************************
void	runge_rect(double eps, FILE *f_out)
{
	int	n=_n0, n_2 = _n0/2, i;
	double	pogr;
	double	I_n,I_n_2;
	fprintf(f_out,"\n\n************ Rectangle *****************\n");
	fprintf(f_out,"Eps = %.4f\n",eps);
	fprintf(f_out,"N\tI(n)\t\tI(n/2)\t\t|I(n)-I(n/2)|/3\n");

	pogr = eps*2;
	I_n_2 = rectang(_a,_b,n_2);
	for (i=0; (i<100) && (pogr>eps); i++)
	{
		I_n = rectang(_a,_b,n);
		pogr = fabs(I_n-I_n_2)/3;

		fprintf(f_out, "%d\t% -.6f\t% -.6f\t% -.6f\n",n,I_n,I_n_2,pogr);

		n_2 = n;
		n *= 2;
		I_n_2 = I_n;
	}

	return;
}
//*************************************************


//*************************************************
void	runge_trap(double eps, FILE *f_out)
{
	int	n=_n0, n_2 = _n0/2, i;
	double	pogr;
	double	I_n,I_n_2;
	fprintf(f_out,"\n\n************** Trapec ******************\n");
	fprintf(f_out,"Eps = %.4f\n",eps);
	fprintf(f_out,"N\tI(n)\t\tI(n/2)\t\t|I(n)-I(n/2)|/3\n");

	pogr = eps*2;
	I_n_2 = trapec(_a,_b,n_2);
	for (i=0; (i<100) && (pogr>eps); i++)
	{
		I_n = trapec(_a,_b,n);
		pogr = fabs(I_n-I_n_2)/3;

		fprintf(f_out, "%d\t% -.6f\t% -.6f\t% -.6f\n",n,I_n,I_n_2,pogr);

		n_2 = n;
		n *= 2;
		I_n_2 = I_n;
	}

	return;
}
//*************************************************


//*************************************************
void	runge_simp(double eps, FILE *f_out)
{
	int	n=_n0, n_2 = _n0/2, i;
	double	pogr;
	double	I_n,I_n_2;
	fprintf(f_out,"\n\n************** Simpson *****************\n");
	fprintf(f_out,"Eps = %.4f\n",eps);
	fprintf(f_out,"N\tI(n)\t\tI(n/2)\t\t|I(n)-I(n/2)|/15\n");

	pogr = eps*2;
	I_n_2 = simpson(_a,_b,n_2);
	for (i=0; (i<100) && (pogr>eps); i++)
	{
		I_n = simpson(_a,_b,n);
		pogr = fabs(I_n-I_n_2)/15;

		fprintf(f_out, "%d\t% -.6f\t% -.6f\t% -.6f\n",n,I_n,I_n_2,pogr);

		n_2 = n;
		n *= 2;
		I_n_2 = I_n;
	}

	return;
}
//*************************************************
Соседние файлы в папке lr_7