Python中的快速数值积分

7
我有一个程序需要多次计算定积分,一直在寻找快速解决方法。我需要求解的积分形式如下: \int^{b}_{a(r)}f(x)*g(x-r)dx 我需要为许多不同的r值解决这个积分问题,这会影响到积分上限和积分被积函数(通过函数g)。因此,我没有找到一种向量化的方法,而必须依赖循环。这显著地减慢了问题的解决速度,因为我需要在每个循环中进行函数调用。以下是使用循环解决该问题的一种方法(使用虚构数据和函数):
import numpy as np 

f = lambda x: x**2
g = lambda x: np.log(x)

b=1000
r = np.arange(10,500,10)
a = 1.1*r+r**-1

def loop1(r,a):
    integration_range=[np.linspace(a[i],b,1000) for i in range(len(a))]
    out=np.zeros(len(r))
    i=0
    while i<len(r):
        out[i]=np.trapz(f(integration_range[i])*a_pdf(integration_range[i]-r[i]),integration_range[i])
        i=i+1
    return out  

这需要大约17.7毫秒,这对于我的当前需求来说太慢了。我不太关心积分的精度非常高;只要能给出与真实值相差不超过1%的近似解,我就会很满意。非常感谢您的帮助!


你尝试过scipy吗?他们提供了各种集成技术。 http://docs.scipy.org/doc/scipy/reference/tutorial/integrate.html - jcklie
我有,但是那些方法也太慢了。 - shadowprice
使用Ctypes可以加速程序运行速度,或者尝试使用GPU。 - John Mee
1个回答

4

如果你有很多这样的任务要做,而且f比你的示例更复杂,你可以从记忆化f和可能的g中获得一些好处。

什么是记忆化,我如何在Python中使用它?

基本上,在任何地方,您都可以缓存计算并用内存换取CPU。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接