☰
自动控制原理13期笔记:从极点稳定性到PID与根轨迹
2026/11/3 23:12:50 网站建设 项目流程

简介:这份笔记整理自B站硬核博主Dr.CAN的【自动控制原理】专题,共13期内容,面向自动控制理论零基础或基础不牢的工科学生、考研与研一研二学习者,用于补齐传递函数、稳定性分析等入门环节的短板。全套以1个PDF文件交付,压缩包约12.27MB,采用QQ截屏配合GoodNotes手写记录,页内保留了板书推导、公式与关键结论,适合当作视频配套提纲随看随记。笔记覆盖开环与闭环系统、反馈控制、传递函数及其极点与稳定性的关系、根轨迹绘制与分离点大汇合点、终值定理与稳态误差、比例积分控制器等主干知识,并以平衡车、弹簧阻尼系统等实例辅助理解抽象概念。已有851人学习下载,可作为后续卡尔曼滤波、MPC与最优控制的前置铺垫,也便于快速回顾术语与图形化分析方法。

1. 知识地图:三个问题把 13 期串成一条线

自动控制原理看起来章节零散,这套 13 期全的课程笔记梳理下来,其实一直在回答三个问题:系统稳不稳,稳下来之后误差有多大,以及为了前两条该在哪个位置加什么控制器。有点反直觉的是,这三问共用同一把判断依据,也就是传递函数的极点位置。闭环、反馈、根轨迹、稳态误差、比例积分控制,动作全都落在“把极点往左半平面挪”这一件事上。整体路线是:先建立开环与闭环的模型,把微分方程写成传递函数,再用极点位置判断稳定性,接着用终值定理计算稳态误差,然后靠控制器补上误差,最后用根轨迹看参数变动会把极点带到哪里。刚接触控制、需要先建地图的人适合从头顺一遍;学过但只剩零散公式、考前想按模块重排的人,更适合把它当索引来查漏。

2. 开环闭环与传递函数:反馈是怎么把误差变成纠正动作的

2.1 信息有没有走回头路:开环与闭环的分界

开环系统的结构很直白:控制器发出指令,执行器动作,被控对象响应,整个链条里输出不参与决策。定时加热就是典型例子,设定好加热时长后就不再干预,至于中间漏水、结垢、环境温度变化,系统一概不知,最终温度偏离多少只能事后承担。它的优点是结构简单、成本低、不会因为反馈引入新的振荡;缺点是对参数漂移和外部扰动几乎没有抵抗力,精度完全取决于标定准不准。

闭环系统多了一条从输出回到输入的路径:传感器测出实际输出,与期望值相减得到误差,控制器根据误差的大小和方向去修正指令。这条路径一旦建立,系统就具备了自我纠偏的能力。梳理下来会发现,反馈并没有改变被控对象本身,它改变的是整个闭环系统的极点分布,也就是把“系统性格”重新塑造了一遍。代价是稳定性风险随之而来,参数配得不合适,原本老实的开环对象会在闭环里振荡起来。

对比项开环系统闭环系统
结构单向传递,无反馈通路有反馈通路,输出影响输入
抗扰动弱,扰动直接体现在输出上强,扰动被反馈回路部分抑制
精度依赖元器件精度与标定由误差检测与控制器增益决定
稳定性一般不会自激增益过大或相位滞后会导致振荡
设计难点选型与标定稳定性与动态性能的折中

提示:判断一个系统是开环还是闭环,只看输出有没有被测量并送回比较环节,不看它有没有传感器。只显示不参与控制的测量,仍然属于开环。

2.2 反馈控制的三件套:期望、误差、控制器

单位负反馈的结构里只有三个关键量:期望输入 r(t)、实际输出 c(t)、以及两者之差 e(t)=r(t)−c(t)。误差进入控制器 G_c(s),控制器输出推动被控对象 G_p(s),对象输出再被反馈环节 H(s) 采集回去。前向通道记为 G(s)=G_c(s)G_p(s),闭环传递函数写出来是

Φ(s) = G(s) / (1 + G(s)H(s))

分母等于零的那个方程 1+G(s)H(s)=0 就是闭环特征方程,它的根才是闭环极点。这是整套理论里最容易被跳过的一步:很多人习惯直接拿开环传递函数的分母去看稳定性,那是开环极点,和闭环能不能稳没有必然关系。

