我使用scipy.integrate.quad(f, a, b, args=(c,))在a和b之间集成函数f,添加了另一个参数c。您可以将f理解为
f = lambda x, y: x*y 据我所知,该函数要求a、b、c为浮点值。但是,我有许多积分要解,所有积分都使用相同的函数,就在a、b和c的向量上。迭代所有的向量是非常低效的。有什么方法可以加速/向量化这个操作吗?
发布于 2015-09-14 04:35:47
遗憾的是,integrate.quad不支持这一点。
您可能会发现自己使用高斯求积会更好一些:scipy.integra.fixed_quad会阻塞array_like输入,但计算根和权重的低级例程应该可以工作。请参阅“正交多项式的根和权”部分here。不过是YMMV。
发布于 2020-03-02 00:10:51
与此同时,numpy通过使用integrate中介绍的一个示例实现了numpy.vectorize,对此做出了回应。以下是包含两个变量的修改后的示例:
fun2int = lambda x, a: np.sqrt(x+a)
intfun = lambda a: integrate.quad(fun2int, 0, 4, args=(a))[0]
vec_int = np.vectorize(intfun)
vec_int(np.linspace(0,2,5))
Out[1]: array([5.33333333, 6.12825877, 6.78689326, 7.37435069, 7.91234089])还有1.4.1的integrate.quad_vec (scipy.version ),但我没有测试它。
发布于 2015-09-12 21:26:19
如果我很好地理解了这个问题,我将只对一个a,b,c参数数组运行函数。例如,将包含两组a,b,c的数组设置为:
a = np.array([[0.1,0.2,0.3], [0.9,0.8,0.3]])然后设置一个空列表来存储结果:
L = []并在数组中循环:
for a,b,c in a:
b = integrate.quad(f, a, b, args=(c,))
L.append(b)结果是一个元组列表:
[(0.004500000000000001, 4.996003610813206e-17), (-0.025499999999999995, 2.8310687127941485e-16)]也许有一种更优雅的方式,但希望这会有所帮助。
https://stackoverflow.com/questions/32539106
复制相似问题