埃特金逐步插值

源代码来自《常用算法程序集(c语言描述)第三版》 ,作者徐士良。

算法的作用:

  给定n个点上的函数值及精度要求,计算指定插值点处的函数近似值

double atk(double x[],double y[],int n,double t,double eps)
{
    int i,j,k,l;
    int m = 10;
    double z,xx[m],yy[m];
    z=0.0;
    if (n<1)
        return(z);
    if (n==1)
    {
        z=y[0];
        return(z);
    }
    if (m>n)
        m=n;
    if (t<=x[0])
        k=1;
    else
    {
        if (t>=x[n-1])
            k=n;
        else
        {
            k=1; j=n;
            while ((k-j!=1)&&(k-j!=-1))
            {
                l=(k+j)/2;
                if (t<x[l-1])
                    j=l;
                else
                    k=l;
            }
            if (fabs(t-x[l-1])>fabs(t-x[j-1]))
                k=j;
        }
    }
    j=1; l=0;
    for (i=1;i<=m;i++)
    {
        k=k+j*l;
        if ((k<1)||(k>n))
        {
            l=l+1;
            j=-j;
            k=k+j*l;
        }
        xx[i-1]=x[k-1];
        yy[i-1]=y[k-1];
        l=l+1; j=-j;
    }
    i=0;
    do
    {
        i=i+1; z=yy[i];
        for (j=0;j<=i-1;j++)
            z=yy[j]+(t-xx[j])*(yy[j]-z)/(xx[j]-xx[i]);
        yy[i]=z;
    }while ((i!=m-1)&&(fabs(yy[i]-yy[i-1])>eps));
    return(z);
}

 

posted on 2013-07-01 17:27  jacob1934  阅读(757)  评论(0)    收藏  举报

导航