#include "stdio.h"
#include "conio.h"
#define N 4
main()
{
double x[N+1] = {0.4, 0.55, 0.8, 0.9, 1};
double y[N+1] = {0.41075, 0.57815, 0.88811, 1.02652, 1.17520};
double varx = 0.5;
int checkvalid ( double x[], int n );
double Lagrange (double x[], double y[], double varx, int n );
void Print(double x[], double y[]);
if (checkvalid ( x, N ) == 1 )
{ printf("Ln(x) =\n");
Print( x , y);
printf("\n\n插值结果: P(%f)=%f\n", varx , Lagrange( x , y, varx ,N));
}
else
printf ("输入的插值节点的x值必须互异!");
getch();
}
int checkvalid ( double x[], int n )
{
int i , j;
n = 4;
for( i = 0;i <=n; i++)
for( j = 0; j <= n; j++ )
if((i!=j) && (x[i] == x[j]) )
return -1;
return 1;
}
void Print(double x[], double y[])
{
int j,k;double p,q ;
int n = 4;
for(k = 0; k <= n; k++)
{
p =1.0;
for( j = 0; j <= n; j++ )
{
if(j!=k)
p = p*(x[k]-x[j]);
}
q = y[k]/p;
printf("\t%f",q);
for( j = 0; j <= n; j++ )
{
if(j!=k)
printf("*(x-%f)",x[j]);
}
if(k!=n)
printf("+\n");
}
}
double Lagrange (double x[], double y[], double varx, int n )
{
double sum = 0.0, p ;
int j , k ;
n = 4 ;
for( k = 0;k <= n; k++ )
{
p = 1.0;
for( j = 0; j <= n; j++ )
{
if(j!=k)
p = p*( (varx - x[j])/(x[k] - x[j]) );
}
sum = sum + y[k]*p;
}
return (sum);
}