【发布时间】:2013-12-05 15:56:23
【问题描述】:
我正在尝试在一个点列表上集成一个函数,并将整个数组传递给一个集成函数,以便对事物进行矢量化。对于初学者来说,调用 scipy.integrate.quad 太慢了,因为我有 10 000 000 个积分需要积分。使用 scipy.integrate.romberg 会更快,几乎是瞬间完成,而 quad 很慢,因为您必须循环它或对其进行矢量化。
我的函数相当复杂,但出于演示目的,假设我想将 x^2 从 a 积分到 b,但 x 是一个标量数组来评估 x。例如
将 numpy 导入为 np
from scipy.integrate import quad, romberg
def integrand(x, y):
return x**2 + y**2
quad(integrand, 0, 10, args=(10) # this fails since y is not a scalar
romberg(integrand, 0, 10) # y works here, giving the integral over
# the entire range
但这仅适用于固定界限。有没有办法做类似的事情
z = np.arange(20,30)
romberg(integrand, 0, z) # Fails since the function doesn't seem to
# support variable bounds
我看到的唯一方法是在 numpy 中重新实现算法本身并使用它来代替,这样我就可以拥有可变界限。任何支持这样的功能?还有 romb,你必须直接提供被积函数的值和一个 dx 区间,但这对于我的复杂函数来说太不精确了(marcum Q 函数,找不到任何实现,这可能是另一种方式来点它)。
【问题讨论】:
标签: python numpy scipy integrate