以下是我在另一个问题上找到的集成例程Use scipy.integrate.quad to integrate complex numbers。我很满意它的功能,但我希望能够在我的输入函数上对参数't'的不同值执行集成,并使用向量化来实现。
import numpy as np
from scipy.integrate import quad
def complex_quadrature(func, a, b, t):
def real_func(x,t):
return np.real(func(x,t))
def imag_func(x,t):
return np.imag(func(x,t))
real_integral = quad(real_func, a, b, args=(t))
imag_integral = quad(imag_func, a, b, args=(t))
return (real_integral[0] + 1j*imag_integral[0], real_integral[1:], imag_integral[1:])
vcomplex_quadrature = np.vectorize(complex_quadrature)
t = np.linspace(1,4,4)
print(vcomplex_quadrature(lambda x, t: (np.exp(1j*x*t)), 0, np.pi/2, t))
任何人都可以提供一些帮助吗?
答案 0 :(得分:0)
您想要进行傅立叶变换。请改用numpy.fft
或scipy.fft
。
对于更一般的功能,没有完全好的方法。 np.vectorize
只是一个带有for循环的便利功能,所以你不会在这里获得性能提升。
任何积分都可以表示为ODE。然后,您可以将所有独立积分表示为一组ODE并将它们提供给Scipy中的求解器,但这会损害精度,因为求解器使用自适应步骤。当你有几个方程时,步骤的选择对所有方程都是相同的,并且根据一般行为进行估计,而不是“个性化”的单个步骤。
好消息是这个问题令人尴尬地可并行化,这意味着您可以编写为并行映射并使用计算机中的所有核心。这将比任何numpy矢量化提供更好的性能提升。
对于Python中的简单并行化,请使用joblib