上篇讲了传递函数,把微分方程从时域搬到了s域,分析起来方便多了。这篇我们来看两种最基本的系统——一阶系统和二阶系统——它们的阶跃响应长什么样,有哪些关键指标,为什么搞懂这两个系统就能理解几乎所有的动态特性。
讲真,控制理论里80%的问题都可以归结为"一阶或二阶系统的响应"。你把这两个搞透了,后面遇到高阶系统、复杂系统,无非就是拆解成一阶二阶的组合来分析。
一阶系统:最简单的动态
一阶系统的传递函数长这样:
G(s) = K / (Ts + 1)
K是稳态增益,T是时间常数。就这两个参数,决定了一阶系统的全部行为。
给一阶系统一个阶跃输入,响应是什么样的?输出从0开始,按指数曲线上升,最终趋向K(稳态值)。没有超调、没有振荡,就是平滑地爬上去。
import numpy as np import matplotlib.pyplot as plt # 一阶系统阶跃响应 K = 1.0 # 稳态增益 T = 1.0 # 时间常数 t = np.linspace(0, 5, 500) y = K * (1 - np.exp(-t/T)) # 关键时间点 print(f"t=T时: y = {K*(1-np.exp(-1)):.3f} (稳态值的63.2%)") print(f"t=3T时: y = {K*(1-np.exp(-3)):.3f} (稳态值的95%)") print(f"t=5T时: y = {K*(1-np.exp(-5)):.3f} (稳态值的99.3%)")一阶系统只有两个关键指标:
时间常数T:输出达到稳态值63.2%所需的时间。T越小,系统响应越快。工程上一般认为经过3T到5T,系统就到达稳态了。
稳态增益K:输出最终的稳态值跟输入幅值的比值。K=1说明输出完全跟踪了输入。
一阶系统的典型例子:RC电路(电容充放电)、温度计测量环境温度、一阶低通滤波器。你给温度计一个突然的温度变化,它不会瞬间跳到新温度,而是按指数曲线慢慢逼近——这就是一阶响应。
为什么一阶系统不会超调?直觉上理解:一阶系统没有"惯性"。它的当前变化率只取决于当前状态和输入的差距。越接近目标,变化率越小,所以永远不会冲过头。你可以把它想象成一个永远不会刹不住车的司机——离目的地越近,他开得越慢,到了就刚好停下。
而二阶系统有"惯性"——就像一辆高速行驶的车,即使到了目标位置,速度还没降下来,就会冲过头。这就是为什么二阶系统会有超调和振荡。
二阶系统:控制理论的核心
二阶系统的传递函数:
G(s) = ωn² / (s² + 2ζωn*s + ωn²)
两个关键参数:ωn(自然频率)和ζ(阻尼比)。
跟一阶系统不同,二阶系统的响应要丰富得多。根据阻尼比ζ的不同,二阶系统有四种完全不同的响应模式:
ζ > 1(过阻尼):响应缓慢地爬升到稳态值,没有超调。就像一扇装了强力阻尼器的门,慢慢关上去。
ζ = 1(临界阻尼):最快到达稳态且没有超调。这是工程上最理想的情况——又快又不 overshoot。
0 < ζ < 1(欠阻尼):响应会冲过稳态值,产生超调,然后来回震荡几次才稳定。这是最常见的情况,也是面试考得最多的。
ζ = 0(无阻尼):永远等幅振荡,永远到不了稳态。
import numpy as np # 二阶系统阶跃响应对比 wn = 2.0 # 自然频率 zetas = [0.1, 0.3, 0.707, 1.0, 2.0] # 不同阻尼比 t = np.linspace(0, 10, 1000) for zeta in zetas: if zeta < 1: wd = wn * np.sqrt(1 - zeta**2) # 阻尼振荡频率 y = 1 - np.exp(-zeta*wn*t) * (np.cos(wd*t) + zeta/np.sqrt(1-zeta**2) * np.sin(wd*t)) elif zeta == 1: y = 1 - (1 + wn*t) * np.exp(-wn*t) else: s1 = -zeta*wn + wn*np.sqrt(zeta**2 - 1) s2 = -zeta*wn - wn*np.sqrt(zeta**2 - 1) y = 1 + (s1*np.exp(s2*t) - s2*np.exp(s1*t)) / (s2 - s1) overshoot = np.max(y) - 1.0 if zeta < 1 else 0 print(f"ζ={zeta:.3f}: 超调量={overshoot*100:.1f}%")二阶系统的关键指标
欠阻尼二阶系统(0 < ζ < 1)有几个非常重要的性能指标,面试中几乎必考:
上升时间tr:响应从0第一次到达稳态值的时间。tr ≈ π / (ωn * sqrt(1-ζ²))。自然频率越大、阻尼比越小,上升时间越短。
超调量σ%:响应超过稳态值的最大幅度。σ% = exp(-ζπ / sqrt(1-ζ²)) × 100%。阻尼比越小,超调越大。当ζ=0.707时,超调量约4.3%。
峰值时间tp:响应达到最大超调的时间。tp = π / (ωn * sqrt(1-ζ²))。
调节时间ts:响应进入并保持在稳态值±2%(或±5%)范围内的时间。ts ≈ 4 / (ζωn)(2%准则)。
# 计算二阶系统性能指标 wn = 5.0 # 自然频率 zeta = 0.3 # 阻尼比 # 超调量 overshoot = np.exp(-zeta * np.pi / np.sqrt(1 - zeta**2)) * 100 # 峰值时间 tp = np.pi / (wn * np.sqrt(1 - zeta**2)) # 调节时间 (2%准则) ts = 4 / (zeta * wn) # 上升时间 tr = np.pi / (wn * np.sqrt(1 - zeta**2)) print(f"超调量: {overshoot:.1f}%") print(f"峰值时间: {tp:.3f}s") print(f"调节时间: {ts:.3f}s") print(f"上升时间: {tr:.3f}s")这些公式你不需要全记住,但你必须知道它们之间的关系。比如面试官问"怎么减小超调量",你要知道增大阻尼比ζ就行。"怎么加快响应速度",增大自然频率ωn。"又要快又要超调小怎么办",这就是控制设计的核心矛盾了——后面讲PID调参时会详细聊。
面试实战
面试官问二阶系统,通常这么考:
"阻尼比0.707有什么特殊意义?"这个数叫"最佳阻尼比"。在这个阻尼比下,系统的响应速度和超调量达到了一个比较好的平衡——超调量只有4.3%,调节时间也比较短。工程上设计控制系统时,经常把闭环极点配置在阻尼比0.707附近。
"一阶系统和二阶系统的本质区别是什么?"一阶系统不可能有超调和振荡,因为它的极点只有一个实数极点。二阶系统有两个极点,当极点是共轭复数时(对应欠阻尼),系统才会振荡。振荡的本质是能量在两种形式之间来回转换——比如弹簧势能和动能的交替。
之前面试一家做伺服电机的公司,面试官问"客户说电机响应太慢,你怎么分析?"我说先看电机闭环传递函数的自然频率ωn——ωn太小了响应就慢。可以通过增大控制器增益来提高ωn,但增益太大会降低阻尼比导致超调。所以通常的做法是先增大增益让ωn上去,如果超调太大了再加微分项增大阻尼比。
分享一个我在项目中调试二阶系统响应的经验。当时做机械臂关节的位置控制,闭环系统可以近似为一个二阶系统。一开始调参时把P增益设得很大,ωn上去了响应很快,但超调量到了30%以上——机械臂到位后会"弹"一下再回来,这在精密装配场景是不可接受的。后来我加了D项来增大阻尼比,把阻尼比从0.3调到了0.707,超调量从30%降到了4.3%,同时响应速度只慢了约20%。这个trade-off在面试时候很好用——"我把阻尼比调到0.707,用20%的速度换取了超调量从30%降到4%",面试官一听就知道你调过参。另外,实际系统往往不是理想的二阶系统,高频未建模动态(比如减速器的柔性)会在响应曲线上叠加高频振荡,这时候需要在D项上加低通滤波器来抑制。
下一篇讲稳定性分析——怎么判断一个系统会不会发散。
如果这篇文章对你有帮助,欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。
「机器人软件开发面试·从入门到精通」连载系列
上一篇:第179篇 传递函数——用拉普拉斯变换理解系统特性
下一篇预告:第181篇 稳定性分析——系统会不会"发散"的判定方法
有任何问题欢迎评论区留言,我会尽量回复。