牛顿插值法的C语言实现001汇总.docx
- 文档编号:433315
- 上传时间:2022-10-10
- 格式:DOCX
- 页数:20
- 大小:322.04KB
牛顿插值法的C语言实现001汇总.docx
《牛顿插值法的C语言实现001汇总.docx》由会员分享,可在线阅读,更多相关《牛顿插值法的C语言实现001汇总.docx(20页珍藏版)》请在冰豆网上搜索。
牛顿插值法的C语言实现001汇总
牛顿插值法的C语言实现
摘要:
拉格朗日插值法具有明显的对称性,公式中的每一项与所有的插值节点有关。
因此,如果需要增加一个插值节点,则拉格朗日插值公式中的每一项都要改变,在有的应用中就显得不太方便。
因此,可以利用另外一种差值方法来弥补这种缺陷,就牛顿插值法。
本文通过对牛顿插值法的数学分析,主要给出其C语言实现方法。
关键字:
差商差分C语言算法
1差商及其牛顿插值公式
1.1差商及其主要性质
定义若已知函数
在点
处的函数值
。
则称:
为函数
在点
的
阶差商;
为函数
过点
的
阶差商;
为函数
过点
的
阶差商;
以此类推,一般地称
为函数
过点
的
阶差商。
性质1阶差商表示为函数值
的线性组合。
即
性质2若函数
在包含节点的区间
上存在
阶导数,则
阶差商与导数的关系为
1.2牛顿插值公式
通过
个互异点上的次数不超过
的插值多项式
可以表示如下形式:
这种形式的插值多项式称为牛顿插值多项式,一般记为
由牛顿插值多项式可以看出,当增加一个插值点时,当前已有的各项不变,只需要在后面增加一项即可。
并且,在牛顿插值公式中,每一项的系数就是各阶差商,比拉格朗日插值公式计算量小,且便于程序设计。
根据差商性质2,即
就可以将拉格朗日插值公式的余项转化成牛顿插值公式的余项,即
牛顿插值公式余项更具有一般性,它对于列表函数或者
导数不存在的情形都适用。
2差分与等距结点插值公式
2.1差分及其主要性质
定义设函数
在等距结点
上的函数值为
其中,为常熟,
称为步长。
则
称为函数
在处以
为步长的一阶向前差分,并简记为
;
称为函数
在处以
为步长的一阶向后差分,并简记为
称为函数
在处以
为步长的一阶向中心差分,并简记为
性质1各阶差分可以表示成函数值的线性组合。
即
性质2差商与差分具有如下关系:
2.2等距结点插值公式
2.2.1牛顿前插公式
其余项公式为
2.2.2牛顿后插公式
其余项公式为
在用牛顿前插和后插公式计算时候,要涉及到各阶前插和后插计算,下面是各阶向前和向后差分的计算格式,如下图所示。
表1各阶向前差分和向前差分的计算公式
1阶差分
2阶差分
3阶差分
4阶差分
用于前插公式
用于后插公式
3牛顿差值公式的C程序设计和应用实例
3.1牛顿差值法的应用步骤
步骤首先我们按照表1,求得各点的差商.然后利用牛顿前差或后差公式,把数值带入.即可以求得n次多项式。
它在计算机上的应用步骤如下:
步骤1输入所要求的牛顿多项式的次数
,并依次输入
个节点
.
for:
i=0ton+1
{
scanf("%f",&x[i])
scanf("%f",&y[0][i]);
}
步骤2计算各阶差商
for:
i=1ton+1
{
for:
j=iton+1
if(i>1)
y[i][j]=(y[i-1][j]-y[i-1][j-1])/(x[j]-x[j-i]);
else
y[i][j]=(y[i-1][j]-y[i-1][j-1])/(x[j]-x[j-1]);
}
步骤3代入牛顿插值公式,可计算得出结果。
for:
i=1ton+1
{
temp=temp*(xx-x[i-1]);
牛顿=牛顿+y[i][i]*temp;
}
3.2利用牛顿插值法程序的实例
为了更方便的应用牛顿插值法,我们进行了与计算机的结合,下面我们将展示几个例子。
例2.1已知
的一组数据为
x
sinx
(1)构造牛顿插值函数并作图分析。
(2)并分别利用程序估计
,
的估计值。
分析首先我们可以通过程序求出差商表:
一阶差商
二阶差商
三阶差商
四阶差商
带入定义1.5中可求得如下牛顿插值多项式如下
(2.1)
(2.2)
第二步利用C++程序计算
和
的值。
步骤如下:
利用C程序:
首先输入所要求的牛顿多项式的次数n,然后输入n+1个节点的值.即可以得出
和
的值为0.2586和0.0804;
例2.2设
的函数表如下:
0.25
0.30
0.36
0.39
0.45
0.223144
0.262364
0.307485
0.329304
0.371564
试计算
,
分析:
同上题步骤我们先求差商表,进而代入公式可得
利用C程序我们可以得到计算结果:
,
,
,
,
从上述两个例子我们可以看出,多项式在区间
周围与原函数逼近的较好。
离这个区间越远与原函数的误差越大在
处时,该图像就已经开始背离图像了.所以该多项式只能在一个小的区间里可以逼近原函数,不适合作为原函数的逼近函数.也可以看出多项式在
区间的周围逼近的较好,但是
处时,该图像就离原图像误差较大.多项式在区间[0,2.5]都逼近的挺好,从图中我们看出在远离这个区间的图像误差相对较大,但是在这三个多项式中是逼近最好的。
于是可以得出节点越多,函数逼近的相对较好.在节点附近逼近的越好,越远离节点误差越大,所以公式适用于计算节点附近的值于是为了减小误差,在下一节的等距节点下的插值公式根据所求的点的函数值的不同分别采取了前插和后插公式。
3.4等距节点下的牛顿插值算法与程序设计
前面我们讲述了一般节点下的牛顿插值公式,为了计算方便于是有了对等距节点下的牛顿多项式的研究,本节将对等距节点下的插值多项式进行总结讨论.
3.4.1等距节点下的牛顿插值法的程序算法步骤
步骤先求差分.然后利用牛顿前插公式或牛顿后插公式并把数值带入.即可以求得n次多项式。
它在计算机上的应用步骤如下:
步骤1输入所要求的牛顿多项式的次数
,步长
,并依次输入
个节点
。
for:
i=0ton+1
{
scanf("%f",&x[i])
scanf("%f",&y[0][i]);
}
步骤2求得各界差分
for:
i=1ton+1
{for:
j=iton+1
y[i][j]=(y[i-1][j+1]-y[i-1][j-1])/(x[j]-x[j]);
}//求向前差分
for:
i=1ton+1
{for:
j=iton+1
y[i][j]=(y[i-1][j]-y[i-1][j-1])/(x[j]-x[j-i]);
}//求向后差分
步骤3代入牛顿插值公式,可计算得出结果
for(i=1;i { temp=temp*((t-i+1)/i); 牛顿=牛顿+y[i][i]*temp; } printf("求得的结果为: N(%.4f)=%9f\n",xx,牛顿); }//求得运用前插公式的值 for(i=n;i<0;i--) { temp=temp*((t-i+1)/i); 牛顿=牛顿+y[n-i][n-i]*temp; } printf("求得的结果为: N(%.4f)=%9f\n",xx,牛顿); }//求得运用后插公式的值 3.4.2等距节点下牛顿插值的实例 例已知 的值列表如下: 1.3 1.31 1.32 1.33 3.6021 3.7471 3.9033 4.0723 近似计算 。 采用牛顿向后插公式.为此,做差分表 1.3 3.6021 0.1450 0.0112 0.0016 1.31 3.7471 0.1562 0.0128 1.32 3.9033 0.1690 1.33 4.0723 从而,有 将 代入上式,得 。 将 带入后插多项式中可以得到 现在我们利用C程序首先输入所求插值的次数3和步长0.01.然后输入各个节点,并输入所要求的点1.325既可以求出该点的函数值。 即 。 例设函数在各节点的取值如下 0 0.2 0.4 0.6 0.8 1.0 1.0 0.818731 0.670320 0.548812 0.449329 0.367879 试利用插值公式求 的值。 采用牛顿向前插公式,同上题我们先做差分表,然后相应带入到差分公式.中求得后插公式。 利用C语言程序步骤如下: 首先输入所求插值的次数5和步长0.2。 然后输入各个节点,并输入所要求的点0.3既可以求出该点的函数值。 即 。 由以上例子我们看到例1用了牛顿后插公式,例2用了牛顿前插公式,我们该怎样选取。 这个经过验证得出,如果所要求的点较靠近节点 ,则采用前插公式;如果靠近 ,则采用牛顿后插公式。 4结束语 用牛顿差值方法处理测量数据,具有使差值多项式通过选定测量值的特点,所以在数据处理中有一定的应用场合。 当测量值较多、较密时,为了减轻计算工作量及提高准确性,应选取合适的测量值作为差商计算的依据求得 。 参考文献 [1]李庆扬等编.数值分析.华中科技大学出版社,1989 [2]储钟武等编译.数值分析.黑龙江科学技术出版社,1987 [3]徐士良编.数值分析与算法.机械工业出版社,2007 附录A: 牛顿插值法的程序 #include voidmain() { floatx[11],y[11][11],xx,temp,牛顿; inti,j,n; printf("牛顿插值: \n请输入要运算的值: x="); scanf("%f",&xx); printf("请输入插值的次数(n<11): n="); scanf("%d",&n); 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]); } for(i=1;i for(j=i;j {if(i>1) y[i][j]=(y[i-1][j]-y[i-1][j-1])/(x[j]-x[j-i]); else y[i][j]=(y[i-1][j]-y[i-1][j-1])/(x[j]-x[j-1]); printf("%f\n",y[i][i]); } temp=1;牛顿=y[0][0];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 牛顿 插值法 语言 实现 001 汇总
![提示](https://static.bdocx.com/images/bang_tan.gif)