负反馈的意义可以用一个物理场景体会。把一个单摆推到某个平衡位置,松手之后如果没有外力介入,它离开原位就再也回不到那个点,这属于开环意义的“放置”;而平衡车之所以能立住,是因为它每一瞬间都在测量倾角、计算偏差、输出力矩,偏差一小就立刻反向修正。反馈控制提供的正是这种“持续纠偏”的能力,误差越大纠正力度越大,误差趋零则动作趋缓。

2.3 传递函数:把微分方程压成一个分式

传递函数的定义是零初始条件下,输出量的拉普拉斯变换与输入量的拉普拉斯变换之比,记作 G(s)=C(s)/R(s)。它只对线性定常系统成立,非线性环节、时变参数、非零初始条件都会让这个比值失去意义。之所以值得花大力气,是因为它把时域的微分方程变成了 s 域的代数方程,串联直接相乘、并联直接相加、反馈用 Φ=G/(1+GH) 一步到位,微积分难题退化成了多项式运算。

几个常用的拉氏变换对需要背到条件反射:单位冲激 δ(t) 对应 1,单位阶跃对应 1/s,e^{−at} 对应 1/(s+a),sin(ωt) 对应 ω/(s²+ω²)。冲激函数在时域上宽度趋于零、面积为一,变换结果恰好是 1,这个结论在后面判断系统固有模态时会反复用到。

分子多项式的根叫零点,分母多项式的根叫极点。分母阶次 n 大于分子阶次 m 时称为严格真分式,实际的物理系统基本都是这种形式,因为能量传递有惯性,输出不可能对输入瞬时应答。下面这段代码把零极点直接算出来,顺便给出稳定性初判。

import numpy as np # G(s) = (s + 3) / (s^2 + 3s + 2),分子分母系数均按 s 的降幂排列 num = np.array([1.0, 3.0]) # s + 3 den = np.array([1.0, 3.0, 2.0]) # s^2 + 3s + 2 zeros = np.roots(num) # 零点:[-3.] poles = np.roots(den) # 极点:[-1. -2.] print("零点:", zeros) print("极点:", poles) print("n=%d, m=%d" % (len(den) - 1, len(num) - 1)) # n=2, m=1,严格真分式 # 极点实部全为负,说明该传递函数对应的系统稳定 print("稳定" if np.all(poles.real < 0) else "存在右半平面极点")

np.roots接收的是降幂系数数组,缺项必须补零,比如 s³+2s 要写成 [1, 0, 2, 0],漏掉零系数是手算和写代码时都很常见的失误。拷贝这份代码时,先确认分母是展开后的多项式,而不是因式连乘的形式,否则系数对不上,算出来的极点全是错的。

3. 稳定性判定:极点、劳斯判据与终值定理的适用边界

3.1 极点为什么决定稳定性:从 e^{st} 说起

线性定常系统的响应可以拆成若干模态的叠加,每个模态形如 A·e^{p·t},其中 p 就是某个极点。把极点写成复数形式 p=σ+jω,那么 e^{pt}=e^{σt}·e^{jωt},前一项是包络,后一项是旋转。包络的走向完全由实部 σ 的符号决定:σ<0 时随时间衰减,σ>0 时随时间发散,σ=0 时包络恒定、只剩等幅振荡。一对共轭复极点则合成 e^{σt}·sin(ωt+φ),实部管衰减快慢,虚部管振荡频率。

所以“系统稳定”这件事可以翻译成一句很朴素的话:所有极点都落在复平面的左半边。以 G(s)=1/(s+1) 为例,极点 s=−1,阶跃响应是 1−e^{−t},误差项随时间衰减到零,系统最终停在目标值附近;把极点换成 s=+1,响应变成 1−e^{t},输出一路发散,无论控制器怎么调都拉不回来。极点越靠左,衰减越快,这也是后面调参时“把极点往左推”的由来。

3.2 三种极点位置的对照:稳定、临界与发散

同样是“极点不在右半平面”,落在虚轴上和落在左半平面完全是两回事。虚轴上的单极点对应等幅振荡或恒值输出,系统不会发散但也回不到目标,工程上称为临界稳定;如果虚轴上出现重极点,时域里会多出 t 这样的因子,振幅随时间线性增长,仍然算不稳定。整理成表之后,判据就一目了然。

极点位置时域响应形态判定典型来源
左半平面实极点单调衰减,无振荡稳定一阶惯性环节 1/(Ts+1)
左半平面共轭复极点衰减振荡稳定欠阻尼二阶系统
虚轴上单极点等幅振荡或恒值临界稳定无阻尼系统、纯积分环节
虚轴上重极点振幅随时间增长不稳定双重积分、参数恰好卡在边界
右半平面任一极点单调或振荡发散不稳定正反馈、增益过大

