Python numpy.convolve积分限制

时间:2018-02-10 00:11:13

标签: python numpy scipy convolution

我有一个卷积积分,其格式与本文中描述的类似:(link

不是从0到t的积分,而是需要从负无穷大积分到t。但是,我无法使用numpy.convolve执行此操作,因为它总是将结果从负无穷大返回到无穷大。 使用scipy.integrate.quad会非常慢,因为我必须遍历每个t,它只适用于具有分析表达式的集成。

有没有办法指定numpy.convolve的下限和上限?非常感谢你。

这是代码(我为此无法输入LaTeX方程而道歉):

import numpy as np
import matplotlib.pyplot as plt
from scipy import integrate

def gaussian(tau, mu, sigma):

    pdf = 1/(sigma * np.sqrt(2 * np.pi)) * np.exp( - (tau - mu)**2 / (2 * sigma**2))
    return pdf

def gaussian_deriv(tau, mu, sigma):
    """
    derivative of gaussian function
    """
    pdf = -(tau - mu)/sigma**2 * gaussian(tau, mu, sigma)
    return pdf

def integral_kernel(tau):
    return np.cbrt(1/tau)

def integrand(tau, t, mu, sigma):

    return gaussian_deriv(tau, mu, sigma) * integral_kernel(t - tau + 1E-28)

tau = np.linspace(-7, 7, 1000)
dtau = tau[1] - tau[0]
lower_lim = tau[0]
g_deriv = gaussian_deriv(tau, mu=0, sigma=1)

result = np.zeros_like(tau)
for idx, t in np.ndenumerate(tau):
    result[idx], err = integrate.quad(integrand, lower_lim, t, args=(t, mu, sigma), points=[t])

result_convolve = np.convolve(g_deriv, integral_kernel(tau), mode='same') * dtau

fig, ax = plt.subplots(2,1, figsize=(10, 6))
ax[0].plot(tau, result, 'r-', label='scipy quad')
ax[1].plot(tau, result_convolve, '.', label='numpy convolve')
ax[0].legend()
ax[1].legend()
plt.show()

1 个答案:

答案 0 :(得分:0)

如果我理解正确你想要积分

int {-inf ... T} f(tau)g(t-tau)dtau

写H(t)= 1/2(sign(t)+ 1)这与

相同

int {-inf ... inf} f(tau)g(t-tau)[1 - H(tau-T)] dtau

int {-inf ... inf} f ^(tau)g(t-tau)dtau = f ^ * g(t)

f ^(tau)= f(tau)* [1 - H(tau-T)]。

所以你需要做的就是将f右边的t归零以获得f ^然后计算传统的卷积f ^ * g。

<强>更新

如果t和T是相同的数字,它甚至会更简单:

int {-inf ... t} f(tau)g(t-tau)dtau

在这种情况下,您可以将积分变量移动t,因此得到:

int {-inf ... 0} f(tau + t} g(-tau)dtau

接下来用-tau替换tau

int {0 ... inf} g(tau)f(t-tau)dtau

现在你或多或少地按照上面的步骤进行操作,只有T现在是固定的并且等于零,并且你没有将T右边的零点清零,而是T的左边。