scipy.integrateからdblquadを使用して2次元複素積分を繰り返し計算したいとします。評価の数が非常に多いので、私のコードの評価速度を上げたいと思います。Scipy:2次元複素数積分の計算を高速化する
Dblquadは複雑な被積分関数を扱うことができないようです。したがって、Iは実部と虚部に複雑な積分を分割した:
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予めdefind変数です。私は、次のコマンドを使用半径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のようなツールを使ってこれらの関数をコンパイルするのは意味がありますか?はいの場合:このアプリケーションに最も適したツールはどれですか?
あなたの機能はxでもあります。積分限界を '(0、ra)'に変更するだけで、計算時間が半分以上削減されます。 – Jaime
優秀なコメントハイメ!私はちょうど続いて、今は元の計算時間の50%です。ありがとう! – Olaf