Main Content

quadgk

计算数值积分 - 高斯-勒让德积分法

说明

示例

q = quadgk(fun,a,b) 使用高阶全局自适应积分和默认误差容限在 ab 间对函数句柄 fun 求积分。

示例

[q,errbnd] = quadgk(fun,a,b) 还返回绝对误差 |q - I| 的逼近​​上限,其中 I 是积分的确切值。

示例

[___] = quadgk(fun,a,b,Name,Value) 支持上述任一输出参数组合,且可使用一个或多个名称-值对组参数指定其他选项。例如,指定 'Waypoints',后跟实数或复数向量,为要使用的积分器指示特定点。

示例

全部折叠

计算积分

q=01exln(x)dx.

此积分在 x=0 点处具有奇异性,因为 ln(0) 发散到 -

为被积函数创建一个匿名函数。log 函数计算 ln(x)

f = @(x) exp(x).*log(x);

在从 0 到 1 的区间上对 f 求积分。

q = quadgk(f,0,1)
q = -1.3179

通过指定围道求复函数围绕极点的积分。

计算复围道积分

q=dz2z-1.

被积函数在 z=1/2 处有一个简单极点,因此使用包围该点的矩形围道。围道在实数线上的 x=1 处开始和结束。使用 'Waypoints' 名称-值对组指定围道中的分段。

f = @(z) 1./(2.*z-1);
contour_segments = [1+1i 0+1i 0-1i 1-1i];
q = quadgk(f,1,1,'Waypoints',contour_segments)
q = -0.0000 + 3.1416i

使用 quadgk 计算难以计算的振荡被积函数。

计算积分

Q=0πsin(20000πx)dx.

被积函数振荡非常快,因此很难计算。使用 quadgk 计算积分,并指定两个输出来检查接近误差容限的程度。

fun = @(x) sin(2e4*pi*x);
[Q,errbnd] = quadgk(fun,0,pi)
Warning: Reached the limit on the maximum number of intervals in use. Approximate bound on error is  5.7e-01. The integral may not exist, or it may be difficult to approximate numerically. Increase MaxIntervalCount to 1272 to enable QUADGK to continue for another iteration.
Q = -0.0082
errbnd = 0.5723

警告消息指示如何调整 MaxIntervalCount 以执行另一次求解迭代。

再次求解积分,但指定 MaxIntervalCount1e5。在使用更多区间的情况下,quadgk 就能够满足问题的绝对误差容限(1e-10 表示双精度)。

[Q,errbnd] = quadgk(fun,0,pi,'MaxIntervalCount',1e5)
Q = 1.6656e-06
errbnd = 2.6323e-12

输入参数

全部折叠

被积函数,指定为函数句柄,用于定义求 ab 的积分的函数。

对于标量值问题,函数 y = fun(x) 必须接受向量参数 x 并返回向量结果 y,其中 y 是被积函数在 x 的每个元素处的计算结果。此要求通常意味着 fun 必须使用数组运算符(.^.* 等)而不是矩阵运算符(^* 等)。

参数化函数解释了如何为函数 fun 提供其他参数(如果需要)。

示例: q = quadgk(@(x) exp(1-x.^2),a,b) 对匿名函数句柄进行积分。

示例: q = quadgk(@myFun,a,b) 对函数 myFun 进行积分,并保存为文件。

数据类型: function_handle

积分范围,以两个实数标量或复数标量参数指定。极限 ab 可以是 -InfInf。如果这两个范围都是有限值,它们可以是复数。如果至少一个是复数,则在复平面中的 ab 之间沿直线路径近似求取积分。

示例: quadgk(fun,0,1)01fun 进行积分。

数据类型: single | double
复数支持:

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: q = quadgk(fun,a,b,'Waypoints',[0.1 1.1 2.1]) 使用 'Waypoints' 选项指定几个应计算被积函数的关注点。

绝对误差容限,指定为由 'AbsTol' 和非负实数组成的逗号分隔对组。quadgk 使用绝对误差容限来限制绝对误差估计值,即 |q – I|,其中 q 为计算的积分值,I 为(未知)确切值。如果减小绝对误差容限,quadgk 可以提供更多位小数的精度。

quadgk 尝试满足

errbnd <= max(AbsTol,RelTol*abs(q))
如果 |q| 足够小,此关系是绝对误差控制;如果 |q| 较大,这是相对误差控制。要实现纯粹的绝对误差控制,请使用 'AbsTol' > 0'RelTol'= 0。要实现纯粹的相对误差控制,请使用 'RelTol' > 0'AbsTol' = 0。除使用纯粹的绝对误差控制这一情况外,最小相对误差为 'RelTol' >= 100*eps(class(q))

