Python 极限数组上的scipy.integrate.quad
scipy.integrate中的quad需要参数func、a、b。其中func是要积分的函数,a和b分别是积分的下限和上限。a和b必须是数字 在这种情况下,我需要对数十万个不同的a,b计算一个函数的积分,并对结果求和。这需要很长时间来循环。我试着为a和b提供四元数组,希望四元数组能返回相应的数组,但没有成功 下面是一段代码,演示了我正在尝试做的事情,Python循环可以工作,但速度非常慢,而我尝试的矢量化也不起作用。关于如何快速解决这个问题有什么建议吗 编辑: 我需要集成的实际函数(Python 极限数组上的scipy.integrate.quad,python,arrays,numpy,scipy,integral,Python,Arrays,Numpy,Scipy,Integral,scipy.integrate中的quad需要参数func、a、b。其中func是要积分的函数,a和b分别是积分的下限和上限。a和b必须是数字 在这种情况下,我需要对数十万个不同的a,b计算一个函数的积分,并对结果求和。这需要很长时间来循环。我试着为a和b提供四元数组,希望四元数组能返回相应的数组,但没有成功 下面是一段代码,演示了我正在尝试做的事情,Python循环可以工作,但速度非常慢,而我尝试的矢量化也不起作用。关于如何快速解决这个问题有什么建议吗 编辑: 我需要集成的实际函数(rho)还
rho
)还包含两个其他因素rhoo
是一个数组,其长度与a_列表
和b_列表
相同H
是一个标量
def rho(x, rho0, H):
return rho0 * np.exp(- x*x / (2*H*H))
EDIT2:
分析不同的解决方案。'space_sylinder`是积分发生的函数。Warren Weckesser建议,通过一个简单的分析函数传递数组的速度相当于传递数组的速度,比缓慢的Python循环快约500倍(注意程序甚至没有完成的调用数量,它仍然使用了657秒)
exp(-x*x)
的积分是的缩放版本,因此可以使用来计算积分。给定标量a
和b
,函数从a
到b
的积分为0.5*np.sqrt(np.pi)*(erf(b)-erf(a))
erf
是一个,这意味着它处理数组参数。给定a_列表
和b_列表
,您的计算可以写成
total = 0.5*np.sqrt(np.pi)*(erf(b_list) - erf(a_list)).sum()
还可以使用erf
通过适当的缩放比例处理函数rho
:
g = np.sqrt(2)*H
total = g*rho0*0.5*np.sqrt(np.pi)*(erf(b_list/g) - erf(a_list/g)).sum()
在依赖它之前,检查一下你的慢解决方案。对于某些值,减去
erf
函数可能会导致精度显著降低。矢量化有助于对列表执行特定操作。当您启动复杂的自适应数值积分例程而不是特定的操作(例如乘法)时,即使在原则上,矢量化也不会有所帮助。最好的办法是退一步,重新思考计算的最终目的。你想计算二重积分吗?等等,你要找的可能是积分向量值函数。。。检查一下@SaulloCastro,它看起来正是我想要的,但是Warren Weckesser的简单回答适用于我正在使用的特定功能。谢谢。这可能是解决办法。f是我正在积分的函数,但它也包含一些其他因素,为了简单起见,我在解释中省略了这些因素。我现在在问题中增加了具体的功能。我能在您的回答中轻松实现此更改吗?我可以这样加:total=np.sum(rho0*0.5*np.sqrt(np.pi)*(erf(b_列表)-erf(a_列表)),但是因子1/(2*H^2)呢?这太神奇了!这正是我所希望的。
total = 0.5*np.sqrt(np.pi)*(erf(b_list) - erf(a_list)).sum()
g = np.sqrt(2)*H
total = g*rho0*0.5*np.sqrt(np.pi)*(erf(b_list/g) - erf(a_list/g)).sum()