跳转至

第 1 章 线性系统与时域分析

控制与估计的全部讨论都建立在"能描述一个动态系统"之上。本章把线性系统的两套语言——状态空间(state space)与传递函数(transfer function)——以及它们之间的互转讲透,再从极点出发建立"极点位置 ↔ 时域指标"的对照:阻尼比、自然频率如何决定超调与调节时间,稳定性如何用一列判据快速核验,最后落到离散化(zero-order hold、Tustin)与采样周期选择——这是后续所有"回路跑在计算机里"章节的地基。运行环境 python 3.11 + numpy 2.4.6 + scipy 1.17.1 + python-control 0.10.2。

两套语言的互转与极点向下游的两条去处:

flowchart LR
    ss["状态空间 ẋ = Ax + Bu"] <-->|"G(s) = C(sI−A)⁻¹B + D"| tf["传递函数 G(s)"]
    tf --> pole["极点 → ζ、ωn<br/>→ 超调 / 调节时间 / 稳定性"]
    ss -->|"ZOH / Tustin"| dz["离散模型"]
    tf -->|"ZOH / Tustin"| dz
    dz --> sample["采样周期与 dt 卫生"]

1. 状态空间与传递函数

同一动态系统有两种等价写法。传递函数 \(G(s)=Y(s)/U(s)\) 是单输入单输出的外部描述,分母多项式的根即极点;状态空间

\[ \dot x = Ax + Bu,\qquad y = Cx + Du \]

是内部描述,\(A\) 的特征值就是传递函数的极点(无零极点对消时)。互转在 python-control 里是对象级操作:

import numpy as np, control as ct
A = np.array([[0., 1.], [-10., -2.]]); B = np.array([[0.], [1.]])
C = np.array([[1., 0.]]); D = np.array([[0.]])
sys_ss = ct.ss(A, B, C, D)
sys_tf = ct.tf(sys_ss)            # 0.10 起 ss→tf 走对象转换(旧版 ss2tf 路径)
## 极点核对:np.linalg.eigvals(A) 与 np.roots(tf 分母) 最大差 4.4e-16

两视角的分工:分析单回路的频率特性、做经典整定,传递函数最省事;多变量、要接观测器或 LQR(第 6 章「状态反馈与现代控制」),必须回到状态空间。转换的一个数值细节:control 0.10 的 num/den 属性是嵌套列表,且互转会在分子留下 \(4.4\mathrm{e}{-16}\) 级浮点残渣,取系数后应按"小于 \(10^{-12}\) 归零"处理再交给 np.roots。

2. 极点、阻尼比与阶跃响应对照

二阶系统极点 \(p=-\zeta\omega_n\pm j\,\omega_n\sqrt{1-\zeta^2}\) 由阻尼比 \(\zeta\) 与自然频率 \(\omega_n\) 完全决定,时域指标随之确定。取标准形 \(P(s)=\omega_n^2/(s^2+2\zeta\omega_n s+\omega_n^2)\)、\(\omega_n=5,\ \zeta=0.4\),仿真与公式对照:

指标 公式 公式值 仿真值
超调量 \(M_p\) \(e^{-\pi\zeta/\sqrt{1-\zeta^2}}\) 25.38% 25.34%
峰值时刻 \(t_p\) \(\pi/\omega_d\)(\(\omega_d=\omega_n\sqrt{1-\zeta^2}\)) 0.6856 s 0.6978 s
调节时间 \(t_s\) (2%) 包络估计 \(4/(\zeta\omega_n)\) 2.0000 s 1.7095 s
上升时间 \(t_r\) (10–90%) 无简洁闭式 — 0.2939 s
P2 = ct.tf([25.], [1, 2*0.4*5, 25.])
resp = ct.step_response(P2)
t, y = resp.time, resp.outputs      # 0.10 返回响应对象而非 (t, y) 元组

三点读法:超调公式是精确的(包络峰恰好落在 \(t_p\));\(t_p=\pi/\omega_d\) 是近似——第一个真实峰值略晚于包络峰(差 0.012 s);\(t_s=4/(\zeta\omega_n)\) 是保守估计,它按指数包络算"最坏何时进带",实际峰值低于包络时仿真会更早 settle。反过来由测量指标也能读出极点位置:见超调 25% 即知 \(\zeta\approx0.4\),这条"从曲线读参数"的路在第 4 章「频率域与鲁棒性」的辨识中反向使用。

