Python中的数值积分与向量化函数的自适应求积法

时间:2011-07-30 21:57:18

标签: python numpy scipy vectorization numerical-integration

我正在寻找超级数字正交函数。它应该具有以下三个属性:

  • 自适应 - 它会自动调整采样点的密度以适应被积函数。这是绝对必要的,因为我的被积函数非常不均匀且计算成本很高。
  • Vectorized - 为了提高效率,它会一次调用采样点列表上的被积函数,而不是一个点。
  • 能够处理向量值函数 - 向量值被积函数的所有组件都是同时计算的,无需额外成本,因此单独集成所有组件是没有意义的。

此外,它应该是:

  • 2D - 我想要计算的积分是平面区域的双积分,我希望能够指定整个积分的整体(相对)容差,并让它适当地管理误差预算。

有人知道有这样一个函数的库吗?即使是四个属性中的两个或三个也不会没有。

我正在使用Python和SciPy,所以如果它已经与Python一起使用,那就是奖励。 (但是我也可以编写胶水代码,让它在必要时调用我的被积函数。)

3 个答案:

答案 0 :(得分:4)

我刚刚在quadpy中为1D和2D域实现了矢量化自适应积分。您需要提供的只是对您的域和要集成的功能的三角测量。它可能是矢量值。

使用

安装quadpy
select 
    *
from 
(
    select col from query1
    union
    select col from query2
) d
order by 
    case when col in (select col from query1) then 0 else 1 end, 
    col

并运行

pip 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.adaptive_integrate(
        lambda x: [numpy.sin(x[0]), numpy.exp(x[0])],
        triangles,
        1.0e-10
        )

print(val)
print(error_estimate)

答案 1 :(得分:1)

我使用了这个库,它做了你想要的一切,除了用C语言编写。但是它也有一个R接口,所以也许你可以用Python调用R(这是可能的)。

http://ab-initio.mit.edu/wiki/index.php/Cubature_(Multi-dimensional_integration)

或者,您可以使用ctypes调用库(它不是直接的,但它是可行的)。

答案 2 :(得分:1)

quadrature中的scipy.integrate函数满足您要查找的前两个要求。类似的romberg函数使用different method

其他功能仅满足其中一项要求:

  • 同名的quad函数执行自适应求积法,但仅支持带标量参数的函数。您可以将ctypes函数传递给它以提高性能,但正常的Python函数将非常慢。
  • simps函数和相关的采样方法可以传递(通常是均匀间隔的)样本的矢量,但不是自适应的。

你列出的第三个要求(向量值函数的同时积分)有点深奥,并且与首先接受向量化函数的能力相冲突(函数参数必须采用矩阵!)同样,计算双积分的能力会使函数的规范显着复杂化。

在大多数情况下,quadrature功能将成为可能。