scipy.integrate から dblquad を使って 2 次元複素積分を繰り返し計算したいです。評価の数が非常に多くなるため、コードの評価速度を上げたいと考えています。
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]
プロファイラーによると、2 つの被積分関数は約 35000 回評価されます。全体の計算には約 1 秒かかりますが、これは私が考えているアプリケーションには長すぎます。
私は Python と Scipy を使用した科学計算の初心者であり、評価速度を改善する方法を指摘するコメントをいただければ幸いです。integrand_real および integrand_complex 関数のコマンドを書き直して、速度を大幅に向上させる方法はありますか?
Cython などのツールを使用してこれらの関数をコンパイルすることは理にかなっていますか? はいの場合: このアプリケーションに最適なツールはどれですか?