超调量随阻尼比的下降曲线(按 \(e^{-\pi\zeta/\sqrt{1-\zeta^2}}\) 解析式计算,与采样无关):

xychart-beta
    title "二阶系统超调量随阻尼比"
    x-axis "阻尼比 ζ" [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
    y-axis "超调 (%)" 0 --> 80
    line [72.9, 52.7, 37.2, 25.4, 16.3, 9.5, 4.6, 1.5, 0.15, 0.0]

3. 稳定性判据最小集

闭环稳定的充要条件是全部极点落在左半平面。工程上按成本从低到高排三层:

  1. 看系数:特征多项式若有缺项或变号(如 \(s^2-3s+2\)),必不稳定,一行代码都不用写。
  2. Routh–Hurwitz:不解极点、只列表递推,第一列的符号变化数 = 右半平面极点数。三个多项式的对照核验(与 np.roots 逐一一致):
s^4+2s^3+5s^2+2s+1: 第一列=[1, 2, 4, 1.5, 1]    符号变化=0 | RHP 极点=0
s^3+2s^2+5s-2:      第一列=[1, 2, 6, -2]        符号变化=1 | RHP 极点=1
s^2-3s+2:           第一列=[1, -3, 2]           符号变化=2 | RHP 极点=2

两个退化情形要认得:首列出现 0 用 \(\varepsilon\)(下限)替代后继续递推;整行为 0 意味着存在对称于原点的根对(临界稳定),本章不展开。 3. 直接解极点:np.linalg.eigvals(A),数值上最便宜,凡是拿到状态矩阵的场合就用它,Routh 留给"参数进不定式"的符号分析(如求增益稳定范围)。

线性系统的这套判据到离散域换成"极点进单位圆":ZOH 离散化后 \(|p_z|=|e^{p\,dt}|<1\) 与 \(\mathrm{Re}(p)<0\) 等价,稳定性结论不因离散化方法而翻转(前提:见第 4 节采样率不过低)。

4. 离散化:ZOH 与 Tustin

计算机里的控制器是差分方程。连续对象进离散域的标准做法是零阶保持(zero-order hold, ZOH):假设两个采样点之间保持器把输入平 hold,对整段精确积分,离散极点严格等于 \(e^{p\,dt}\)。Tustin(双线性)则用 \(s\approx\frac{2}{dt}\frac{z-1}{z+1}\) 代换,极点映射是近似。对一阶对象 \(G(s)=10/(s+10)\):

dt= 0.001  ZOH 极点=0.990050  e^(-10dt)=0.990050  Tustin 极点=0.990050
dt= 0.010  ZOH 极点=0.904837  e^(-10dt)=0.904837  Tustin 极点=0.904762
dt= 0.050  ZOH 极点=0.606531  e^(-10dt)=0.606531  Tustin 极点=0.600000
dt= 0.100  ZOH 极点=0.367879  e^(-10dt)=0.367879  Tustin 极点=0.333333
gd = ct.c2d(ct.tf([10.], [1, 10.]), 0.01, method='zoh')   # 或 method='tustin'

dt 小于一阶时间常数的 1/10 时两者几乎无差;dt 变大后 Tustin 把极点推得偏快(0.333 vs 0.368)。约定:被控对象用 ZOH(它忠实于"数模转换器保持输出"的物理事实),控制器设计用 Tustin(它把虚轴映射到单位圆、频域特性保持得好,且可逆)。

5. 采样与保持的相位代价

ZOH 不止映射极点,还给回路附加约半个采样周期的纯滞后。在对象带宽 \(\omega_0=10\) rad/s 处对照连续与离散(含保持器)相位:

dt= 0.01s  连续相位=-45.0deg  离散相位=-47.9deg   理论 -45-ωdt/2=-47.9deg
dt= 0.05s  连续相位=-45.0deg  离散相位=-60.5deg   理论 -59.3deg
dt= 0.10s  连续相位=-45.0deg  离散相位=-78.4deg   理论 -73.6deg

相位侵蚀按 \(\omega\,dt/2\) 累积:dt=0.1 s 时单是保持器就在带宽处吃掉 33°,接近"相位裕度 60°"经验值的一半。这是「带宽越高越稳」说法的第一处漏洞(第 4 章「频率域与鲁棒性」展开):采样周期决定了可达成带宽的上限,反馈回路的穿越频率一般要求不超过 \(1/(10\,dt)\sim1/(20\,dt)\)。

6. 常见坑:混叠、dt 不一致、保持滞后

混叠:传感器按 \(f_s\) 采样,高于 \(f_s/2\)(Nyquist 频率)的振动成分会折回低频、且不可事后区分。对折返频率 \(f_{\text{alias}}=|f_{\text{real}}-k f_s|\) 的唯一防御是采集前的模拟低通;"先采样再软件滤波"救不回已混叠的信号。机器人回路里的常见来源:换相电机电流纹波折进电流环反馈、振动折进 IMU 陀螺。

dt 不一致:控制器内部积分用的 dt 与真实运行周期不符,误差随时间累积。最小演示——同一对象、同一开关输入,仅把输入序列整体推迟 0.1 s:

T = np.linspace(0, 0.6, 601)
u    = np.where(T < 0.2, 1.0, 0.0)
u_lag = np.where(T < 0.3, 1.0, 0.0)        # 等效一拍延迟
## t=0.3s: 正常响应=0.3163  滞后一拍响应=0.9502  差 0.6340

在瞬态最陡处,一拍延迟造成的轨迹差达幅值的 63%——"环路里任何一拍延迟都是误差源"的量化图像。工程卫生:控制周期用定时器测量而非名义值(第 3 章「PID 工程」的离散 PID dt 卫生、linux-note 第 7 章「内核、启动与实时调优」的周期抖动测量都在处理这个问题)。

保持滞后即第 5 节的 \(\omega dt/2\),它常被误算进"传输延迟"里重复补偿。

7. 控制周期与观测周期的选择

两类周期服务于不同目的,选择判据不同:

  • 控制周期由对象带宽决定:内环(电流)快于外环(速度)快于位置环,每层带宽相差约一个数量级,具体三环结构在第 2 章「执行器与刚体模型」作为被控对象展开。采样-带宽比按 10–20 倍起步,再对照第 5 节的相位侵蚀核算裕度。
  • 观测周期(状态估计、日志采样)可以慢于控制周期,但必须满足两点:其一,被估计状态的时间常数不能比观测周期小太多,否则两步之间信息已衰减完;其二,观测器增益按实际观测周期整定——估计器与控制器用不同的 dt 时,两边的离散化都要各自做,不能混用连续增益。

原则一句话:周期不是配置里的魔法数字,是频率域预算的时域投影——先定带宽,再定周期,最后核相位代价。

8. 要点

  • 状态空间与传递函数是同一系统的内外描述,极点互通(对照最大差 4.4e-16);control 0.10 的转换接口是 ct.tf(sys_ss),系数有浮点残渣须归零。
  • 二阶指标可背可验:\(\zeta=0.4\) 超调 25.4%、\(t_p\approx\pi/\omega_d\)(近似偏低)、\(t_s\approx4/\zeta\omega_n\)(保守偏大);由曲线反读极点同样成立。
  • 稳定性三层最小集:系数变号必不稳 → Routh 第一列符号变化数 = RHP 极点数(三例与 np.roots 全一致)→ 直接解极点。离散域换成单位圆判据。
  • ZOH 极点是 \(e^{p\,dt}\) 的精确映射,Tustin 在 dt 大时偏快;约定"对象 ZOH、控制器 Tustin"。
  • ZOH 附带 \(\omega dt/2\) 相位侵蚀:dt=0.1 s 在 10 rad/s 处吃掉 33°;控制周期按带宽 10–20 倍起步,一拍延迟在瞬态处可造成 63% 轨迹差。
  • 混叠只能防不能救;dt 不一致与测量周期偏差是"调不好"的常见真凶,对应靶子「调不好是噪声问题」在第 3 章「PID 工程」落锤。

参考文献与延伸阅读

  • Åström, K. J., & Murray, R. M. Feedback Systems: An Introduction for Scientists and Engineers (2nd ed.). Princeton University Press, 2021. 书籍主页
  • python-control. 文档与示例. 文档
  • SciPy. scipy.signal 文档. 文档