Scipy: Beschleunigung der Berechnung eines komplexen 2D-Integrals

Ich möchte wiederholt ein zweidimensionales komplexes Integral mit dblquad aus scipy.integrate berechnen. Da die Anzahl der Bewertungen sehr hoch sein wird, möchte ich die Bewertungsgeschwindigkeit meines Codes erhöhen.

Dblquad scheint nicht in der Lage zu sein, komplexe Integranden zu verarbeiten. So habe ich den komplexen Integranden in einen Real- und einen Imaginärteil aufgeteilt:

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 und lam sind Variablen, die im Voraus definiert werden. Um das Integral über die Fläche eines Kreises mit dem Radius ra auszuwerten, verwende ich die folgenden Befehle:

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]

Nach Angaben des Profilers werden die beiden Integranden etwa 35000 Mal ausgewertet. Die Gesamtberechnung dauert ungefähr eine Sekunde, was für die Anwendung, an die ich denke, zu lang ist.

Ich bin ein Anfänger im wissenschaftlichen Rechnen mit Python und Scipy und würde mich über Kommentare freuen, die Möglichkeiten zur Verbesserung der Auswertungsgeschwindigkeit aufzeigen. Gibt es Möglichkeiten, die Befehle in den Funktionen integrand_real und integrand_complex umzuschreiben, was zu deutlichen Geschwindigkeitsverbesserungen führen könnte?

Wäre es sinnvoll, diese Funktionen mit Tools wie Cython zu kompilieren? Wenn ja: Welches Tool passt am besten zu dieser Anwendung?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage