牛顿插值法

最近一个同学问我关于插值的实现问题,推荐了一种牛顿插值法,给我一个参考文字,越看越觉得悲伤,数学符号、术语,什么泰勒公式,拉格朗日展开全都忘记了。各种公式推导,完全看不明白。

心里突然有些焦虑,两三年的工作下来,很多东西都全丢了,好像也很难再拣起来了。工作中用到的东西都是东拼西凑,真正自己创造的东西又有多少?


伤感完了,继续看牛顿插值法,这种插值算法的优点是插值节点增减,不会影响插值基函数。用程序来说,就是插值节点多少并不影响代码的实现,只是计算迭代次数多少的问题。总之,牛顿插值法很好工程实现。可以参考这个课件,说理论比较浅显,还能看明白。实现的代码在这里有。把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);
}