Tôi muốn lặp lại phép tính tích phân phức tạp hai chiều bằng cách sử dụng dblquad từ scipy.integrate. Vì số lượng đánh giá sẽ khá cao, tôi muốn tăng tốc độ đánh giá của mã của mình.Scipy: Tăng tốc tính toán tích phân phức hợp 2D
Dblquad dường như không thể xử lý các tích phân phức tạp. Do đó, tôi đã chia phần tích phân phức tạp thành một phần thực và một phần tưởng tượng:
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, và lam là các biến defind. Để đánh giá không thể thiếu trên diện tích hình tròn với bán kính ra tôi sử dụng các lệnh sau:
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]
Theo profiler hai integrands được đánh giá khoảng 35.000 lần. Tổng số tính toán mất khoảng một giây, quá dài đối với ứng dụng tôi có trong đầu.
Tôi là người mới bắt đầu sử dụng máy tính khoa học với Python và Scipy và sẽ hài lòng với các nhận xét chỉ ra cách cải thiện tốc độ đánh giá. Có cách viết lại các lệnh trong các hàm integrand_real và integrand_complex có thể dẫn đến các cải tiến tốc độ đáng ngờ không?
Bạn có nên biên dịch các chức năng đó bằng các công cụ như Cython không? Nếu có: Công cụ nào phù hợp nhất với ứng dụng này?
Chức năng của bạn ngay cả trong x. Chỉ cần thay đổi giới hạn tích hợp thành '(0, ra)' cắt giảm thời gian tính toán hơn một nửa. – Jaime
Nhận xét tuyệt vời Jaime! Tôi chỉ theo dõi và bây giờ là 50% thời gian tính toán ban đầu. Cảm ơn! – Olaf