向量化scipy.integrate.quad

4
我正在使用scipy.integrate.quad(f,a,b,args =(c,))来计算 f 函数在 ab 之间的积分值,并添加参数 c。可以将f视为:
f = lambda x, y: x*y 

据我所知,该函数要求abc是浮点数。然而,我有许多积分需要解决,所有的积分都使用相同的函数,只是在abc向量上进行。逐个迭代所有向量效率相当低下。是否有任何方法可以加速/向量化此操作?

不同的 ab 意味着在不同的范围内评估 f,并且间隔数量也不同。这使得向量化(考虑2D网格)几乎不可能。 - hpaulj
@hpaulj 在某些光滑条件下,至少将c作为向量应该是“容易”实现的。 - FooBar
“quad” 调用 FORTRAN 代码,因此它所做的事情可能已经尽可能高效。因此,您可以以更智能的方式少调用它。或者,您可以编写自己的积分器(或找到另一个),利用问题中的并行性(最有可能是线性)。 - hpaulj
3个回答

3

遗憾的是,integrate.quad 不支持该功能。

你可以尝试使用高斯积分方法:scipy.integra.fixed_quad 对于类似数组的输入会出现问题,但计算多项式的根和权重的低级程序应该可行。在这里查看"正交多项式的根和权重"部分here。当然,具体情况还需自己实践。


3

看起来,numpy已经通过实现numpy.vectorize响应了这一问题,并在integrate中进行了示例覆盖。这是一个带有两个变量的修改后的示例:

fun2int = lambda x, a: np.sqrt(x+a)
intfun = lambda a: integrate.quad(fun2int, 0, 4, args=(a))[0]
vec_int = np.vectorize(intfun)
vec_int(np.linspace(0,2,5))
Out[1]: array([5.33333333, 6.12825877, 6.78689326, 7.37435069, 7.91234089])

还有 integrate.quad_vec(scipy 版本为 1.4.1),但我没有测试过。


0
如果我理解问题正确,我会只需要在一个包含参数 a,b,c 的数组上运行该函数。例如,将两组 a,b,c 参数设置为一个数组:
a = np.array([[0.1,0.2,0.3], [0.9,0.8,0.3]])

然后设置一个空列表来存储结果:

L = []

并循环遍历数组:

for a,b,c in a:

    b = integrate.quad(f, a, b, args=(c,))
    L.append(b)

结果是一个元组列表:

[(0.004500000000000001, 4.996003610813206e-17), (-0.025499999999999995, 2.8310687127941485e-16)]

也许有更优雅的方法,但希望这可以帮到你。


1
我知道那个解决方案,但它非常低效。我正在寻找另一种替代方法。 - FooBar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接