Python双积分花费太长时间来计算

时间:2015-05-12 12:33:30

标签: python integral

我正在尝试使用fresnel integral在坐标网格上计算dblquad。但它花了很长时间,最后它没有给出任何结果。

以下是我的代码。在这段代码中,我只集成了10 x 10网格,但我需要至少集成500 x 500网格。

import time
st = time.time()
import pylab
import scipy.integrate as inte
import numpy as np
print 'imhere 0'
def sinIntegrand(y,x, X , Y):
    a = 0.0001
    R = 2e-3
    z = 10e-3
    Lambda = 0.5e-6
    alpha = 0.01
    k  = np.pi * 2 / Lambda
    return  np.cos(k * (((x-R)**2)*a + (R-(x**2 + y**2)) * np.tan(np.radians(alpha)) + ((x - X)**2 + (y - Y)**2) / (2 * z)))
print 'im here 1'
def cosIntegrand(y,x,X,Y):
    a = 0.0001
    R = 2e-3
    z = 10e-3
    Lambda = 0.5e-6
    alpha = 0.01
    k  = np.pi * 2 / Lambda
    return  np.sin(k * (((x-R)**2)*a + (R-(x**2 + y**2)) * np.tan(np.radians(alpha)) + ((x - X)**2 + (y - Y)**2) / (2 * z)))
def y1(x,R = 2e-3):
    return (R**2 - x**2)**0.5
def y2(x, R = 2e-3):
   return -1*(R**2 - x**2)**0.5
points = np.linspace(-1e-3,1e-3,10)
points2 = np.linspace(1e-3,-1e-3,10)
yv,xv = np.meshgrid(points , points2)
#def integrate_on_grid(func, lo, hi,y1,y2):
#    """Returns a callable that can be evaluated on a grid."""
#    return np.vectorize(lambda n,m: dblquad(func, lo, hi,y1,y2,(n,m))[0])
#
#intensity = abs(integrate_on_grid(sinIntegrand,-1e-3 ,1e-3,y1, y2)(yv,xv))**2 + abs(integrate_on_grid(cosIntegrand,-1e-3 ,1e-3,y1, y2)(yv,xv))**2
Intensity = []
print 'im here2'
for i in points:
    row = []
    for j in points2:
        print 'im here'
        intensity = abs(inte.dblquad(sinIntegrand,-1e-3 ,1e-3,y1, y2,(i,j))[0])**2 + abs(inte.dblquad(cosIntegrand,-1e-3 ,1e-3,y1, y2,(i,j))[0])**2
        row.append(intensity)
    Intensity.append(row)
Intensity = np.asarray(Intensity)
pylab.imshow(Intensity,cmap = 'gray')
pylab.show()
print str(time.time() - st)

如果你能说出更好的方法,我真的很感激。

1 个答案:

答案 0 :(得分:0)

使用scipy.integrate.dblquad计算图像的每个像素在任何情况下都会变慢。

您应该尝试重写数学问题,以便在scipy.special中使用某些经典函数。例如,scipy.special.fresnel可能有效,虽然它是1D而你的问题似乎是2D。否则,菲涅耳积分和不完整的Gamma函数(scipy.special.gammainc)之间存在relationship,如果有帮助的话。

如果这些都不起作用,作为最后的手段,您可以花时间优化代码并使其适应Cython。这可能会使速度提高10到100倍(见answer)。虽然这不足以从网格10x10转到网格500x500