/*等距节点插值*/
#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;
}
等距节点插值
最新推荐文章于 2023-07-31 15:26:48 发布