![](/img/trans.png)
[英]python numpy.convolve to solve convolution integral with limits from 0 to t instead -t to t
[英]Python numpy.convolve integral limits
我有一个卷积积分,其形式与这篇文章中描述的类似:( 链接)
我需要从负无穷大积分到 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()
如果我正确理解您的要求,您需要积分
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)]。
因此,您要做的就是将T的f右清零以获得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的左边。
同样,这是一篇相当古老的帖子,但我仍然在这里展示我的分析。
请参阅这篇文章,我已经回答了 OP 引用的问题。 有必要通过此帖 go 了解此处使用的符号和符号。
np.convolve(A, B)
给你的是
你要找的是
这里第二项将为零,因为负系数的B
被外推为零。 所以你看你不必做任何事情
.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.