matlab-ch013(数值计算-微积分)20090923.ppt
第13讲 数值计算 —微积分,张建瓴,§13.1 数值积分,在工程教学和应用中,除了进行数据逼近外,还要求逼近曲线下面的面积,这就是积分问题。,一、数值积分方法,典型的数值积分方法有:用常数(0阶多项式)近似函数矩形法;用直线(一阶多项式)近似函数曲线的梯形法;用抛物线(二阶多项式)近似函数曲线的Simpson法,以及用一般多项式近似函数的Romberg法等。 y=sin(x^3)*sqrt(x) x求y, 表13-1列出了函数数值积分的一些命令。,表13-1 函数数值积分的命令,,常见的一元数值积分命令,MATLAT提供了在有限区间内,数值计算某函数下的面积(积分)的三种函数:trapz,quad和quad8。,二、一(元)维数值积分,1、trapz函数 函数trapz通过计算若干梯形面积的和来近似某函数的积分,这些梯形如图13-1所示,是通过使用函数humps的数据点形成。,图13-2 较好的梯形逼近曲线下的面积示意图 从图中可明显地看出,单个梯形的面积在某一段欠估计了函数真正的面积,而在其它段又过估计了函数的真正面积。如同线性插值,当梯形数目越多时,函数的近似面积越准确。例如,在图13-1中,如果我们大致增加一倍数目的梯形,我们得到如下(如图13-2)所示的更好的近似结果。,trapz 函数,对如上所示的两个曲线,用trapz在区间-1>x=-1: 0.17: 2; % rough approximation >>y=humps(x); >>area=trapz(x, y) % call trapz just like the plot command area = 25.9174,trapz 函数的应用,>>x=-1: 0.07: 2; % better approximation >>y=humps(x); >>area=trapz(x , y) area = 26.6243 上述两个结果不同是基于对图形的观察,粗略近似可能低估了实际面积。除非特别精确,没有准则说明哪种近似效果更好。,trapz 函数的应用,MATLAB提供的求积函数命令quad和quad8在使用时,其递推的层次限制在十层以内,达到这个限制则会提示警告信息,并且这两个函数命令都不能解决可积的奇异值问题,例如,求解 。,quad函数和quad8函数,函数quad和quad8完整的调用格式为: (1)q=quad( fun ,a,b,tol,trace,pl,p2,…) 采用Simpson法计算积分; (2)q=quad8( fun ,a,b,tol,trace,p1,p2,…) 采用八样条Newton-Cotes公式求数值积分。 其中:fun是被积函数,可以是表达式字符串、内联函数、M函数文件名,被积函数的自变量,一般采用字母x; a、b分别是积分的上、下限,都是确定的值;,quad和quad8函数调用格式,tol是一个二元向量,它的第一个元素用来控制相对误差,第二个元素用来控制绝对误差,缺省时积分的相对精度为0.001; trace如果取非零值时,将以动态图形的形式展现积分的整个过程,若取零值,则不画图,其缺省值是0; pl和p2是向被积函数传递的参数。 在上面的调用格式中,前三个输入参数是调用时必须的,而后面的输入参数可缺省。,quad和quad8的参数,MATLAB的函数quad和quad8是基于数学上的正方形概念来计算函数的面积。为获得更准确的结果,两个函数在所需的区间都要计算被积函数。 与简单的梯形比较,这两个函数进行更高阶的近似,而且quad8比quad更精确。这两个函数的调用方法与fzero相同,即 >>area=quad(‘humps‘,-1,2) % find area between -1 and 2 area = 26.3450,quad和quad8函数的调用,>>area=quad8(‘humps‘,-1,2) area = 26.3450 注意: 这两个函数返回完全相同的估计面积,而且这个估计值在两个trapz面积的估计值之间。,quad和quad8函数的调用,求函数的数值积分 (1)建立函数funq function y=funq(x) y=x.^3+x.^2+2; (2)对被积函数funq进行数值积分 q=quad( funq ,-1,1,le-4) %使用quad命令求数值积分 q= 4.6667,[例13-1] example13_1.m,q8=quad8( funq ,-1,1,le-4,1) %用quad8命令求数值积分 q8= 4.6667 程序的运行结果显示出积分的过程如图13-3所示。,[例13-1],,一元函数积分中存在的问题,同样存在于多重积分中。 1、积分限为常数的二重积分 多重积分使用函数dblquad,其完整的调用格式为: result=dblquad( fun ,inmin, inmax, outmin, outmax, tol, ) 其中:输入参数fun是被积函数,可以直接用字符串内联函数或M函数文件表达,但不论什么形式,该被积函数应有两个变量,即内变量和外变量。内变量接受向量输入,外变量接受标量输入。被积函数的输出是与内变量同长的向量。,三、多重数值积分,输入参数inmin,inmax是内变量的下限和上限; outmin、outmax是外变量的下限和上限; tol的含义与命令quad中的情况相同; 是积分方法选项,如“quad”和“quad8”等。 注意: 该命令不适用于内积分区间上、下限为函数的情况。,dblquad函数的参数,求积分上下限都为常数的二重积分,被积函数为y*sin(x)+s*cos(y),其中x的取值范围是π到2π,y的取值范围是0到π。 (1)建立名为integrnd的M文件 fimction out=integrnd(x,y) out=y*sin(x)+x*cos(y) (2)用函数dblquad命令来求integrnd的二重积分 result=dblquad( integrnd ,pi,2*pi,0,pi) result= -9.8698,〖例13-6〗 example13_6.m,对于内积分上下限是外积分变量的函数的积分问题,求解过程较为麻烦。 一般方法都是先求出 ,然后再求 。,2、内积分上下限为函数的二重积分,,,【例13-10】计算。 (1)编写内积分区间上下限的M函数文件 [x_low.m] function f=x_low(y) f=sqrt(y); (2)编写被积函数 被积函数函数采用内联函数ff=inline( x.^2+y.^2 , x , y )表示。 (3)被积函数用内联函数表达时,运行以下指令,即得结果 >>ff=inline( x.^2+y.^2 , x , y );%被积函数的内联函数表达 >>SS=double_int(ff, x_low ,2,1,4) SS = 9.5810 (4)本题用符号计算很容易获得高精度解 >>Ssym=vpa(int(int( x^2+y^2 , x , sqrt(y) ,2), y ,1,4)) Ssym = 9.580952380952381,