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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

}

运行结果:

相关文档
最新文档