如何向量化这个功能?

时间:2014-06-03 19:20:49

标签: python numerical-methods

以下是我在另一个问题上找到的集成例程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))

任何人都可以提供一些帮助吗?

1 个答案:

答案 0 :(得分:0)

您想要进行傅立叶变换。请改用numpy.fftscipy.fft

对于更一般的功能,没有完全好的方法。 np.vectorize只是一个带有for循环的便利功能,所以你不会在这里获得性能提升。

任何积分都可以表示为ODE。然后,您可以将所有独立积分表示为一组ODE并将它们提供给Scipy中的求解器,但这会损害精度,因为求解器使用自适应步骤。当你有几个方程时,步骤的选择对所有方程都是相同的,并且根据一般行为进行估计,而不是“个性化”的单个步骤。

好消息是这个问题令人尴尬地可并行化,这意味着您可以编写为并行映射并使用计算机中的所有核心。这将比任何numpy矢量化提供更好的性能提升。

对于Python中的简单并行化,请使用joblib