Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 极限数组上的scipy.integrate.quad_Python_Arrays_Numpy_Scipy_Integral - Fatal编程技术网

Python 极限数组上的scipy.integrate.quad

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)还

scipy.integrate中的quad需要参数func、a、b。其中func是要积分的函数,a和b分别是积分的下限和上限。a和b必须是数字

在这种情况下,我需要对数十万个不同的a,b计算一个函数的积分,并对结果求和。这需要很长时间来循环。我试着为a和b提供四元数组,希望四元数组能返回相应的数组,但没有成功

下面是一段代码,演示了我正在尝试做的事情,Python循环可以工作,但速度非常慢,而我尝试的矢量化也不起作用。关于如何快速解决这个问题有什么建议吗

编辑:

我需要集成的实际函数(
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()