Wolfram 语言中的数值积分简介

概述

Wolfram 语言函数 NIntegrate 处理的是一般的数值积分. 它可以处理大量的一维和多维积分.

NIntegrate[f[x1,x2,,xn],{x1,a1,b1},{x2,a2,b2},,{xn,an,bn}]
在区域 [a1,b1]×[a2,b2]××[an,bn] 上找到函数 f 的数值积分

在一个区域找到函数的一个数值积分.

一般来说,NIntegrate 通过在积分区域上对被积函数值进行采样进行积分的估计. 各种数值积分方法对初步采样步骤,以及采样如何演变做出规定.

对积分 进行数值计算:
该图绘制了计算被积函数点 值的序列. 靠近 时的采样更密集,其中被积函数变化更快:

NIntegrate 使用的算法被称作"积分策略",尝试计算积分估计,使之满足用户指定的精度和准确度的目标. 积分策略运用 "积分规则" 使用加权和计算被积函数值的积分估计.

使用特殊的积分策略和规则计算数值积分:

符号预处理

NIntegrate 使用符号预处理简化特殊结构的积分且自动选择积分方法. 被积函数是偶函数或奇函数或包含分段函数可能导致积分区域被转换成或分成多个不同的积分区域.

对分段函数在区间 上进行积分. 积分区域自动在奇异点 分开:

高振荡的被积函数被识别且会应用指定的积分规则.

这里对一个高度振荡函数在区间 上进行积分. 自动选择适于傅立叶正弦积分的一种专用方法:
这是先前的被积函数在积分区域的 上的图形:

符号预处理允许自动计算包括不连续性和快速变化区域的各种积分.

这里对一个在某一个区域有高度振荡的分段函数进行积分. 积分区域自动在 处分开,特殊的傅立叶方法应用于振荡区域

求积规则

NIntegrate 包括大部分经典的一维求积规则.

以下是执行不同的标准求积规则的一维积分:

经典的求积规则是对被取样的被积函数值形成线性组合. 对于每个求积规则,线性组合中的加权向量是固定的.

这些是在单位间隔 上的三点 NewtonCoet求积规则的节点和权:

对于多维积分,NIntegrate 包含一类基于稀疏网格的规则,并且允许从一维规则的笛卡尔积形成规则.

默认方法 "MultidimensionalRule" 是稀疏网格规则:
笛卡尔积规则可以被指定为一个一维的规则的列表,为每个维度一个:
以下显示了上面两个多维规则每个的第一步所使用的采样点:

Boole 可用于指定更多复杂的多维区域. 这种方式指定的区域在符号预处理时可进一步简化.

这是一个二维函数:一个基部位于正方形 × 内的圆锥:
这是该锥形函数的数值积分:
这是 NIntegrate 所用的采样点. 注意采样点仅出现在1/4的积分区域内,并且所有的采样点均位于区域 内:
这是未进行符号预处理时 NIntegrate 所用的采样点. 自适应算法必须在整个积分区域采样. 并且围绕区域 的边界进行密集采样. 由于没有应用符号预处理,NIntegrate 必须高效地数值定位此边界:

振荡积分

NIntegrate 包含适用于各种被积函数的普通的振荡积分方法,可用于一维或多维的有限或无限区域. 另外, NIntegrate 包含许多方法,特别适用于含有 Exp,三角函数诸如 SinCos,以及某种其它特殊函数诸如 BesselJ 等特殊形式的一维积分函数.

计算不规则振荡函数的数值积分:
该图绘制了上面在有限范围的不规则振荡函数:

自动奇点处理

NIntegrate 处理奇异被积函数有多种方式. 确定性自适应策略 "GlobalAdaptive""LocalAdaptive" 采用奇点处理技术(基于变量变换)来加速积分过程的收敛. "DoubleExponential" 策略运用梯形求积法,并对被积函数进行一种特殊的变量变换. 在包含积分区间的复平面上的开放集合中,这种规则变换组合实现了被积函数的最佳收敛.

这是一个进行奇点处理的一维积分:
我们可以进行 100 次积分以便获得更精确的时间信息:
不进行奇点处理,前面积分的计算速度比较慢:

特殊策略

"DuffyCoordinates" 策略简化或消去了多维积分中的某些类型的奇点. 某种球对称的积分收敛很快.

这是一个使用 "DuffyCoordinates" 的积分:
这里是默认设置时对前面的积分的计算,其速度约是原来的1/5:
这是使用 NIntegrate 的缺省设置进行同样的积分. 同样获得正确的结果,但是计算时间更长:

当解析周期被积函数的积分区间正好是一个周期时,"Trapezoidal" 策略给出最佳收敛.

这里使用梯形策略计算一个积分,并将结果与准确结果比较. 运用 "Trapezoidal" 可以较快地得到结果,并且比 NIntegrate 在默认设置下的计算结果更准确:
这是在 NIntegrateMethod 的设置缺省时,对同一积分的计算(较慢):

