当前位置:文档之家› Newton插值多项式的C程序实例

Newton插值多项式的C程序实例

附录
(一)等距结点的Newton 插值法的程序算法步骤
步骤 按照差分公式,求差分.然后利用Newton 前插公式或Newton 后插公式并把数值带入.即可以求得n 次多项式. 它在计算机上的应用步骤如下:
步骤1 输入所要求的牛顿多项式的次数n ,步长h ,并依次输入1+n 个节点
),(i i y x .
步骤2 求得各界差分
步骤3 代入牛顿插值公式,可计算得出结果
(二)等距节点下Newton 插值的实例
例题1 已知的值列表如下:
近似计算325.1tan ,305.1tan . 解:
采用Newton 向后插公式.为此,做差分表
).2)(1(!
30016
.0)1(!20128.01690.00723.4)(3+++++
+=t t t t t t x p 将5.001
.033
.1325.1-=-=
t 代入上式,得
tan1.325≈P 3(1.325)=3.9861
将5.201
.033
.1305.1-=-=t 上式中可以得到
tan1.305≈P 3(1.305)=3.6733
C程序如下:
#include<stdio.h>
void main()
{
float x[11],y[11][11],xx,temp,newton,t,h;
int i,j,n;
printf("Newton插值:\n请输入要运算的值:x=");
scanf("%f",&xx);
printf("请输入插值的次数(n<11):n=");
scanf("%d",&n);
printf("步长:\n请输入要运算的值:h=");
scanf("%f",&h);
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]);
}
t=(xx-x[n])/h;
//计算各阶差分
printf("--------------------------\n");
printf("各阶差分分别为:\n");
for(i=1;i<n+1;i++)
for(j=i;j<n+1;j++)
{
y[i][j]=(y[i-1][j]-y[i-1][j-1]); printf("%f\n",y[i][j]);
}
//利用牛顿插值公式,计算结果
temp=1;
newton=y[0][n];
for(i=1;i<n+1;i++)
{
temp=temp*((t+i-1)/i);
newton=newton+y[i][n]*temp;
}
printf("求得的结果为:N(%.4f)=%9f\n",xx,newton);
}
运行结果如下所示:
x0 0.2 0.4 0.6 0.8 1.0
)(x f 1.0 0.818731 0.670320 0.548812 0.449329 0.367879 试利用插值公式求)3.0(f的值.
解:
差分表如下:
分析首先我们可以通过程序求出差分表:
从而,有
p5(x)=1.0+(−0.181269)t+0.032858t(t−1)/2!+⋯+(−0.000191)t(t
−1)(t−2)(t−3)(t−4)/5!
将t=(0.3−0)/0.2代入上式,得
)3.0(f≈p5(x)=0.740818
利用C语言程序步骤如下:
首先输入所求插值的次数5和步长0.2.然后输入各个节点,并输入所要求的点0.3既可以求出该点的函数值.
#include<stdio.h>
void main()
{
float x[11],y[11][11],xx,temp,newton,t,h;
int i,j,n;
printf("Newton插值:\n请输入要运算的值:x=");
scanf("%f",&xx);
printf("请输入插值的次数(n<11):n=");
scanf("%d",&n);
printf("步长:\n请输入要运算的值:h=");
scanf("%f",&h);
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]);
}
t=(xx-x[0])/h;
printf("--------------------------\n");
printf("各阶差分分别为:\n");
for(i=1;i<n+1;i++)
for(j=0;j<=n-i;j++)
{
y[i][j]=(y[i-1][j+1]-y[i-1][j]);
printf("%f\n",y[i][j]);
}
temp=1;
newton=y[0][0];
for(i=1;i<n+1;i++)
{
temp=temp*((t-i+1)/i);
newton=newton+y[i][0]*temp;
}
printf("求得的结果为:N(%.4f)=%9f\n",xx,newton);
}
运行结果:
(三)总结
由以上例子我们看到例1用了牛顿后插公式,例2用了牛顿前插公式,我们该怎样选取.这个经过验证得出,如果所要求的点较靠近节点x0,则采用前插公式;如果靠近x n,则采用牛顿后插公式.。

相关主题