我需要计算这个函数的积分
def f(z):
return ((1-2*z)*np.exp(-d/z))/(((1-z)**(2+d))*(z**(2-d)))
这里d是一个常数。我正在使用这个功能:
import scipy.integrate as integrate
return integrate.quad(f,0, 5)
但是,我需要为许多不同的 d 值计算这个值。我尝试将所有 d 值放在一个 numpy 数组中,但它没有用。知道如何矢量化吗?
我需要计算这个函数的积分
def f(z):
return ((1-2*z)*np.exp(-d/z))/(((1-z)**(2+d))*(z**(2-d)))
这里d是一个常数。我正在使用这个功能:
import scipy.integrate as integrate
return integrate.quad(f,0, 5)
但是,我需要为许多不同的 d 值计算这个值。我尝试将所有 d 值放在一个 numpy 数组中,但它没有用。知道如何矢量化吗?
该函数integrate.quad
是来自 QUADPACK 的 DQAGSE 函数的 python 包装器。此功能使用自适应正交,即它将在间隔上应用固定规则(在本例中为 Gauss-Kronrod),它将自适应地细化以尝试达到您请求的绝对和/或相对容差。
由于参数d
改变了函数的行为,它也会改变迭代间隔细化。因此,“矢量化”是没有意义的。
您可以做的是使用标准 Python 库中多处理模块中的 Pool 类。将您的值分布d
在多个内核上。将积分包装在一个函数中:
import numpy as np
import scipy.integrate as integrate
from multiprocessing import Pool
def f(z,d):
return ((1-2*z)*np.exp(-d/z))/(((1-z)**(2+d))*(z**(2-d)))
def F_int(d):
return integrate.quad(f,0.0,0.5,args=(d))
if __name__ == '__main__':
d_array = np.array([1, 0.1, 2.0])
pool = Pool(processes=3)
print(pool.map(F_int, d_array))
这个解决方案的唯一限制是它不能在交互模式下工作(所以在 Jupyter 笔记本和 Qtconsole 中都不能)。见这里。