最近一个同学问我关于插值的实现问题,推荐了一种牛顿插值法,给我一个参考文字,越看越觉得悲伤,数学符号、术语,什么泰勒公式,拉格朗日展开全都忘记了。各种公式推导,完全看不明白。
心里突然有些焦虑,两三年的工作下来,很多东西都全丢了,好像也很难再拣起来了。工作中用到的东西都是东拼西凑,真正自己创造的东西又有多少?
伤感完了,继续看牛顿插值法,这种插值算法的优点是插值节点增减,不会影响插值基函数。用程序来说,就是插值节点多少并不影响代码的实现,只是计算迭代次数多少的问题。总之,牛顿插值法很好工程实现。可以参考这个课件,说理论比较浅显,还能看明白。实现的代码在这里有。把C语言的实现摘抄如下:
#include<stdio.h>
void main()
{
float x[11],y[11][11],xx,temp,newton;
int i,j,n;
printf("Newton插值:\n请输入要运算的值:x=");
scanf("%f",&xx);
printf("请输入插值的次数(n<11):n=");
scanf("%d",&n);
printf("请输入%d组值:\n",n+1);
for(i=0;i<n+1;i++)
{
printf("x%d=",i);
scanf("%f",&x[i]);
printf("y%d=",i);
scanf("%f",&y[0][i]);
}
for(i=1;i<n+1;i++)
{
for(j=i;j<n+1;j++)
{
if(i>1)
y[i][j]=(y[i-1][j]-y[i-1][j-1])/(x[j]-x[j-i]);
else
y[i][j]=(y[i-1][j]-y[i-1][j-1])/(x[j]-x[j-1]);
printf("%f\n",y[i][i]);
}
}
temp=1;newton=y[0][0];
for(i=1;i<n+1;i++)
{
temp=temp*(xx-x[i-1]);
newton=newton+y[i][i]*temp;
}
printf("求得的结果为:N(%.4f)=%9f\n",xx,newton);
}