对于高维积分,或者只需要一个粗略的积分估计的情况,蒙特卡洛方法是有用的. NIntegrate 有原始蒙特卡洛、自适应蒙特卡洛以及准蒙特卡洛策略可选.

这是一个用自适应蒙特卡洛算法快速计算的高维积分:

设计

NIntegrate 框架的主要特征是:

  • 面向对象(方法属性规范和交流)
  • 方法初始化阶段和运行时间计算的分离
  • 分层和折返数值方法
  • 类型及精密动态方法
  • 通过插件功能的用户可扩展性和原型设计
  • 专业化数据结构

策略、规则和预处理器

NIntegrate 积分策略是根据它们如何在积分区域采样,如何应用被积函数的类,它们是否是基于规则的策略进行分类.

"GlobalAdaptive"任何被积函数,自适应采样,基于规则
"LocalAdaptive"任何被积函数,自适应采样,基于规则
"DoubleExponential"任何被积函数,均匀采样
"Trapezoidal"任何被积函数,均匀采样
"MultiPeriodic"多维被积函数,均匀采样
"MonteCarlo"任何被积函数,均匀随机采样
"QuasiMonteCarlo"任何被积函数,均匀准随机采样
"AdaptiveMonteCarlo"任何被积函数,自适应随机采样
"AdaptiveQuasiMonteCarlo"任何被积函数,自适应准随机采样
"DoubleExponentialOscillatory"一维无限范围振荡被积函数
"ExtrapolatingOscillatory"一维无限范围振荡被积函数

NIntegrate 积分策略

自适应采样策略是通过在子区域使用更大的错误估计进行更频繁的采样来尝试改善积分估计,一般是细分那些子区域. 均匀采样策略是通过在整个积分区域均匀增加采样密度来尝试改善积分估计.

基于规则策略将一个给定的积分规则应用于每个子区域,以获得该区域的积分和错误估计. 积分规则可以使用设置 Method->{"strategy",Method->"rule"} 来指定.

以下是如何在每个子区域用具有 Clenshaw-Curtis 求积的全局自适应细分指定一个积分:

NIntegrate 积分规则可以根据它们是应用于一维或多维区域,以及积分规则的类型进行分类.

"BooleRule"一维,加权和
"ClenshawCurtisRule"一维,加权和
"GaussBerntsenEspelidRule"一维,加权和
"GaussKronrodRule"一维,加权和
"LobattoKronrodRule"一维,加权和
"LobattoPeanoRule"一维,加权和
"NewtonCotesRule"一维,加权和
"TrapezoidalRule"一维,加权和
"ClenshawCurtisOscillatoryRule"一维,专用振荡规则
"LevinRule"一维或多维,一般振荡规则
"MultipanelRule"一维,加权和,一维规则的组合
"CartesianRule"多维,加权和,一维规则的乘积
"MultidimensionalRule"多维,加权和

可以与基于规则策略 "GlobalAdaptive""LocalAdaptive" 一起使用的积分规则.

经典的加权和类型规则估计点集的函数值的预设线性组合的积分. 振荡规则使用求积加权估计积分,其依赖于被积函数的特殊振荡内核.

组合规则从一个或多个子规则构建求积规则. 它们由设置 Method->{"rule",Method->{"subrule1",}} 指定.

以下是如何制定两个一维子规则的笛卡尔积的多维规则:

所有策略的能力通过被积函数的符号预处理得到延伸. 预处理是由预处理策略控制的,首先变换或分析积分,然后把积分托付给另一个策略(经常是另一个预处理策略).

"SymbolicPreprocessing"全局预处理控制器
"EvenOddSubdivision"简化奇偶被积函数
"InterpolationPointsSubdivision"细分包含内插函数的被积函数
"OscillatorySelection"检测振荡被积函数并选择合适的方法
"SymbolicPiecewiseSubdivision"细分包含分段函数的被积函数
"UnitCubeRescaling"重新调整多维被积函数到单位立方体
"DuffyCoordinates"多维奇点消除变换
"PrincipalValue"等价于柯西主值的数值积分

NIntegrate 预处理器策略

预处理策略是由设置 Method->{"preprocessor",Method->m} 来指定的,其中 m 是预处理完成后积分被托付的策略或规则.

以下是如何明确应用预处理策略于一个关于两个变量的被积函数. 预处理后,积分被托付给 "LocalAdaptive" 策略:

预处理策略经常减小最后积分策略所需要的工作量.

以下是以前积分的采样点. 没有预处理,需要四倍的采样点来覆盖整个积分区域:

用户可扩展性

内置方法可作为对专用积分进行高效构建的构件块,并可以添加用户定义的积分规则、积分策略和预处理策略.