6.4 函数数值积分
定积分的计算可用牛顿-莱布尼茨公式:
其中,F(x)是f(x)的原函数之一,可用不定积分求得。然而在实际问题中,在应用上述公式时往往会遇到一系列的问题。
● 被积函数f(x)是使用函数表格提供的。
● 被积函数表达式极为复杂,求不出原函数;或者求出的原函数的形式很复杂,不利于计算。
● 大量函数的原函数不容易或者根本无法求出,例如正弦型积分等,根本无法用初等函数来表示其原函数,因而无法精确计算其定积分。
数值积分便是为了解决上述问题而提出来的。数值积分只需计算f(x)在节点xi(i=1,2,…,n)上的值,计算方便且适合在计算机上实现。
6.4.1 数值积分问题的数学表述
区间[a, b]上的定积分,就是在区间[a, b]内取n+1个点x0,x1,…,xn,利用被积函数f(x)在这n+1个点的函数值的某一种线性组合来近似作为待求定积分的值,即
其中,xk称为积分节点,Ak称为求积系数。右端公式称为左端定积分的某个数值积分公式。因此,求积分的关键在于积分节点xk的选取及积分系数Ak的确定。
MATLAB支持三重以下的积分运算,分别为:、、。在计算积分值时,要求积分区间是确定的。
6.4.2 一元函数的数值积分
本节将讨论f(x)为一元函数时的积分情况。MATLAB为一元函数的数值积分提供了3个函数,分别为quad、quadl、quadv。下面将对这3个函数进行介绍。
1.quad函数
quad函数采用遍历的自适应辛普森(Simpson)法计算函数的数值积分,适用于精度要求低、被积函数平滑性较差的数值积分。常用的调用格式如下:
● Q=quad(FUN,A,B)。
● Q=quad(FUN,A,B,TOL)。
● Q=quad(FUN,A,B,TOL,TRACE)。
● [Q,FCNT]=quad(...)。
式中,FUN为被积函数的句柄,FUN应该接收向量输入,并输出相同长度的向量。A、B分别为积分的起始值和结束值。TOL用于控制自适应辛普森法的误差,增大TOL可以加快计算速度,但是计算精度会下降。在默认情况下,TOL=1.0e-6。当TRACE值非0时,函数输出计算过程中的[fcnt a b-a Q]。FCNT表示函数计算的次数。
2.quadl函数
quadl函数采用遍历的自适应Lobatto法计算函数的数值积分,适用于精度要求高、被积函数曲线比较平滑的数值积分。其用法与quad函数相同,分别如下:
● Q=quadl(FUN,A,B)。
● Q=quadl(FUN,A,B,TOL)。
● Q=quadl(FUN,A,B,TOL,TRACE)。
● [Q,FCNT]=quadl(...)。
式中各输入参数和输出参数的含义同quad函数。
通常quad函数具有较快的计算速度,但是准确性较差;而quadl函数需要更多的计算时间,但是具有较高的准确性。
3.quadv函数
有的时候,被积函数f(x)是一系列的函数,如下述积分:
当k取不同的数值时,该积分的结果也不尽相同。针对这种情况,MATLAB提供了quadv函数,可以一次计算多个一元函数的数值积分值。
quadv函数是quad函数的矢量扩展,因此也称为矢量积分。其用法与quad函数相同,分别如下:
● Q=quadv(FUN,A,B)。
● Q=quadv(FUN,A,B,TOL)。
● Q=quadv(FUN,A,B,TOL,TRACE)。
● [Q,FCNT]=quadv(...)。
式中各输入参数和输出参数的含义同quad函数。矢量积分的结果是一个向量。
quad、quadl、quadv 3个函数都要求被积函数FUN必须是函数句柄,同时积分限[a, b]必须是有限的,因此不能为inf。此外,在使用上述3个函数进行数值积分的求解时,可能会出现如下几种错误信息。
● 'Minimum step size reached':意味着子区间的长度与计算机舍入误差相当,无法继续计算。原因可能是有不可积的奇点。
● 'Maximum function count exceeded':意味着积分递归计算超过了10000次。原因可能是有不可积的奇点。
● 'Infinite or Not-a-Number function value encountered':意味着在积分计算时,区间内出现了浮点数溢出或者被零除的情况。
例6-23:计算积分。
在命令行窗口中输入:
clear all; F = @(x) 1 ./ (x.^3 - 2 * x - 5); Q = quad(F, 0, 2)
输出结果:
Q = -0.4605
6.4.3 多重数值积分
本节将讨论被积函数为二元函数f(x, y)和三元函数f(x, y, z)的情况。MATLAB提供了dblquad函数和triplequad函数,分别用于计算二重数值积分和三重数值积分。
1.二重数值积分计算函数dblquad
dblquad函数可以用来计算被积函数在矩形区域x∈[xmin, xmax],y∈[ymin, ymax]内的数值积分值。该函数先计算积分值,然后利用内积分的中间结果来计算二重积分。根据dxdy的顺序,称x为内积分变量,y为外积分变量。dblquad函数的调用格式如下:
● Q=dblquad(FUN,XMIN,XMAX,YMIN,YMAX)。
● Q=dblquad(FUN,XMIN,XMAX,YMIN,YMAX,TOL)。
● Q=dblquad(FUN,XMIN,XMAX,YMIN,YMAX,TOL,@QUADL)。
● Q=dblquad(FUN,XMIN,XMAX,YMIN,YMAX,TOL,MYQUADF)。
式中,FUN为被积函数的句柄;XMIN、XMAX、YMIN、YMAX分别为矩形区域在x和y两个方向上的积分限;TOL指定绝对计算精度;@QUADL和MYQUADF用以指定计算一维积分时采用的函数,MATLAB默认采用quad函数来计算一维积分,@QUADL表示用户指定采用quadl函数来计算一维积分,MYQUADF则表示采用用户自己编写的一维积分函数。
例6-24:计算积分。
在命令行窗口中输入:
clear all; f = @(x, y) y * sin(x) + 3 * cos(y) - 1; xmin = pi; xmax = 2 * pi; ymin = 0; ymax = pi; q = dblquad(f, xmin, xmax, ymin, ymax)
输出结果:
q = -19.7392
2.三重数值积分计算函数triplequad
triplequad函数可以用来计算被积函数在空间区域x∈[xmin, xmax],y∈[ymin, ymax],z∈[zmin, zmax]内的数值积分值。该函数的调用格式如下:
● Q=triplequad(FUN,XMIN,XMAX,YMIN,YMAX,ZMIN,ZMAX)。
● Q=triplequad(FUN,XMIN,XMAX,YMIN,YMAX,ZMIN,ZMAX,TOL)。
● Q=triplequad(FUN,XMIN,XMAX,YMIN,YMAX,ZMIN,ZMAX,TOL,@QUADL)。
● Q=triplequad(FUN,XMIN,XMAX,YMIN,YMAX,ZMIN,ZMAX,TOL,MYQUADF)。
上式中相关参数的含义同dblquad函数。
计算三重数值积分可以用函数triplequad来实现,其用法与计算二重数值积分类似。
本章小结
针对数据分析和处理,MATLAB提供了大量的函数供用户使用。本章介绍了MATLAB强大的数据分析和处理功能,主要包括多项式函数、插值函数、数组和函数极限的求解过程及函数的数值积分计算。可以看出利用MATLAB进行数据分析非常灵活,读者需要熟练掌握。