使用Python模拟和绘制简单线性时间不变系统的阶跃响应与冲击响应

系统的表示

在控制系统和信号处理中,线性时间不变(LTI)系统常通过其传递函数来表示。传递函数是一个描述系统从输入到输出的变换关系的数学模型。对于连续时间系统,传递函数(H(s))定义为系统输出(Y(s))和输入(X(s))的拉普拉斯变换的比值,即 ( H ( s ) = Y ( s ) X ( s ) ) (H(s) = \frac{Y(s)}{X(s)}) (H(s)=X(s)Y(s))。在我们的例子中,我们使用了一个二阶系统的传递函数:
[ H ( s ) = ω n 2 s 2 + 2 ζ ω n s + ω n 2 ] [ H(s) = \frac{\omega_n^2}{s^2 + 2\zeta\omega_ns + \omega_n^2} ] [H(s)=s2+2ζωns+ωn2ωn2]
其中, ( ω n ) (\omega_n) (ωn)是系统的自然频率, ( ζ ) (\zeta) (ζ)是阻尼比。
在这里插入图片描述

阶跃响应

阶跃响应是指系统在单位阶跃输入信号作用下的输出。单位阶跃信号是一个从零突变到一的信号。阶跃响应可以提供系统达到稳态的速度和过程的信息,是分析系统动态特性的重要手段。在上述代码中,step(system)函数计算了系统对单位阶跃信号的响应,这包括了在不同时间点上系统输出的值。

冲击响应

冲击响应(或脉冲响应)是指系统在单位冲击输入信号(狄拉克δ函数)作用下的输出。单位冲击信号可以被视为一个极短时间内的极高幅值信号。冲击响应描述了系统对突然冲击的反应,是系统特性的完整描述,因为根据线性系统理论,冲击响应可以用来计算对任意输入信号的响应。在代码中,impulse(system)函数计算了系统对单位冲击信号的响应。

模拟的原理

  • 拉普拉斯变换:是分析和处理线性时间不变系统的强大工具,能够将微分方程转换为代数方程,简化了系统分析的过程。
  • 传递函数:通过拉普拉斯变换,系统的动态行为可以用传递函数简洁地表示,传递函数描述了系统在频域内的输入输出关系。
  • 阶跃和冲击响应的计算:利用传递函数和拉普拉斯逆变换,可以得到系统对特定输入(如阶跃和冲击)的时间域响应。在实际计算中,通常使用数值方法来求解。

模拟过程

在模拟过程中,首先定义系统的传递函数,然后使用数值方法(如在scipy.signal库中实现的方法)来计算阶跃响应和冲击响应。这些响应随后可以被用来分析系统的动态特性,如稳定性、响应速度和过冲等。

最后,通过绘图工具(如matplotlib),将这些响应可视化,从而提供直观的系统动态行为理解。这种模拟方法是理解和分析线性时间不变系统特性的重要手段。

导入必要的库

import numpy as np
from scipy.signal import lti, step, impulse
import matplotlib.pyplot as plt
  • numpy: 一个用于科学计算的基础库,提供了大量的数学函数工具。在这段代码中,我们实际上没有直接使用到numpy,但在处理更复杂的数学运算时,它通常是必需的。
  • scipy.signal: scipy是一个用于科学和工程计算的库,signal模块包含了信号处理的功能。这里我们从中导入lti(表示线性时间不变系统)、step(用于计算阶跃响应)、impulse(用于计算冲击响应)函数。
  • matplotlib.pyplot: 一个用于绘制图表的库,提供了类似MATLAB的绘图框架。

定义系统参数

wn = 1.0  # 自然频率
zeta = 0.5  # 阻尼比

这里我们定义了系统的两个关键参数:自然频率(wn)和阻尼比(zeta)。这两个参数决定了我们的LTI系统的动态行为。

创建LTI系统

numerator = [wn**2]
denominator = [1, 2*zeta*wn, wn**2]
system = lti(numerator, denominator)
  • 首先,我们根据传递函数[ H(s) = \frac{\omega_n2}{s2 + 2\zeta\omega_ns + \omega_n^2} ]定义了分子(numerator)和分母(denominator)。
  • 使用wnzeta的值,我们构造了传递函数的分子和分母列表。
  • 通过lti函数,我们将分子和分母作为参数传入,创建了表示我们系统的LTI系统对象(system)。

模拟阶跃响应和冲击响应

t1, step_response = step(system)
t2, impulse_response = impulse(system)
  • 使用step函数计算了系统的阶跃响应。step(system)返回两个数组:时间点(t1)和在这些时间点上的阶跃响应值(step_response)。
  • 使用impulse函数计算了系统的冲击响应。同样,impulse(system)返回时间点(t2)和对应的冲击响应值(impulse_response)。

绘制响应图像

python复制代码plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(t1, step_response)
plt.title('Step Response')
plt.xlabel('Time')
plt.ylabel('Amplitude')

plt.subplot(1, 2, 2)
plt.plot(t2, impulse_response)
plt.title('Impulse Response')
plt.xlabel('Time')
plt.ylabel('Amplitude')

plt.tight_layout()
plt.show()
  • plt.figure(figsize=(12, 6)): 创建一个新的图形,设置图形的大小为12x6英寸。
  • plt.subplot(1, 2, 1): 将图形分割成1行2列,并选择第1个子图作为当前绘图区域。
  • plt.plot(t1, step_response): 在当前子图上绘制阶跃响应曲线,横轴为时间(t1),纵轴为阶跃响应值(step_response)。
  • 设置标题、横轴标签和纵轴标签。
  • 通过plt.subplot(1, 2, 2)选择第2个子图,并绘制冲击响应曲线。
  • plt.tight_layout()自动调整子图参数,使之填充整个图表区域。
  • plt.show()显示图形。

这段代码通过定义一个简单的二阶LTI系统,使用scipy.signal模块中的函数计算了该系统的阶跃响应和冲击响应,并使用matplotlib绘制了这些响应的图像,从而直观地展示了系统对这两种基本输入信号的动态反应。

以下是完整代码:

import numpy as np
from scipy.signal import lti, step, impulse
import matplotlib.pyplot as plt

# 定义系统参数
wn = 1.0  # 自然频率
zeta = 0.5  # 阻尼比

# 创建LTI系统
# 传递函数为 H(s) = wn^2 / (s^2 + 2*zeta*wn*s + wn^2)
numerator = [wn**2]
denominator = [1, 2*zeta*wn, wn**2]
system = lti(numerator, denominator)

# 模拟阶跃响应
t1, step_response = step(system)

# 模拟冲击响应
t2, impulse_response = impulse(system)

# 绘制阶跃响应
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(t1, step_response)
plt.title('Step Response')
plt.xlabel('Time')
plt.ylabel('Amplitude')

# 绘制冲击响应
plt.subplot(1, 2, 2)
plt.plot(t2, impulse_response)
plt.title('Impulse Response')
plt.xlabel('Time')
plt.ylabel('Amplitude')

plt.tight_layout()
plt.show()

  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值