【发布时间】:2018-02-10 00:11:12
【问题描述】:
我有一个卷积积分,它与这篇文章中描述的形式相似:(link)
我需要从负无穷积分到 t,而不是从 0 积分到 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()
【问题讨论】:
标签: python numpy scipy convolution