【发布时间】:2013-03-25 11:10:50
【问题描述】:
我想使用 scipy.integrate 中的 dblquad 重复计算二维复积分。由于评估的数量会很高,我想提高我的代码的评估速度。
Dblquad 似乎无法处理复杂的被积函数。因此,我将复被积函数拆分为实部和虚部:
def integrand_real(x, y):
R1=sqrt(x**2 + (y-y0)**2 + z**2)
R2=sqrt(x**2 + y**2 + zxp**2)
return real(exp(1j*k*(R1-R2)) * (-1j*z/lam/R2/R1**2) * (1+1j/k/R1))
def integrand_imag(x,y):
R1=sqrt(x**2 + (y-y0)**2 + z**2)
R2=sqrt(x**2 + y**2 + zxp**2)
return imag(exp(1j*k*(R1-R2)) * (-1j*z/lam/R2/R1**2) * (1+1j/k/R1))
y0、z、zxp、k、lam是预先定义的变量。为了评估半径为 ra 的圆的面积上的积分,我使用以下命令:
from __future__ import division
from scipy.integrate import dblquad
from pylab import *
def ymax(x):
return sqrt(ra**2-x**2)
lam = 0.000532
zxp = 5.
z = 4.94
k = 2*pi/lam
ra = 1.0
res_real = dblquad(integrand_real, -ra, ra, lambda x: -ymax(x), lambda x: ymax(x))
res_imag = dblquad(integrand_imag, -ra, ra, lambda x: -ymax(x), lambda x: ymax(x))
res = res_real[0]+ 1j*res_imag[0]
根据分析器,这两个被积函数被评估了大约 35000 次。总计算大约需要一秒钟,这对于我所考虑的应用程序来说太长了。
我是使用 Python 和 Scipy 进行科学计算的初学者,我很高兴 cmets 指出了提高评估速度的方法。是否有方法可以重写 integrand_real 和 integrand_complex 函数中的命令,从而显着提高速度?
使用 Cython 之类的工具编译这些函数是否有意义?如果是:哪种工具最适合此应用程序?
【问题讨论】:
-
你的函数甚至在 x 中。只需将积分限制更改为
(0, ra)即可将计算时间缩短一半以上。 -
优秀的评论杰米!我只是跟着,现在是原始计算时间的 50%。谢谢!
标签: python numpy scipy integration complex-numbers