注意:临界稳定在数学上还有界,在工程上通常按不可用处理。参数有漂移、元件有容差,卡在虚轴上的系统稍有扰动就会滑向发散,设计时一般要求留出足够的稳定裕度。

3.3 劳斯判据与虚轴交点:不解高次方程也能定 K 的范围

三阶以上多项式硬求根很痛苦,劳斯判据提供了纯代数路线。以特征方程 s³+3s²+2s+K=0 为例,列出劳斯表:

行第 1 列第 2 列
s³12
s²3K
s¹(6−K)/30
s⁰K

判据是劳斯表第一列符号变化的次数等于右半平面极点的个数,因此稳定的充要条件是第一列全部同号。这里要求 K>0 且 6−K>0,得到 0<K<6。K=6 是临界点,此时 s¹ 行整行为零,用上一行的系数构造辅助方程 3s²+6=0,解出 s=±j√2,这正是根轨迹穿过虚轴的位置。辅助方程这一步在实际做题里分值不低,很多人只写了个 K 的范围就收笔,把交点漏掉了。

使用前还要记住一个必要条件:特征多项式所有系数同号且不缺项。它只是必要条件,满足它不代表稳定,但不满足它一定不稳定,先拿这一条筛一遍能省不少时间。首列出现零而该行不全为零时,用一个小正数 ε 替代零继续列,最后令 ε→0 判断符号。

import numpy as np def check_stable(coeffs, tol=1e-9): """coeffs 为特征多项式系数,按 s 降幂排列""" r = np.roots(coeffs) return np.all(r.real < -tol), r # 特征方程 s^3 + 3s^2 + 2s + K = 0,逐个 K 观察最右极点的位置 for K in [1, 3, 5, 6, 7, 10]: ok, r = check_stable([1, 3, 2, K]) print(f"K={K:>2} 稳定={ok} 最右极点实部={r.real.max():+.3f}")

这里的tol是给数值误差留的余量。K=6 时理论上一对极点正好落在虚轴上,浮点运算可能给出 +1e−16 或 −1e−16,判断结果会来回跳,这属于计算机的数值抖动,不是理论问题。碰到临界值,改用劳斯表或辅助方程手工核对更可靠,不要拿代码输出的真假当结论。

3.4 终值定理与系统型别:稳态误差怎么算

终值定理的表达式是 lim(t→∞) f(t) = lim(s→0) sF(s),用它可以不算反变换就拿到稳态值。但它有明确的适用前提:sF(s) 的所有极点必须位于左半平面,也就是系统本身稳定。这个条件最容易被当成套话跳过,代价是得出一个看似合理、实则毫无意义的数字。

反例很有说服力。无阻尼系统的 F(s)=ω/(s²+ω²),乘上 s 之后是 ωs/(s²+ω²),令 s→0 得到极限为零,按公式“稳态值为零”。可实际响应是等幅振荡,根本没有稳态可言,输出不会收敛到零附近。矛盾就出在前提上:极点在虚轴上,终值定理不成立。所以正确的顺序永远是先用劳斯判据或极点检查确认稳定,再动终值定理。

稳态误差的算法类似。单位负反馈下 E(s)=R(s)/(1+G(s)),误差终值 ess=lim(s→0) sE(s)。把开环传递函数写成 G(s)=K·(…)/[s^ν·(…)],ν 就是系统型别,也就是积分环节的个数。型别决定了系统能无差跟踪哪一类输入:

系统型别阶跃输入 1/s斜坡输入 1/s²抛物线输入 1/s³
0 型1/(1+K_p),有差∞∞
I 型0,无差1/K_v,有差∞
II 型0,无差0,无差1/K_a,有差
import sympy as sp s = sp.symbols('s') K = 10 G = K / (s * (s + 2)) # I 型系统:分母含一个 s,型别 ν=1 # 阶跃输入下的误差终值 E_step = (1 / s) / (1 + G) print(sp.limit(s * E_step, s, 0)) # 0,I 型对阶跃无差 # 斜坡输入下的误差终值 E_ramp = (1 / s**2) / (1 + G) print(sp.limit(s * E_ramp, s, 0)) # 1/K_v,K_v = lim s*G = 5,结果 0.2

sympy.limit模拟的是 s→0 的极限过程,写代码时要把 E(s) 整体先乘上 s 再取极限,顺序颠倒会算错。静态速度误差系数 K_v=lim(s→0) s·G(s),本例中等于 10/2=5,斜坡输入的稳态误差就是 0.2。放在场景里理解:型别是系统的“跟踪能力等级”,每加一个积分环节升一级,代价下一章再说。

