等距节点插值

/*等距节点插值*/
#include
#define N 10010
int main()
{
    double xi[N],yi[N],A[N][2],B[N];//A[][]:向前差分表,B[]:向后差分表. 
    int n,i,j,k,m;
    double w,w1;
    double x,y1,y2;
    printf("输入节点个数-1:");
    scanf("%d",&n);
    k=0;
    for(i=0;i<=n;i++)
    {
        scanf("%lf %lf",&xi[i],&yi[i]);
        A[i][0]=yi[i];
    }
    B[0]=yi[n];k++;
    for(i=1;i<=n;i++)
    {
        for(j=i;j<=n;j++)
        {
            A[j][i%2]=A[j][(i-1)%2]-A[j-1][(i-1)%2];
            if(j==n)
            {
                B[k++]=A[j][i%2];
            }
        }
    }//计算差分表.

    double h,t; 

    printf("输入前插待求X值:");
    scanf("%lf",&x);
    h=xi[1]-xi[0];t=(x-xi[0])/h;
    printf("输入插值次数:");
    scanf("%d",&m);
    w=1.0,w1=1,0;
    for(y1=0.0,i=0;i<=m;i++)
    {
        if(i>=1)
        {
            w=w*(t-i+1);
            w1=w1*i;
        }
        y1+=w/w1*A[i][i%2];
    } 
    printf("向前差分结果为:%lf\n",y1);

    printf("输入后插待求X值:");
    scanf("%lf",&x);
    printf("输入插值次数:");
    scanf("%d",&m);
    h=xi[1]-xi[0];t=(x-xi[n])/h;
    w=1.0,w1=1,0;
    for(y2=0.0,i=0;i<=m;i++)
    {
        if(i>=1)
        {
            w=w*(t-i+1);
            w1=w1*i;
        }
        y2+=w/w1*B[i];
    }
    printf("向后差分结果为:%lf\n",y2);

    return 0;
} 

你可能感兴趣的:(插值法)