标准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;jif(j!=i)
{
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;ic[i][j]=((c[i+1][j-1]-c[i][j-1])/(DataX[i+j]-DataX[i]));
else
for(i=0;ic[i][0]=DataFX[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;ifprintf(stdout,"(%g,%g) ",*(x+i),*(fx+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;
}


相关文档
最新文档