Newton插值多项式的C程序实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
附录
(一)等距结点的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
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 { 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 for(j=i;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 { 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 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 { 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 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 { temp=temp*((t-i+1)/i); newton=newton+y[i][0]*temp; } printf("求得的结果为:N(%.4f)=%9f\n",xx,newton); } 运行结果: