



积分可以解释为曲线与 x 轴之间的面积,根据该区域是在 x 轴的上方还是下方来确定结果的符号。有些积分无法用符号方法直接计算,而必须用数值方法近似计算。一个典型的例子就是高斯误差函数,这在第1章1.3节中提到过。其定义公式如下:
此外,这里出现的积分不能用符号方法进行计算。
在本节中,我们将了解如何使用SciPy软件包中的数值积分例程计算函数积分。
我们使用scipy.integrate模块,该模块包含多个用于计算数值积分的例程。我们还将以np的形式导入NumPy库。我们导入该模块的方式如下:
以下步骤描述了如何使用SciPy对函数进行数值积分:
1.我们需要计算 x =1时误差函数的积分。为此,我们需要在Python中定义被积函数(积分中出现的函数):
在scipy.integrate中,有两个主要例程可用于执行数值积分(quadrature)。第一个是quad函数,使用QUADPACK执行积分,第二个是quadrature方法。
2.quad例程是一种通用的积分工具。它需要三个参数,即待积分的函数(erf_integrand)、下限(-1.0)和上限(1.0):
第一个返回值是积分值,第二个是误差估计值。
3.使用quadrature例程进行同样的积分计算,参数与quad例程的参数相同。我们会得到以下结果:
输出的格式与代码相同,先是积分值,然后是误差估计值。请注意,quadrature例程的误差要大一些。这是由于一旦估计误差低于给定的容差,方法就会终止,而这个容差可以在调用例程时被修改。
大多数数值积分技术都遵循相同的基本程序。首先,我们在积分区域内选择点 x i , i= 1,2,…, n ,然后使用这些值和 f ( x i )的值来近似积分。例如,利用梯形法则,我们用下面的公式来近似积分:
这里, a < x 1 < x 2 <…< x n -1 < b ,而 h 是相邻的 x i 值之间的差值(这里 h 相同),包括端点 a 和 b 。这可以用Python实现如下:
quad和quadrature使用的算法要比这复杂得多。使用该函数近似计算erf_integrand的积分,使用具有500个步长的梯形方法,结果为1.4936463036001209,这与quad和quadrature例程的近似值一致,结果精确到小数点后5位。
quadrature例程使用的是固定容差的高斯积分法,而quad例程使用的是Fortran库QUADPACK实现的自适应算法。对这两个例程进行计时,我们发现对于本例描述的问题,quad例程比quadrature例程快约5倍。quad例程的平均执行时间约为27μs,平均执行次数超过100万次;而quadrature例程的平均执行时间约为134μs(根据你的系统不同,你的结果可能会有所不同)。一般来说,你应该使用quad例程,因为它既快又准,除非你确实需要使用quadrature例程实现高斯积分。
本节提到的例程要求已知被积函数,但情况并非总是如此。相反,可能的情况是,我们知道 y = f ( x )的若干对( x , y )值,但不知道具体的函数 f 来求其他点的值。在这种情况下,我们可以使用scipy.integrate中的一种采样正交技术。如果已知点的数量非常多,并且所有点的间距相等,我们可以使用龙贝格(Romberg)积分法对积分进行近似。为此,我们使用romb例程。否则,我们可以利用trapz例程使用梯形法则的变体(如前所述),或利用simps例程使用辛普森法则求积。