繁体   English   中英

scipy集成具有可变边界的数组

[英]scipy integrate over array with variable bounds

我试图在一个点列表上集成一个函数,然后将整个数组传递给一个集成函数,以便对事物进行矢量化处理。 对于初学者来说,调用scipy.integrate.quad太慢了,因为我有大约1 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中重新实现算法本身,而改用numpy,这样我就可以拥有可变范围。 任何支持这种功能的功能? 还有一个问题,您必须直接提供integrand的值和一个dx间隔,但这对于我复杂的函数来说太不精确了(marcum Q函数找不到任何实现,这可能是对其加点的另一种方式)。

尝试评估特殊功能时,最好的方法是编写一个使用该功能的属性在所有参数范围内快速,准确地评估它的函数。 对于所有参数范围,单一方法不太可能给出准确(甚至稳定)的结果。 在这种情况下,对积分的直接求值在许多情况下几乎肯定会崩溃。

就是说,可以通过将积分转化为微分方程并将其求解来解决评估许多范围内的积分的一般问题。 大致来说,步骤是

  1. 给定一个积分I(t),我将假定它是函数f(x)从0到t的积分[可以将其推广到任意下限],将其写为微分方程dI / dt = f(x )。
  2. 使用scipy.integrate.odeint()求解从0到t的某些时间范围内的某些初始条件(此处为I(0))的微分方程。 此范围应包含所有感兴趣的限制。 采样的精细程度取决于功能以及需要对其评估的准确性。
  3. 对于我们输入的t集合,结果将是从0到t的积分值。 我们可以使用插值将其转换为“连续”功能。 例如,使用样条曲线,我们可以定义i = scipy.interpolate.InterpolatedUnivariateSpline(t,I)
  4. 分别给定数组ba一组上限和下限,那么我们可以立即将它们全部评估为res=i(b)-i(a)

这种方法是否适合您的情况,需要您在参数范围内仔细研究它。 还要注意,Marcum Q函数涉及一个半无限积分。 原则上这不是问题,只需在有限范围内将积分转换为一个即可。 例如,考虑转换x-> 1 / x。 无法保证此方法在数值上对您的问题稳定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM