Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#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;
}