标准C语言插值函数
#include
#include
double Lagrange(double XK,int TotalDataCount,double* DataX,double* DataFX)
{
int i,j;
double px=0;
double fz,fm;
for(i=0;i
fz=1;
fm=1;
for(j=0;j
{
fz=fz*(XK-DataX[j]);
fm=fm*(DataX[i]-DataX[j]);
}
px=(px+(DataFX[i]*fz)/fm);
}
return px;
}
double Newton(double XK,int TotalDataCount,double* DataX,double* DataFX)
{
int i,j;
double** c;
double px,fz;
if ((c=(double**)calloc(TotalDataCount,sizeof(double*)))==NULL)
{
fprintf(stderr,"内存管理出错!\n");
return -9999999;
}
for (i=0;i
if ((*(c+i)=(double*)calloc(TotalDataCount,sizeof(double)))==NULL)
{
fprintf(stderr,"内存管理出错!\n");
return -9999999;
}
}
px=DataFX[0];
for(j=0;j
if(j>0)
for(i=0;i
else
for(i=0;i
}
for(i=1;i
fz=1;
for(j=0;j<=i-1;j++)
fz=fz*(XK-DataX[j]);
px=px+c[0][i]*fz;
}
for (i=0;i
free(*(c+i));
}
free(c);
return px;
}
int main(int argc,char** argv)
{
int i,n;
int flag=1;
double* x;
double* fx;
double xk,px;
fprintf(stdout,"输入数据个数:");
fscanf(stdin,"%d",&n);
if (((x=(double*)calloc(n,sizeof(double)))==NULL)||((fx=(double*)calloc(n,sizeof(double)))==NULL))
{
fprintf(stderr,"内存管理出错!\n");
return -1;
}
for(i=0;i
fprintf(stdout,"输入第%d组(x,y)(xy以空格分隔):",i+1);
fscanf(stdin,"%lf %lf",x+i,fx+i);
}
fprintf(stdout,"已知的数据是:\n");
for(i=0;i
fprintf(stdout,"\n");
while(flag!=0)
{
fprintf(stdout,"\n");
fprintf(stdout,"输入所求f(x)的x值:");
fscanf(stdin,"%lf",&xk);
px=Lagrange(xk,n,x,fx);
fprintf(stdout,"Lagrange插值所求f(x)=%g\n",px);
px=Newton(xk,n,x,fx);
fprintf(stdout,"Newton插值所求f(x)=%g\n",px);
fprintf(stdout,"\n继续请按1,退出请按0:");
fscanf(stdin,"%d",&flag);
}
free(x);
free(fx);
return 0;
}