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

vm_labs / lr_9 / LR_9

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

#define	NODES_NUM	11
#define	X		3.9336

double	Aitken(double nodes[][2], FILE *f_out);
double	Newton(double nodes[][2], FILE *f_out);
double	Lagrange(double nodes[][2], FILE *f_out);

void	main()
{
	double	nodes[NODES_NUM][2]=
			{
			{0.0840, -5.1177},
			{0.1976, -4.0530},
			{0.2304, -3.7719},
			{1.3144,  0.3633},
			{1.6712,  0.2933},
			{1.9336,  0.0661},
			{2.0808, -0.0803},
			{2.2256, -0.2141},
			{2.5096, -0.3773},
			{6.2688, 73.5201},
			{6.5072, 87.0559}
			};

	FILE *f_out;
	if ((f_out = fopen("out.txt", "w")) == NULL)
	{
		fprintf(stderr, "\nCan't open output file!\n");
		exit(1);
	}


	fprintf(f_out, "********* Aitken **********\n");
	fprintf(f_out, "\nFunction value = %10.6f\n", Aitken(nodes, f_out));

	fprintf(f_out, "\n\n********* Newton **********\n");
	fprintf(f_out, "\nFunction value = %10.6f\n", Newton(nodes, f_out));

	fprintf(f_out, "\n\n********* Lagrange **********\n");
	fprintf(f_out, "\nFunction value = %10.6f\n", Lagrange(nodes, f_out));

	fclose(f_out);
	return;
}


double	Aitken(double nodes[][2], FILE *f_out)
{
	double f;	// evaluated function value
	int	power;	// stepen vichislyaemogo mnogochlena
	int	n_mnogoch;	// kolichestvo vichislyaemih mnogochlenov
	int	i,j;
	double	y[NODES_NUM];	// mnogochleni stepeni k
	double	x1, x2;

	power = 0;
	n_mnogoch = NODES_NUM;

	// zapolnenie nachalnogo znacheniya massiva pred
	// znacheniyami Yi uzlov nodes
	for (i=0; i<NODES_NUM; i++)
		y[i] = nodes[i][1];

	// vichisleniye interp. mnogochlenov
	for (i=1; i<NODES_NUM; i++)
	{
		power++;
		n_mnogoch--;
		fprintf(f_out, "Power = %d\n", power);
		// vichisleniye mnogoch. stepeni power = i+1
		// kolichestvo mnogoch. = NODES_NUM - power + 1
		for (j=0; j < NODES_NUM - power; j++)
		{
			x1 = nodes[j][0];
			x2 = nodes[j+power][0];

			y[j] = (1 / (x2 - x1))*( (X - x1)*y[j+1] - (X - x2)*y[j] );
			fprintf(f_out, "Y(%d..%d) = %10.6f\n",j,j+power,y[j]);
		}
	}
	f = y[0];
	return f;
}


double	Newton(double nodes[][2], FILE *f_out)
{
	double	f = 0;
	double	koef[NODES_NUM],
			f0[NODES_NUM];
	int	power, n_mnogoch;
	int	i, j, k;

	power = 0;
	n_mnogoch = NODES_NUM;

	for (i=0; i<NODES_NUM; i++)
		f0[i] = nodes[i][1]; // = fi

	koef[0] = f0[0];		// = f0

	for (i=1; i<NODES_NUM; i++)
	{
		power++;
		n_mnogoch--;
		fprintf(f_out, "Power = %d\n", power);
		for (j=0; j < NODES_NUM - power; j++)
		{
			f0[j] = (f0[j+1] - f0[j]) / (nodes[j+power][0] - nodes[j][0]);
			fprintf(f_out, "F(%d..%d) = %10.6f\n", j, j+power, f0[j]);
		}
		koef[i] = f0[0];
	}

	for (i=NODES_NUM-1; i>0; i--)
	{ f = (f + koef[i]) * (X - nodes[i-1][0]); }
	f += koef[0];

	return f;
}


double	Lagrange(double nodes[][2], FILE *f_out)
{
	double f, pi;
	int	i,j;

	f = 0;
	for (i=0; i < NODES_NUM; i++)
	{
		pi = 1;
		for (j=0; j< NODES_NUM; j++)
		{
			if (j==i) continue;
			pi *= ((X - nodes[j][0])/(nodes[i][0] - nodes[j][0]));
		}
		fprintf(f_out, "P(%2d) = % 14.6f\n",i,pi);
		f += pi*nodes[i][1];
	}

	return f;
}


Соседние файлы в папке lr_9