等距节点插值

/*等距节点插值*/
#include<stdio.h>
#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;
} 
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值