4. 控制器与根轨迹:P、I、PID 和参数把极点挪到哪

4.1 比例控制:误差放大,振荡也放大

纯比例控制器的传递函数就是一个常数 K_p,输出等于增益乘以误差。它的优点是响应快、结构简单、没有相位滞后;缺点也很直接,对于 0 型系统,稳态误差等于 1/(1+K_p),无论 K_p 取多大都只能无限逼近零而不能等于零。把 K_p 继续加大,超调量随之上升,振荡次数增加,最后可能把闭环极点推进右半平面。

这里有个常见误解:以为比例增益越大,跟踪越准。实际情形是增益和稳定裕度在互相拉扯,加大增益换来的是更快的响应和更小的静差,付出去的是相位裕度。对于一阶对象 K/(Ts+1),比例控制下的闭环极点位于 −(1+K_pK)/T,确实随着 K_p 增大而左移,看起来很美;但对象一旦有二阶以上的惯性或延迟,极点会先靠近虚轴再越过,稳定性是有边界的。

4.2 积分控制:一阶变二阶,稳态误差消失的代价

积分环节 1/s 的作用是把误差累加起来。它的贡献在于把开环系统型别提高一级:原本对阶跃输入有差的 0 型系统,串入积分后变成 I 型,阶跃稳态误差归零。这就是“积分消除静差”的完整来历,前提是闭环仍然稳定。

代价有两个层面。其一是相位,积分环节在 s 域引入一个位于原点的极点,频率特性上固定贡献 −90° 的相位滞后,稳定裕度被直接削掉一块。其二是阶次,一阶对象 1/(Ts+1) 串上 K_i/s 之后,开环变成二阶,闭环特征方程升到二阶,响应从单调衰减变成可能出现超调的振荡过程。原来一个舒服的一阶系统,加了积分之后要重新整定增益,这就是“反应变慢、还可能振起来”的原因。

提示:加积分之前先把当前闭环的劳斯表或极点算一遍,加完之后再算一遍,对比 K 的可取区间有没有变窄。这一步花不了几分钟,能避免反复试凑。

4.3 PID 三项分工与调整顺序

三项各自解决不同问题:比例负责速度,积分负责精度,微分负责平稳。微分环节 s 提供超前相位,相当于给系统加阻尼,能压低超调和缩短调节时间,但它对高频噪声极其敏感,实测信号里的毛刺会被放大成执行器的剧烈动作,工程上通常串一个惯性环节 K_d·s/(T_d·s+1) 来限制高频增益。

环节传递函数主要作用副作用大致调整顺序
比例 PK_p加快响应,减小静差过大导致超调、振荡先调,把响应调到略有余量
积分 IK_i/s提高型别,消除阶跃静差相位滞后 90°,易振荡后调,从很小的值开始加
微分 DK_d·s 或带惯性形式增加阻尼,抑制超调放大噪声,对采样敏感最后加,噪声大时慎用

调整顺序的道理在于三者互相耦合:先把比例调到响应速度可接受,再加入积分把静差压掉,最后用微分压超调。习惯上所谓的“先 P 后 I 再 D”并不是口诀,而是让每一步只改变一个变量,出问题能定位到具体环节。

4.4 根轨迹:起点终点、实轴段与分离点

根轨迹研究的是闭环极点随某个参数(通常是开环增益 K)从 0 到 ∞ 变化时在复平面上的移动路径,出发点仍然是特征方程 1+K·G(s)H(s)=0。作图规则背起来像清单,理解之后其实都在描述同一件事——极点从哪里出发、往哪里去、中间怎么走。

以 G(s)=K/[s(s+1)(s+2)] 为例,作图步骤可以拆成几条:

  1. 起点与终点。K=0 时闭环极点等于开环极点,三条分支分别从 0、−1、−2 出发;K→∞ 时极点趋向开环零点,本例没有零点,三条分支全部奔向无穷远。
  2. 分支数与对称性。分支数等于开环极点数 n(n≥m 时),全部关于实轴对称,因为特征多项式是实系数。
  3. 实轴上的根轨迹段。实轴上某点右侧的实数开环零极点总数为奇数时,该点属于根轨迹。本例中 (−1, 0) 和 (−∞, −2) 两段有效。
  4. 渐近线。n−m=3 条,与实轴夹角为 (2k+1)·180°/(n−m),即 60°、180°、−60°;交点 σ_a=(Σp−Σz)/(n−m)=(0−1−2)/3=−1。
  5. 分离点。实轴上两条分支相向运动、相遇后离开实轴的位置,满足 dK/ds=0,等价于 Σ1/(d−p_i)=Σ1/(d−z_j)。
  6. 与虚轴的交点。用劳斯判据求临界 K 和对应的 s=jω,本例得到 K=6、s=±j√2,与上一章的计算完全对应。

