Python中对向量化函数进行自适应矩形积分计算

7 投票
3 回答
6079 浏览
提问于 2025-04-16 22:35

我在寻找一个超级强大的数值积分函数。它应该具备以下三个特点:

  • 自适应 - 它能够自动调整采样点的密度,以适应被积函数。这一点非常重要,因为我的被积函数变化很大,而且计算起来很费劲。
  • 向量化 - 它可以同时处理一组采样点,而不是一个一个地处理,这样效率更高。
  • 能够处理向量值函数 - 被积函数的所有分量可以同时计算,不会增加额外的成本,所以没必要单独对每个分量进行积分。

此外,它还应该是:

  • 二维的 - 我想计算的积分是一个平面区域上的双重积分,我希望能够指定一个整体的(相对的)容忍度,并且让它合理管理误差预算。

有没有人知道有这样的库?即使只有四个特点中的两个或三个也比没有要好。

我正在使用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]

撰写回答