Scipy: Przyspieszenie obliczania całki zespolonej 2D

Chcę wielokrotnie obliczać dwuwymiarową całkę złożoną przy użyciu dblquad z scipy.integrate. Ponieważ liczba ocen będzie dość wysoka, chciałbym zwiększyć szybkość oceny mojego kodu.

Wydaje się, że Dblquad nie radzi sobie ze złożonymi integracjami. Tak więc podzieliłem złożoną integrację na część rzeczywistą i wyimaginowaną:

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 i lam są zmiennymi z góry zindywidualizowanymi. Aby ocenić całkę na obszarze koła o promieniu ra, używam następujących poleceń:

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]

Zgodnie z profilerem dwie integracje są oceniane około 35000 razy. Całkowita kalkulacja trwa około jednej sekundy, co jest zbyt długim okresem dla aplikacji, którą mam na myśli.

Jestem początkującym użytkownikiem obliczeń naukowych z Pythonem i Scipy i byłbym zadowolony z komentarzy, które wskazują sposoby poprawy szybkości oceny. Czy istnieją sposoby przepisywania poleceń w funkcjach integrand_real i integrand_complex, które mogą prowadzić do znacznych ulepszeń prędkości?

Czy warto skompilować te funkcje za pomocą narzędzi takich jak Cython? Jeśli tak: jakie narzędzie najlepiej pasuje do tej aplikacji?

questionAnswers(2)

yourAnswerToTheQuestion