分离点之所以重要,是因为它直接对应阻尼比的取值。根轨迹离开实轴之后,闭环极点变成共轭复数,系统开始有超调;分离点越靠近虚轴,可用的阻尼区间越窄。设计时常用等阻尼线(与负实轴夹角 β=arccos ζ)与根轨迹的交点来读参数。

import numpy as np # 开环极点 0, -1, -2,无开环零点 poles = np.array([0.0, -1.0, -2.0]) zeros = np.array([]) # 分离点方程通分后为 3d^2 + 6d + 2 = 0 candidates = np.roots([3.0, 6.0, 2.0]) for d in candidates: if abs(d.imag) > 1e-9: continue # 分离点必然在实轴上 right = np.sum(poles > d.real) + np.sum(zeros > d.real) if right % 2 == 1: # 右侧实数零极点个数为奇数才在根轨迹上 K = np.prod(np.abs(d.real - poles)) print(f"分离点 d={d.real:.3f}, 对应 K={K:.3f}") # 输出:分离点 d=-0.423, 对应 K=0.385

这段代码里最关键的一行不是求根,而是right % 2 == 1这个校验。解方程会给出 −0.423 和 −1.577 两个候选值,其中 −1.577 落在 (−2, −1) 区间,右侧实数极点有两个(−1 和 0),个数为偶数,不在根轨迹上,必须剔除。只解方程不校验位置,是根轨迹题里最典型的失分点。K 的值由 K=Π|d−p_i| 给出,含义是“极点在此处分离时对应的增益”。

5. 易错点与易漏点:五处最容易翻车的地方

5.1 概念层:三处理解偏差

把开环极点当成闭环极点。易漏点在于拿到 G(s) 就去看分母的根,然后下结论说系统稳定。之所以会漏,是因为开环传递函数写在纸上最显眼,而闭环特征方程 1+GH=0 需要多推一步。补法是养成固定动作:任何稳定性判断之前,先把 1+G(s)H(s)=0 展开成标准多项式,再列劳斯表或求根。开环极点只描述对象自身的模态,闭环极点是对象和控制器共同作用的结果,两者可以完全不同。

终值定理无条件使用。易漏点在于算出 lim(s→0) sF(s) 得到一个有限数,就认为那是稳态值。之所以会漏,是因为公式太顺口,而适用条件写在脚注里。补法是每次用之前先检查 sF(s) 的极点:全在左半平面才能取终值;虚轴上有极点说明是等幅振荡,终值不存在,只能谈振幅;右半平面有极点说明发散。把这一步写成检查清单,比事后复盘有效得多。

把“极点越靠左越好”绝对化。易漏点在于只记住左半平面稳定,于是拼命加大增益把极点往左推。之所以会漏,是因为课本例题里通常只关心稳定性,不涉及执行器约束。补法是同时看阻尼比和自然频率:极点左移会让响应变快,但实部过大的共轭极点意味着高增益、大超调、对噪声和执行器饱和更敏感。设计时常用等阻尼线来约束位置,而不是无脑左推。

5.2 计算与作图层:两处一动手就错

分离点方程的解全盘接收。易漏点在于解出 dK/ds=0 的根就直接写进答案。之所以会漏,是因为教材例题给的根恰好都在根轨迹上,让人误以为方程的解天然有效。补法是对每个候选点做一次实轴段校验:统计该点右侧实数开环零极点的个数,奇数才有效;复根直接舍去。这一步用两行代码就能完成,手算时也只是数个数,性价比很高。

加积分只想着消误差,不重算稳定区间。易漏点在于认为积分环节“只有好处”,加完不回头检查稳定性。之所以会漏,是因为积分的作用被简化成一句口诀,而它同时带来的 −90° 相位滞后和阶次抬升被忽略了。补法是把加积分当成一次重新设计:型别提升的同时,特征方程阶次加一,原来的增益范围全部作废,必须重新列劳斯表或重画根轨迹,确认 K 的可用区间还在,并且留有裕度。

6. 复习清单:一页纸自检与三轮过法

复习到后期,比刷题更重要的是知道自己哪一块是空的。我的做法是把整门

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询