第 8 章 数值积分与数值微分 8.1 Newton-Cotes 公式 Newton-Cotes 公式 8.2 复化求积公式 复化求积公式 8.3 自适应步长求积方法 自适应步长求积方法 8.4 Gauss 求积方法 Gauss 求积方法 8.5 特殊函数的积分 特殊函数的积分 8.6 数值积分的 MATLAB 函数求解 数值积分的 MATLAB 函数求解 8.7 数值微分 数值微分 8.8 实例解析 实例解析 本章目标:近似计算 和
思路思路 利用插值多项式 则积分易算。 在 [a, b] 上取 a x 0 < x 1 <…< x n b ,做 f 的 n 次插值多 项式 ,即得到 AkAk 由 决定, 与 无关。 节点 f (x) 插值型积分公式 误差 8.1 Newton-Cotes 公式
一、梯形公式 用直线代替 y=f (x) :
二、 Simpson 公式 利用二次插值多项式近 似代替 f (x) 。
三、 Cotes 公式 在 Newton-Cotes 公式中取 则有
高次插值有 Runge 现象, 故采用分段低次插值 分段低次合成的 Newton-Cotes 复合求积公式。 8.2 复化求积公式
一、复化梯形公式 : 在每个 上用梯形公式: =Tn=Tn /* 中值定理 */
二、复化辛普森公式 : = Sn= Sn 注:为方便编程,可采用另一记法:令 n’ = 2n 为偶数, 这时 ,有
三、复化 Cotes 公式 : 注:为方便编程,可采用另一记法:令 n’ = 4n 为偶数, 这时 ,有 类似于复化梯形公式和复化辛普森公式的推导过程,可以得到 复化 Cotes 公式:
可用来判断迭代 是否停止。 8.3 自适应步长求积方法
复合辛普生公式? 两个梯形公式? 精度大大提高!
在相同的 n (一定的采样条件)下取得更高的精度!! 在相同的 n 时收敛的更快!!! 利用低阶公式产生高精度的结果。 Romberg 序列 Newton-Cotes 类似的有:
龙贝格( Romberg )求积 基本思想: 梯形公式的逐次分半过程进行加速。
Richardson 外推公式
Romberg 算法: < ? … … … T 1 = )0( 0 T T 8 = )3( 0 T T 4 = )2( 0 T T 2 = )1( 0 T S 1 = )0( 1 T R 1 = )0( 3 T S 2 = )1( 1 T C 1 = )0( 2 T C 2 = )1( 2 T S 4 = )2( 1 T < ? 折半 直到 又叫:数值积分逐次分半加速收敛法
8.4 Gauss 求积方法 将节点 x 0 … x n 以及系数 A 0 … A n 都作为待定系数。 令 f (x) = 1, x, x 2, …, x 2n+1 代入可求解,得到的公式 具有 2n+1 次代数精度。这样的节点称为 Gauss 点, 公式称为 Gauss 型求积公式。 为使问题更具一般性, 我们研究带权积分 (x) 为权函数, A k (k = 0,1,…,n) 为不依赖于 f (x) 的求积系数, x k (k = 0,1,…,n) 为求积节点. 要使 (8.1) 具有 2n+1 次代数精度,则需要满足 构造具有 2n+1 次代数精度的求积公式 (8.1)
8.5 特殊函数的积分 一、振荡函数的积分 工程问题中有时要计算如下形式的积分: 其中 。当 w 很大时, coswx 与 sinwx 在区间 (a,b) 内与 x 轴有很多个交点,称 其为振荡函数。相应地,当 w 很大时, f(x)coswx 与 f(x)sinwx 在区间 (a,b) 内与 x 轴 也有很多个交点。称上述积分为振荡函数的积分。
二、反常(广义)积分 1 、无界函数的反常积分 设函数 在区间 上连续, b 为奇点。若对 且 ,称极限 为无界函数 在 上的反常积分(或暇积分),记为 。 2 、无穷区间上的反常积分 设对任何大于 a 的实数 b , f (x) 在 [a,b) 上均可积,则称极限 为 f (x) 在无穷区间 上的反常积分,记为 。
对于无穷区间上的反常积分通常有两种解决方法: 无穷区间逼近 变量替换 在某些情况下,可以通过变量替换将无穷区间的积分变成有限区间的积分。
做等距节点, x 轴, y 轴分别有: 先计算 ,将 x 作为常数,有 再将 y 作为常数,在 x 方向,计算上式的每一项的积分 三、重积分的计算 —— 以二重积分的复化梯形公式为例说明。
系数:在积分区域的四个角点为 1/4 , 4 个边界为 1/2 ,内部节点为 1
8.6 数值积分的 MATLAB 函数求解 1 、 trapz() 函数 MATLAB 中的 trapz() 函数是基于复化梯形公式设计编写的,其一般调用格式为: I=trpaz(x,y,dim) 其中 x,y 是观测数据, x 可以为行向量或列向量, y 可以为向量或矩阵, y 的行数应等于 x 向量的元素个数; dim 表示按维进行求积,若 dim=1 (缺省值),则按行求积,若 dim=2 ,则按列求积。 2 、 quad() 函数 MATLAB 提供的 quad() 函数是基于自适应辛普森法设计的,该函数的调用格式为: [q,fcnt] = quad(fun,a,b,tol,trace,p1,p2,...) 其中 fun 是被积函数,可以是字符表达式、内联函数、匿名函数和 M 函数; a,b 是定积分 的上限和下限; tol 为指定的误差限,缺省值为; trace 提供中间输出 [fcnt a b-a q] ,若 trace=[] ,则 quad 不提供中间输出; p1,p2,... 是函数 fun 的附加参数。 q 是返回的数值积分; fcnt 返回函数评估的次数。 另外, MATLAB 还提供了一个新的函数 quadl() 。其调用格式与 quad() 函数完全一致, 使用的算法是自适应 Lobatto 算法,其精度和速度均远高于 quad() 函数,所以在追求高 精度数值解时建议使用该函数。
3 、 quadgk() 函数 quadgk() 函数是 MATLAB R2007b 版本提供的基于 Gauss-Kronrod 算法实现的数值积分函 数,该函数可以用来求解振荡函数的积分、广义积分甚至是复数积分,其一般调用格 式为: [q,errbnd] = quadgk(fun,a,b,param1,val1,param2,val2,...) 其中 fun 是被积函数,可以是字符表达式、内联函数、匿名函数和 M 函数; a,b 是积分的 上限和下限,它们可以为 -inf 和 inf ; parami,vali 是指相关属性名及其属性值,具体的值 见书本。 4 、 dblquad() 函数 MATLAB 提供的 dblquad() 函数是用来求解长方形区域的双重积分的。其一般调用格式 为: q = 甚至用户 自己编写的数值积分求解函数,但要求其调用格式与 quadl() 函数完全一致,其余参数 大致同函数 quadl() 。 对于一般区域的二重积分, MATLAB 提供了 quad2d() 函数来求取。该函数的一般调用 格式为: q = quad2d(fun,a,b,c,d,param1,val1,param2,val2,...)
5 、 triplequad() 函数 MATLAB 提供的 triplequad() 函数是用来求解长方体区域的三重积分的函数,该函数的 调用格式为: 、 q = triplequad
数值微分就是用函数值的线性组合近似函数在某点的导数值. 中点法 按导数定义, 是差商 当 时的极限取差商作为 导数的近似值,建立简单的数值微分方法 : (8.1) 向后差商近似导数 (8.2) (8.3) 中心差商近似导数 容易看出,就精度而言,以( 8.3 )式更为可取,称 (8.4) 为 的中点公式, 其中 h 为一增量,称为步长. 这种数值微分方法称 为中点方法, 它是前两种方法的算术平均. 8.7 数值微分
下面给出一种具有 精度级的中心差分算法。该算法的一到四阶微分公 式为: