阶跃函数的卷积和指数衰减
Convolution of step function and exponential decay
我正在尝试将以下公式应用于我的数据:
![M(t)=\int_{0}^{t}f(\tau&space;)G(t-\tau)d\tau=\int_{0}^{t}f(\tau&space;)[A\frac{\lambda&space;_{bi}}{\lambda&space;_{bi}-\lambda&space;_{pb}}(e^{-\lambda&space;_{pb}(t-\tau)}-e^{-\lambda&space;_{bi}(t-\tau)})+Be^{-\lambda&space;_{bi}(t-\tau)}]d\tau](https://latex.codecogs.com/gif.latex?%5Cinline%20M%28t%29%3D%5Cint_%7B0%7D%5E%7Bt%7Df%28%5Ctau%20%29G%28t-%5Ctau%29d%5Ctau%3D%5Cint_%7B0%7D%5E%7Bt%7Df%28%5Ctau%20%29%5BA%5Cfrac%7B%5Clambda%20_%7Bbi%7D%7D%7B%5Clambda%20_%7Bbi%7D-%5Clambda%20_%7Bpb%7D%7D%28e%5E%7B-%5Clambda%20_%7Bpb%7D%28t-%5Ctau%29%7D-e%5E%7B-%5Clambda%20_%7Bbi%7D%28t-%5Ctau%29%7D%29+Be%5E%7B-%5Clambda%20_%7Bbi%7D%28t-%5Ctau%29%7D%5Dd%5Ctau)
其中 A = 0.3,B=1,lambda_pb = 0.000431062,lambda_bi = 0.000580525。
对于时间 t,我有:
t=np.array([0, 900, 1800, 2700, 3600, 4500, 5400, 6300, 7200, 8100])
和 f(t):
f=np.array([ 0., 0., 0.00555556, 0., 0., 0., 0., 0., 0., 0.])
对于 G(t):
G=np.array([ 1., 0.69255058, 0.47822256, 0.32940846, 0.22642738, 0.15536312, 0.10643991, 0.07282715, 0.04977304, 0.03398402])
然后我使用以下代码对 G(t) 和 f(t) 进行卷积:
import numpy as np
from numpy import convolve
convolution=np.convolve(f, G)[:len(t)]*(t[1]-t[0])
我得到以下情节:
对于 t < tau,我得到红色曲线。然而,这是不正确的,因为对于 t < tau,G(t-tau)=0(因果关系原理)。因此,我想获得黑色曲线(t=tau 处的垂直增加)。谁能告诉我如何改进我的代码来做到这一点,并且只考虑 t>tau 的响应函数 G(t-tau)?也许使用阶跃函数?
是不是剧情的问题?
我对你的公式一无所知,但卷积结果对我来说看起来不错。但是,对于数据 [0, 0, 0.00555556...],plt.plot
将绘制这样的曲线。 plt.step
可能会解决这个问题
plt.step(t[:3], convolution[:3], where='post', color='r')
plt.plot(t[2:], convolution[2:], color='r')
或者,如果可以的话,重新采样 t 也可以缓解它
def G(t):
term1 = A * lambda_bi / (lambda_bi - lambda_pb)
term2 = np.exp(-lambda_pb * t) - np.exp(-lambda_bi * t)
term3 = B * np.exp(-lambda_bi * t)
return term1 * term2 + term3
t = np.linspace(0, 8100, 811)
f = np.zeros(t.shape)
f[t==1800] = 0.00555556
g = G(t)
conv = np.convolve(f, g)[:len(t)]*(t[1]-t[0])
plt.plot(conv)
我正在尝试将以下公式应用于我的数据:
其中 A = 0.3,B=1,lambda_pb = 0.000431062,lambda_bi = 0.000580525。
对于时间 t,我有:
t=np.array([0, 900, 1800, 2700, 3600, 4500, 5400, 6300, 7200, 8100])
和 f(t):
f=np.array([ 0., 0., 0.00555556, 0., 0., 0., 0., 0., 0., 0.])
对于 G(t):
G=np.array([ 1., 0.69255058, 0.47822256, 0.32940846, 0.22642738, 0.15536312, 0.10643991, 0.07282715, 0.04977304, 0.03398402])
然后我使用以下代码对 G(t) 和 f(t) 进行卷积:
import numpy as np
from numpy import convolve
convolution=np.convolve(f, G)[:len(t)]*(t[1]-t[0])
我得到以下情节:
是不是剧情的问题?
我对你的公式一无所知,但卷积结果对我来说看起来不错。但是,对于数据 [0, 0, 0.00555556...],plt.plot
将绘制这样的曲线。 plt.step
可能会解决这个问题
plt.step(t[:3], convolution[:3], where='post', color='r')
plt.plot(t[2:], convolution[2:], color='r')
或者,如果可以的话,重新采样 t 也可以缓解它
def G(t):
term1 = A * lambda_bi / (lambda_bi - lambda_pb)
term2 = np.exp(-lambda_pb * t) - np.exp(-lambda_bi * t)
term3 = B * np.exp(-lambda_bi * t)
return term1 * term2 + term3
t = np.linspace(0, 8100, 811)
f = np.zeros(t.shape)
f[t==1800] = 0.00555556
g = G(t)
conv = np.convolve(f, g)[:len(t)]*(t[1]-t[0])
plt.plot(conv)