第二章 数值积分几种公式探析
2.1 数值积分方法的原理
从公式来看: ?baf(x)dx?f(?)(b?a) (1)
我们利用积分中值定理得到上面所示的公式,我们所见到的一般的数值积分公式也是由该公式演变而来。当f(?)不能求出精确解的时候,我们就只能通过提供不同的近似方法来对f(?)求近似解,这样我们就能求出该函数积分的近似解。当然根据不同的近似方法所求出的f(?)的近似值与精确值之间的误差也会有所不同。因此我们要根据误差要求选择不同的近似方法。
2.2矩形公式
当我们取一个点来近似代替f(?)的值的时候,就会演变出我们平时常见的矩形公式。
当我们用f(a)来近似代替f(?)的值的时候,就演变成我们平时见到的左矩形公式:
?baf(x)dx?f(a)(b?a) (2)
当我们用f(b)来近似代替f(?)的值的时候,就演变成我们平时见到的右矩形公式:
?baf(x)dx?f(b)(b?a) (3)
1当我们用f((a?b))来近似代替f(?)的值的时候,就演变成我们平时所见
2的中矩形公式:
?ba1f(x)dx?f((a?b))(b?a)2 (4)
2
根据曲线的走势不同,选择左矩形和右矩形近似求解的时候会呈现偏大或偏小的情况,用中矩形方法来求解相对来说误差会小一点。
2.3梯形公式
如图2.3.1所示当我们用两个点f(a)和f(b)的平均值来近似代替f(?)的值的时候,就演变成我们平时所见到的梯形公式:
?baf(x)dx?1(f(a)?(b))(b?a)2 (5)
图2.3.1梯形公式示意图
相对于矩形公式用一个点来近似代替f(?)的值来说,梯形公式用两个点的平均值来代替f(?)的值,其相对误差要小一点,精确度高一点。
2.4辛普森公式
1当我们选取三个点f(a)、f(b)和f(c)=f((a?b))的值来计算f(?)的近似
2值的时候,我们可以得出辛普森公式:
?baf(x)dx?(b?a)[f(a)?(b)?4f(c)]6 (6)
运用辛普森公式近似求出的积分结果相对于矩形公式和梯形公式来说精确度更高一些,但计算方法相对来说也复杂一点。
3
2.5牛顿-柯茨公式
当我们选取5个点x0、x1、x2、x3、x4来计算f(?)的近似值的时候,我们就能得到平时所见到的的牛顿-柯茨公式[4]:
?baf(x)dx?(b?a)[7f(x0)?32f(x1)?12f(x2)?32f(x3)?7f(x4)]
90 (7)
牛顿-柯茨公式相对于前面的几个公式来说,计算误差更小,精度更高,但是计算的复杂程度也更高。
2.6自适应数值积分
用自适应积分法解决问题的时候,我们往往取非等间距的节点,我们可以在函数值变化较大的区间采用较小的步长进行计算,其基础是辛普森公式(当然我们也可以采用其他的公式来自适应)。计算关键是结果能否通过精度测试。对于自适应积分法来说我们给出不同的精度,我们在进行区间划分的时候所划分的区间分数也会有相应的要求,一般来说划分的区间越小,精度越大(详情见程序调试实例)。
4
第三章Matlab编程程序
MATLAB是由MathWorks公式开发的一种主要用于数值计算及可视化图形处理的工程语言,是当今最优秀的科技应用软件之一。它将数值计算、矩阵运算、图形图像处理、信号处理和仿真等诸多强大的功能集成在较易使用的交互计算机环境中,为科学研究、工程应用提供了一种功能强、效率高的编程工具[5]。在上一章中我们所提到的各种积分公式均是单一的积分公式,如果将这些公式复化(以矩形公式为例,当我们将一段曲线所围成的面积近似看成一个矩形的时候就是单一的矩形公式,而当我们将这段曲线所围成的面积划分成若干个等步长的小矩形的面积的和的时候就是矩形公式的复化),这样计算出来的结果的误差也会随复化程度的增加而减小。但是计算量也会随着等分区间的增多而变大,人工计算花费的时间会比较多,这时我们就可以使用matlab编写程序来代替人工计算。从以往所发表的文章中各种公式的matlab运算程序已经司空见惯,但是都是单一的程序,没有通用的计算程序。本文将在数值积分的通用matlab程序上做一些探索。
下面我们将编写通用数值积分的matlab程序,该程序用MATLAB7.0编写,运行坏境:1、硬件环境CPU(intel Core i3-2310M,2.1GHz),内存(2GB昱联),2、软件环境windows7(32位)操作系统。以下编写的算法程序,部分代码参考文献[1-3]。
3.1主程序
见附录。
3.2调试实例
1dx?01+x*x以下调试实例均以求的值为例。
1 5
3.2.1矩形公式调用实例
(一)左矩形 输入函数变量:
>>f=inline('1/(1+x*x)'); >>[f,n]=tyszjf(f,0,1,100,'zjx') 按回车键显示结果如下: f =0.7879 n=100
(二)右矩形 输入函数变量:
>>f=inline('1/(1+x*x)'); >>[f,n]=tyszjf(f,0,1,100,'yjx') 按回车键显示结果如下: f =0.7829 n =100
(三)中矩形 输入函数变量:
>>f=inline('1/(1+x*x)'); >>[f,n]=tyszjf(f,0,1,100,'mjx') 按回车键显示结果如下: f =0.7854 n =100
(四)以中矩形为例计算不同等分份数的积分值
(1)10等份(n=10)
6