示例: quadgk(fun,a,b,'AbsTol',1e-12) 将绝对误差容限设置为约 12 位小数精度。

示例: quadgk(fun,a,b,'AbsTol',tol,'RelTol',0) 使用纯粹的绝对误差控制,要求 errbnd <= tol

数据类型: single | double

相对误差容限,指定为由 'RelTol' 和非负实数组成的逗号分隔对组。quadgk 使用相对误差容限来限制相对误差容限估计值,即 |q - I|/|I|,其中 q 为计算的积分值,I 为(未知)确切值。如果减小相对误差容限,quadgk 可以为精度提供更多的有效数位。

quadgk 尝试满足

errbnd <= max(AbsTol,RelTol*abs(q))
如果 |q| 足够小,此关系是绝对误差控制;如果 |q| 较大,这是相对误差控制。要实现纯粹的绝对误差控制,请使用 'AbsTol' > 0'RelTol'= 0。要实现纯粹的相对误差控制,请使用 'RelTol' > 0'AbsTol' = 0。除使用纯粹的绝对误差控制这一情况外,最小相对误差为 'RelTol' >= 100*eps(class(q))

示例: quadgk(fun,a,b,'RelTol',1e-9) 将相对误差容限设置为约 9 位有效数位。

示例: quadgk(fun,a,b,'AbsTol',0,'RelTol',tol) 使用纯粹的相对误差容限,要求 errbnd <= |I|*tol

数据类型: single | double

积分路点,指定为由 'Waypoints' 和实数/复数的向量组成的逗号分隔对组。使用路点表示积分器将在初始网格中使用的积分区间中的点。

  • 在关注的函数特征附近添加更多计算点,例如局部极值。

  • 通过指定不连续点的位置,在被积函数的不连续点附近高效求积分。

  • 通过指定复数作为路点来执行复围道积分。如果 xminxmax 或任何路点向量项为复数,则会在复平面中针对直线路径序列求积分。在本例中,所有积分范围和路点必须为有限值。

请勿使用路点指定奇异点。而应拆分区间,并在端点处将单独的积分结果与奇异点相加。

示例: 'Waypoints',[1+1i,1-1i] 指定了积分区间中的两个复数路点。

数据类型: single | double
复数支持:

允许的最大区间数,指定为标量。此选项用于限制 quadgk 在第一次迭代后每一次迭代时所使用的区间数。如果 quadgk 由于此限制而提前返回,系统会发出警告。不建议常规性地增大该值,但当 errbnd 小到几乎达到所需的精确度时,这样做很合适。

示例: quadgk(fun,a,b,'MaxIntervalCount',700)

输出参数

全部折叠

积分的值,以标量形式返回。

绝对误差的近似上限,以标量形式返回。积分中绝对误差的近似上限是 errbnd = |q – I|,其中 q 是积分的计算值,I 是(未知的)精确值。quadgk 尝试满足

errbnd <= max(AbsTol,RelTol*abs(q))
指定此输出参数,以查看积分在多大程度上满足 AbsTolRelTol 误差容限。如果 errbnd 接近期望值,您可以通过增加 MaxIntervalCount 的值来达到该期望值。

提示

  • quadgkintegral 使用基本相同的积分方法。您通常应使用 integral 而不是 quadgk。不过,您可以使用 quadgk 执行以下操作:

    • 使用 errbnd 输出参数监控解的准确度。

    • integral 警告达到最大区间数时,请为 MaxIntervalCount 指定较大的值。

  • 如果奇异性不太强,quadgk 函数可对有限端点处奇异的函数求积分。例如,它可对在端点 c 处的行为类似于 log|x-c||x-c|p(其中 p >= -1/2)的函数求积分。如果函数在积分范围 [a b] 内的各点上有奇异性,则在奇异点为端点的子区间上将积分写入为积分和,通过 quadgk 计算它们,并将结果相加。

  • 如果区间是无限区间(例如 [a,)),则要存在 fun(x) 的积分,fun(x) 必须在 x 接近无限大时衰减,并且 quadgk 要求它快速衰减。

参考

[1] Shampine, L.F. "Vectorized Adaptive Quadrature in MATLAB®." Journal of Computational and Applied Mathematics. Vol. 211, 2008, pp.131–140.

扩展功能

C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

版本历史记录

在 R2007b 中推出