python阶跃响应卷积
我想用numpy.convolution计算这个积分$\frac{1}{L}\int{-\infty}{t}H(t^{})\exp(-\frac{R}{L}(t-t^{}))dt^{}$,其中$H(t)$是重边函数。我应该得到它等于$\exp(-\frac{R}{L}t)H(t)$ 下面是我所做的, 我通过改变变量乘以不同的H(t)将积分的限制改为-inf到+inf,然后我用这个函数与H(t)(积分中的一个)进行卷积,但输出图肯定不是exp函数,我也找不到代码中的任何错误,请帮助,任何提示或建议将不胜感激python阶跃响应卷积,python,numpy,convolution,Python,Numpy,Convolution,我想用numpy.convolution计算这个积分$\frac{1}{L}\int{-\infty}{t}H(t^{})\exp(-\frac{R}{L}(t-t^{}))dt^{}$,其中$H(t)$是重边函数。我应该得到它等于$\exp(-\frac{R}{L}t)H(t)$ 下面是我所做的, 我通过改变变量乘以不同的H(t)将积分的限制改为-inf到+inf,然后我用这个函数与H(t)(积分中的一个)进行卷积,但输出图肯定不是exp函数,我也找不到代码中的任何错误,请帮助,任何提示或建议
import numpy as np
import matplotlib.pyplot as plt
R = 1e3
L = 3.
delta = 1
Nf = 100
Nw = 200
k = np.arange(0,Nw,delta)
dt = 0.1e-3
tk = k*dt
Ng = Nf + Nw -2
n = np.arange(0,Nf+Nw-1,delta)
tn = n*dt
#define H
def H(n):
H = np.ones(n)
H[0] = 0.5
return H
#build ftns that get convoluted
f = H(Nf)
w = np.exp((-R/L)*tk)*H(Nw)
#return the value of I
It = np.convolve(w,f)/L
#return the value of Voutput, b(t)
b = H(Ng+1) - R*It
plt.plot(tn,b,'o')
plt.show()
代码的问题与其说是编程问题,不如说是概念问题。将卷积重写为整数[HeavisideTheta[t-t']*Exp[-R/L*t'],-Inf,t](这是Mathematica代码),检查后,您会发现H(t-t')在限值内总是1(除了at t'=t,这是积分限值…但这并不重要)。所以实际上你并不是在做一个完整的卷积。。。你基本上只需要卷积的一半(或三分之一) 如果你认为一个卷积是反转一个序列,然后一次移动一个移位,然后把它加起来(见-卷积的视觉解释),那么你想要的是中间的一半。。。i、 只有当它们重叠时。您不希望引入(第4个图形向下:)。你真的想要领先 现在,修复代码的最简单方法如下:
#build ftns that get convoluted
f = H(Nf)
w = np.exp((-R/L)*tk)*H(Nw)
#return the value of I
It = np.convolve(w,f)/L
max_ind = np.argmax(It)
print max_ind
It1 = It[max_ind:]
引入是卷积积分(在我们的例子中技术上是和)增加的唯一时间。。。因此,在导入完成后,卷积积分遵循Exp[-x]。。。因此,您告诉python仅在达到最大值后才获取值
#返回Voutput的值,b(t)
现在可以完美地工作了
注意:由于您需要引出,因此不能使用np.convalve(a,b,mode='valid')
所以它看起来像:
b(t)使用It1看起来像:
你不可能得到exp(-x)作为一般形式,因为b(t)的方程由1-R*exp(-x)给出。。。它不能在数学上遵循exp(-x)形式。在这一点上有三件事:
我想这里有点关于卷积的混乱。我们使用时域卷积来计算线性系统对任意输入的响应。为此,我们需要知道系统的脉冲响应。在连续系统和离散系统之间切换时要小心-参见示例 为方便起见,我将系统的(连续)脉冲响应(我假设为L-R电路的电阻电压)定义为时间的函数
t
:IR=lambda t:(R/L)*np.exp(-(R/L)*t)*H
我还假设您的输入是Heaviside步长函数,我在时间间隔[0,1]上定义了该函数,时间步长为0.001秒
当我们卷积(离散)时,我们有效地翻转一个函数,并沿着另一个函数滑动,乘以相应的值,然后求和。要将连续脉冲响应与阶跃函数结合使用,阶跃函数实际上由一系列狄拉克δ函数组成,我们需要将连续脉冲响应乘以时间步长dt
,如上面关于脉冲不变性的维基百科链接所述。注意-设置H[0]=0.5也很重要
我们可以在下面想象这个操作。任何给定的红色标记表示给定时间t
的响应,是绿色输入和向右移动t
的翻转脉冲响应的“和积”。我试着用一些灰色的冲动反应来说明这一点。
进行计算的代码在这里
import numpy as np
import matplotlib.pyplot as plt
R = 1e3 # Resistance
L = 3. #Inductance
dt = 0.001 # Millisecond timestep
# Define interval 1 second long, interval dt
t = np.arange(0, 1, dt)
# Define step function
H = np.ones_like(t)
H[0] = 0.5 # Correction for impulse invariance (cf http://en.wikipedia.org/wiki/Impulse_invariance)
# RL circuit - resistor voltage impulse response (cf http://en.wikipedia.org/wiki/RL_circuit)
IR = lambda t: (R/L)*np.exp(-(R/L)*t) * H # Don't really need to multiply by H as w is zero for t < 0
# Response of resistor voltage
response = np.convolve(H, IR(t)*dt, 'full')
将numpy导入为np
将matplotlib.pyplot作为plt导入
R=1e3#电阻
L=3#电感
dt=0.001#毫秒时间步长
#定义间隔1秒长,间隔dt
t=np.arange(0,1,dt)
#定义阶跃函数
H=np.类(t)
H[0]=0.5#脉冲不变性校正(cfhttp://en.wikipedia.org/wiki/Impulse_invariance)
#RL电路-电阻器电压脉冲响应(cfhttp://en.wikipedia.org/wiki/RL_circuit)
IR=lambda t:(R/L)*np.exp(-(R/L)*t)*H#实际上不需要乘以H,因为t<0时w为零
#电阻电压响应
响应=np.卷积(H,IR(t)*dt,‘满’)
绘制图的额外代码如下所示:
# Define new, longer, time array for plotting response - must be same length as response, with step dt
tp = np.arange(len(response))* dt
plt.plot(0-t, IR(t), '-', label='Impulse response (flipped)')
for q in np.arange(0.01, 0.1, 0.01):
plt.plot(q-t, IR(t), 'o-', markersize=3, color=str(10*q))
t = np.arange(-1, 1, dt)
H = np.ones_like(t)
H[t<0] = 0.
plt.plot(t, H, 's', label='Unit step function')
plt.plot(tp, response, '-o', label='Response')
plt.tight_layout()
plt.grid()
plt.xlabel('Time (s)')
plt.ylabel('Voltage (V)')
plt.legend()
plt.show()
#定义用于绘制响应的新的、更长的时间数组-必须与响应的长度相同,带有步长dt
tp=np.arange(len(response))*dt
plt.绘图(0-t,IR(t),“-”,标签=‘脉冲响应(翻转)’)
对于np.arange中的q(0.01,0.1,0.01):
plt.绘图(q-t,IR(t),‘o-’,markersize=3,color=str(10*q))
t=np.arange(-1,1,dt)
H=np.类(t)
乳胶没有出现,我无法添加图片我假设你正在尝试确定RL电路对阶跃输入的电阻电压响应?如果你原谅双关语,你的代码看起来有点…复杂。哦,我试着只取前半部分,然后它就工作了(我把它乘以dt,这是我应该做的,因为np.convalve假设delta t=1,这就解决了单位问题)。但是,我不知道为什么我们只取上半部分就行了(Python表明这可能有
# Define new, longer, time array for plotting response - must be same length as response, with step dt
tp = np.arange(len(response))* dt
plt.plot(0-t, IR(t), '-', label='Impulse response (flipped)')
for q in np.arange(0.01, 0.1, 0.01):
plt.plot(q-t, IR(t), 'o-', markersize=3, color=str(10*q))
t = np.arange(-1, 1, dt)
H = np.ones_like(t)
H[t<0] = 0.
plt.plot(t, H, 's', label='Unit step function')
plt.plot(tp, response, '-o', label='Response')
plt.tight_layout()
plt.grid()
plt.xlabel('Time (s)')
plt.ylabel('Voltage (V)')
plt.legend()
plt.show()