python阶跃响应卷积

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函数,我也找不到代码中的任何错误,请帮助,任何提示或建议

我想用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)形式。在这一点上有三件事:

  • 这些单位真的没有意义。。。检查一下。Heaviside函数为1,R*It1约为10000。我不确定这是否是一个问题,但以防万一,标准化曲线如下所示:

  • 如果使用b(t)=R*It1-H(t),则可以得到exp(-x)形式。。。代码如下(您可能需要根据需要进行规范化):

  • 情节如下:

  • 你的问题可能仍然没有解决,在这种情况下,你需要解释你认为错误的地方。根据你给我的信息。。。除非把b(t)的方程弄乱,否则b(t)永远不会有Exp[-x]形式。在您的原始代码中,It1在形式上遵循Exp[-x],但b(t)不能
    我想这里有点关于卷积的混乱。我们使用时域卷积来计算线性系统对任意输入的响应。为此,我们需要知道系统的脉冲响应。在连续系统和离散系统之间切换时要小心-参见示例

    为方便起见,我将系统的(连续)脉冲响应(我假设为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()