可变边界数组上的scipy积分

2024-09-26 22:50:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一个点列表上集成一个函数,并将整个数组传递给一个积分函数,以便对它进行矢量化。首先,打电话scipy.integrate.quad太慢了,因为我有10万个点要整合。使用scipy.integrate.romberg公司做这个把戏快得多,几乎是瞬间的,而四边形是慢的,因为你必须循环它或向量化它。在

我的函数很复杂,但是为了演示,假设我想把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 

但这只适用于固定的边界。有没有办法做类似的事情

^{pr2}$

我看到的唯一方法是在numpy中重新实现算法本身,并使用它来代替它,这样我就可以有变量边界了。有支持这种功能吗?还有romb,你必须直接提供被积函数的值和dx区间,但这对于我复杂的函数来说太不精确了(marcum Q函数,找不到任何实现,这可能是另一种方法来点它)。在


Tags: the方法函数numpy列表公司scipy数组
1条回答
网友
1楼 · 发布于 2024-09-26 22:50:40

当试图计算一个特殊函数时,最好的方法是编写一个函数,它使用函数的属性在所有参数范围内快速而准确地计算它。单一方法不太可能对所有参数范围给出准确(甚至稳定)的结果。在很多情况下,对积分的直接求值几乎肯定会失败。在

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

  1. 给定一个积分I(t),我假设它是函数f(x)从0到t的积分[这可以推广到任意的下限],把它写成微分方程dI/dt=f(x)。在
  2. scipy.integrate.odeint()对一些初始条件(这里是I(0))在从0到t的某个时间范围内求解这个微分方程。这个范围应该包含所有感兴趣的极限。采样的精细程度取决于函数以及需要对其求值的精确程度。在
  3. 结果将是我们输入的t集合的0到t的积分值。我们可以用插值把它变成一个“连续”函数。例如,使用样条线,我们可以定义i = scipy.interpolate.InterpolatedUnivariateSpline(t,I)。在
  4. 给定数组ba中的一组上限和下限,那么我们可以将它们同时计算为res=i(b)-i(a)。在

这种方法在你的情况下是否有效,需要你在你的参数范围内仔细研究。还要注意Marcum Q函数涉及到一个半无限积分。原则上这不是问题,只要把积分变换成有限范围内的一。例如,考虑转换x->;1/x。不能保证此方法对于您的问题在数值上是稳定的。在

相关问题 更多 >

    热门问题