Python中对向量化函数进行自适应矩形积分计算
我在寻找一个超级强大的数值积分函数。它应该具备以下三个特点:
- 自适应 - 它能够自动调整采样点的密度,以适应被积函数。这一点非常重要,因为我的被积函数变化很大,而且计算起来很费劲。
- 向量化 - 它可以同时处理一组采样点,而不是一个一个地处理,这样效率更高。
- 能够处理向量值函数 - 被积函数的所有分量可以同时计算,不会增加额外的成本,所以没必要单独对每个分量进行积分。
此外,它还应该是:
- 二维的 - 我想计算的积分是一个平面区域上的双重积分,我希望能够指定一个整体的(相对的)容忍度,并且让它合理管理误差预算。
有没有人知道有这样的库?即使只有四个特点中的两个或三个也比没有要好。
我正在使用Python和SciPy,所以如果它已经可以和Python一起使用,那就更好了。(不过如果需要,我也能写一些代码来让它调用我的被积函数。)
3 个回答
1
quadrature
函数在 scipy.integrate
中可以满足你所需要的前两个条件。类似的 romberg
函数则使用了一种 不同的方法。
其他一些函数只满足其中一个条件:
- 同名的
quad
函数采用自适应的积分方法,但只支持一个标量参数的函数。你可以传入一个ctypes
函数来提高性能,但普通的 Python 函数会非常慢。 simps
函数和相关的采样方法可以接收一组(通常是均匀间隔的)样本,但它们不是自适应的。
你提到的第三个条件(同时对一个向量值函数进行积分)有点复杂,并且与接受向量化函数的能力相冲突(因为函数参数必须接受一个矩阵!)同样,计算双重积分的能力也会让函数的定义变得更加复杂。
在大多数情况下,quadrature
函数是最合适的选择。
1
我用过这个库,它能满足你所有的需求,只是它是用C语言写的。不过,它也有一个R语言的接口,所以你可以试着从Python调用R(这是可行的)。
http://ab-initio.mit.edu/wiki/index.php/Cubature_(Multi-dimensional_integration)
或者,你可以通过ctypes来调用这个库(虽然不是特别简单,但也是可以做到的)。
5
我刚刚在quadpy中实现了针对一维和二维区域的向量自适应积分方法。你只需要提供你要计算的区域的三角剖分和你想要积分的函数。这个函数可以是向量值的。
你可以通过以下方式安装quadpy:
pip3 install quadpy
然后运行:
import numpy
import quadpy
triangles = numpy.array(
[[[0.0, 0.0], [1.0, 0.0]], [[1.0, 0.0], [1.0, 1.0]], [[0.0, 1.0], [0.0, 1.0]]]
)
val, error_estimate = quadpy.triangle.integrate_adaptive(
lambda x: [numpy.sin(x[0]), numpy.exp(x[0])], triangles, 1.0e-10
)
print(val)
print(error_estimate)
这样就会得到:
[ 0.45969769 1.71828183]
[ 7.10494337e-12 3.68776277e-11]