自动控制原理:从闭环极点、根轨迹到PID整定避坑

发布时间:2026/11/3 6:57:42
自动控制原理:从闭环极点、根轨迹到PID整定避坑

简介:这份课程笔记合集面向自动控制理论零基础、正在补基础的研一研二学生及自学者,整理自 Dr.CAN 的【自动控制原理】专题,帮助读者在正式推导前建立传递函数、反馈与稳定性分析的整体框架。内容以手写笔记配合截屏整理,覆盖开环与闭环系统、反馈控制、传递函数、极点与稳定性判断、根轨迹及其绘制、终值定理与稳态误差、比例积分控制器,以及分离点和大汇合点等知识点,并对极点位于左半平面才稳定、积分项用于消除稳态误差等结论做了重点标注,便于对照视频复盘、查漏补缺。压缩包内为 1 个 PDF 文件,大小约 12.27MB,轻量易存,适合在平板或电脑上随查随看。目前已有 851 人学习,可作为后续卡尔曼滤波、MPC 与最优控制等进阶内容的前置补强材料。

1. 开环与闭环:为什么“没有反馈”的系统迟早会翻车

自动控制原理最容易让人误判的一点,是把开环系统当成“简化版闭环”。这套 13 期全的自动控制原理课程笔记资源从传递函数、开环与闭环、稳定性判据一路推到根轨迹和 PID,第一条主线就把反馈控制的因果讲透了:开环只按输入做事,闭环拿输出和期望值比较,用误差驱动控制器。没有反馈,系统不是一定不稳定,而是误差没有后悔药,参数漂移、负载变化、模型偏差都只能被动承受。

为什么极点落在复平面左半边就稳定、终值定理什么时候能用、根轨迹的分离点为什么存在,这些问题的答案都藏在“误差如何被拉回”这条主线里。课程笔记里拿平衡车、单摆、漏水生锈这类例子做直觉类比,本质上都在说同一件事:反馈把“输出偏离目标”变成下一次控制的输入,系统才有自我修正的机会。

把这条线搞懂,后面看伯德图、奈奎斯特图才不会变成背规则。这份课程资源的价值不在于替你算一道题,而在于把从物理直觉到复平面判据的推导链条保留下来,让刚开始补控制理论的人能看到每一步为什么成立。

2. 传递函数与极点:为什么稳定性被压缩到复平面左半边

传递函数看起来只是一个分子分母都是多项式的分式,但它把线性时不变系统的微分方程、初始条件、输入输出关系压缩到了复频域。很多人会算极点的数值,却说不清为什么“极点在左半平面”能等价于“系统稳定”。这个等价关系不是定义出来的,而是从时域模态一步步推出来的。

2.1 从微分方程到拉普拉斯域:传递函数到底封装了什么

一个线性时不变系统可以用常系数微分方程描述,比如二阶系统写成y'' + 2ζωn y' + ωn² y = ωn² u。在零初始条件下对两边做拉普拉斯变换,微分变成乘s,积分变成除以s,微分方程就变成了代数方程。把输出和输入的比值拿出来,得到G(s)=Y(s)/U(s)=N(s)/D(s),这就是传递函数。

这里有两个关键点常被忽略。第一,传递函数默认零初始条件,它描述的是系统本身的输入输出关系,不是某一个具体时刻的响应;第二,分母D(s)的根是极点,分子N(s)的根是零点,极点决定系统有哪些固有模态,零点改变这些模态在输出里的组合权重。把闭环画成一条信号流:R(s)进入比较点,减去反馈H(s)Y(s),得到误差E(s),再经过控制器C(s)和被控对象G(s)得到Y(s)。整条流的前向通道是C(s)G(s),反馈通道是H(s),闭环传递函数写成C(s)G(s)/(1+C(s)G(s)H(s))。

真正决定闭环稳定性的是分母1+C(s)G(s)H(s)=0的根,也就是闭环极点。开环极点只说明开环系统自己的模态,不能直接拿来判闭环稳定。常见的实现思路是:先把每个环节的传递函数写成分子分母数组,再做多项式乘法和加法,最后求闭环特征多项式的根;如果阶次高,就用劳斯判据避免直接求根。

注意:开环稳定不等于闭环稳定。反馈可能把极点推到右半平面,尤其是高增益比例反馈。

2.2 极点决定模态:e^{pt} 如何把左半平面变成稳定判据

把闭环传递函数做部分分式展开,输出可以写成若干个A_i/(s-p_i)的叠加,其中p_i是极点。对每一项做拉普拉斯反变换,时域里对应A_i e^{p_i t}。如果极点是实数,e^{p_i t}就是一条指数曲线;如果极点是共轭复数σ±jω,时域里会出现e^{σt}cos(ωt+φ)这样的衰减或发散振荡。

稳定性的判据就落在这个指数包络上:实部σ小于零,包络随时间衰减,系统受到扰动后能回到平衡位置;实部大于零,包络发散,系统越偏越远;实部等于零,包络不增不减,对应等幅振荡或常值。复平面左半边之所以成为稳定区,不是因为教材规定,而是因为e^{σt}在σ<0时极限为零。

极点位置时域模态稳定性
负实轴e^{-at},单调衰减稳定
左半平面共轭复极点e^{-at}cos(ωt+φ),衰减振荡稳定
虚轴单极点等幅振荡或常值临界,工程上通常不算渐近稳定
右半平面极点指数发散或发散振荡不稳定
虚轴重极点含t项,幅值增长不稳定

零点不决定稳定性,但会改变留数A_i的大小和相位,也就是改变每个模态在输出里占多少。一个右半平面零点虽然不会让系统自身发散,却可能让阶跃响应先往下掉再往上走,增加控制器设计的难度。很多人把“零点在右半平面”和“系统不稳定”混为一谈,其实是两件事。

2.3 用一段仿真验证极点位置与冲激响应

课程笔记里强调“极点在左半平面”时,最好亲手把极点挪到不同位置看响应。下面这段 Python 用标准二阶系统s²+2ζωn s+ωn²做冲激响应,阻尼比ζ决定极点实部-ζωn,改变ζ就能看到包络从衰减到发散。

import numpy as np from scipy import signal import matplotlib.pyplot as plt wn = 2.0 # 自然频率,决定振荡快慢 for zeta, label in [(0.2, "欠阻尼"), (1.0, "临界阻尼"), (2.0, "过阻尼")]: # 标准二阶分母:s^2 + 2*zeta*wn*s + wn^2 sys = signal.TransferFunction([wn**2], [1, 2*zeta*wn, wn**2]) t, y = signal.impulse(sys, T=np.linspace(0, 10, 500)) poles = np.roots([1, 2*zeta*wn, wn**2]) plt.plot(t, y, label=f"{label}, poles={poles}") plt.axhline(0, color="k", linewidth=0.5) plt.legend() plt.xlabel("t") plt.ylabel("impulse response") plt.show()

这段代码里wn是自然频率,zeta是阻尼比,signal.impulse给的是冲激响应。三个系统的极点实部分别是-0.4、-2、-4,都在左半平面,所以响应最终都衰减;如果把zeta改成负数,极点实部变正,响应包络会向上翻。代码只是验证工具,真正要记住的是:极点的实部决定包络,虚部决定振荡频率,分子零点只改变包络前的系数。

3. 终值定理与稳态误差:为什么“最终值”不是随便代入 s=0

稳态误差是自动控制原理里最容易“算对但用错”的地方。很多人把s=0代进误差传递函数,得到一个有限数,就认为系统最终会停在那里;可如果闭环极点里有右半平面或虚轴极点,时域输出根本不存在极限,这个有限数只是形式上的代数结果。终值定理不是稳定判据,它是一张有前提的“后验票”。

3.1 终值定理的适用条件:极点必须先落在左半平面

终值定理写成lim_{t→∞} f(t)=lim_{s→0} sF(s),前提是sF(s)的所有极点都严格位于左半平面。换句话说,f(t)本身必须存在极限。如果F(s)有虚轴上的共轭极点,时域里对应等幅振荡,极限不存在;如果F(s)有右半平面极点,时域发散,极限也不存在。教材里常写“终值定理要求系统稳定”,更准确的说法是要求sF(s)的极点条件满足。

课程笔记里举无阻尼系统的例子:输入是阶跃,输出一直在振荡,理论上不会回到某个固定值,可有人把s=0代进去却得到一个数,于是觉得终值定理和现象矛盾。矛盾不在定理,而在使用顺序:先判断闭环稳定性,再确认sE(s)的极点分布,最后才做s→0的极限。顺序反了,计算越熟练越容易翻车。

注意:终值定理算的是“极限存在时的极限值”,不是“随便代入 s=0 得到的数”。

3.2 稳态误差的类型:阶跃、斜坡、加速度输入与误差系数

单位负反馈下,误差传递函数是E(s)/R(s)=1/(1+G(s)),稳态误差用ess=lim_{s→0} sE(s)求。系统按开环传递函数里积分环节的个数分型:没有积分环节是 0 型,一个积分环节是 I 型,两个是 II 型。型别决定了系统能“跟住”哪种输入。

输入类型0 型系统I 型系统II 型系统
阶跃1/s1/(1+Kp),有限误差00
斜坡1/s²无穷大1/Kv,有限误差0
抛物线1/s³无穷大无穷大1/Ka,有限误差

表里的Kp=lim_{s→0}G(s)、Kv=lim_{s→0}sG(s)、Ka=lim_{s→0}s²G(s)是静态误差系数。0 型系统对阶跃有有限误差,对斜坡完全跟不住;I 型系统对阶跃无静差,对斜坡有有限误差;II 型系统再往上多跟一种输入。这个表不是背出来的,而是把sE(s)的极限按型别算出来的。

3.3 从劳斯判据到误差表:先稳再算误差的顺序

拿到一个闭环系统,我一般会按固定顺序走:先写闭环特征多项式D(s)=0,用劳斯判据判断是否有右半平面极点;再确认sE(s)的极点是否满足终值定理条件;然后按系统型别查误差系数;最后用阶跃或斜坡仿真交叉验证。劳斯表的第一列符号变化次数等于右半平面极点个数,第一列出现零或整行零时要单独处理,不能直接下结论。

举个例子,开环G(s)=K/[s(s+1)],单位负反馈,闭环特征方程是s²+s+K=0。劳斯表第一列是1、1、K,所以K>0时闭环稳定。这是 I 型系统,阶跃输入下Kp=∞,稳态误差为 0;斜坡输入下Kv=K,稳态误差为1/K。如果只看到1/K有限就认为没问题,却忘了K>0这个稳定前提,那K取负值时误差公式照样能算出数,系统却已经发散。

这套顺序在课程笔记里体现得很明显:稳定性分析、终值定理、稳态误差不是三个孤立知识点,而是一条前后依赖的链。先把极点按住,再谈最终值,最后才谈误差大小。

4. PID 与控制器设计:比例、积分、微分分别在补什么“病”

PID 常被当成三个旋钮的玄学,实际上三项分别对应误差的现在、过去和未来。比例项看当前误差,积分项把历史误差累加起来,微分项估计误差的变化趋势。课程笔记里讲一阶系统加积分会变成二阶系统,这句话背后是闭环特征方程阶次的变化,也是积分为什么能消误差、又为什么容易把系统拖进振荡的原因。

4.1 比例控制:把误差放大,但把稳态误差也放大

纯比例控制C(s)=Kp最容易理解:误差大就多给控制量,误差小就少给。对一阶被控对象G(s)=K/(Ts+1),单位负反馈闭环传递函数是KpK/(Ts+1+KpK),阶跃稳态误差是1/(1+KpK)。增大Kp会减小稳态误差、加快响应,但比例控制不改变系统型别,0 型系统再大的Kp也只能把误差压小,不能压到零。

比例增益对二阶系统还有另一面:它会把闭环极点往左推,但推过头可能降低阻尼,超调变大。很多人调 PID 的第一步就是把Kp拉大,看到响应变快就继续加,结果波形开始振荡,还以为是积分项的问题。实际上比例项已经在改变极点位置,先确认Kp单独作用下的超调和调节时间,再加积分,排查会清楚很多。

4.2 积分控制:用时间换误差,为什么容易把系统变成二阶

积分控制C(s)=Ki/s把误差随时间累加,只要误差不为零,积分输出就继续变化,直到误差被压到零。它把系统型别提高一级,所以 0 型系统加积分后对阶跃输入可以实现无静差。代价是引入-90°的相位滞后,闭环特征方程阶次也升高。

以一阶对象G(s)=K/(Ts+1)加 PI 控制器C(s)=Kp+Ki/s为例,闭环特征方程是Ts²+(1+KKp)s+KKi=0。原本一阶的系统变成了二阶,阻尼比和自然频率都由Kp、Ki共同决定。Ki太小,误差消得慢;Ki太大,二阶系统阻尼变小,超调甚至发散。课程笔记里说“纯积分反应速度慢,比例积分兼顾快速和消误差”,本质上是在二阶极点配置里找平衡。

注意:积分饱和是实际系统里的常见问题。执行器有限幅时,误差长期存在会让积分项越积越大,退饱和需要时间。

4.3 微分控制:给系统一点“预判”,代价是噪声放大

微分项Kd s对误差变化率响应,误差开始变大时就提前给反向控制量,相当于增加阻尼。它对阶跃稳态没有影响,因为阶跃的导数为零;但它对高频噪声非常敏感,理想微分的高频增益随频率无限增大,实际测量里的毛刺会被放大。常见的实现思路是给微分加一阶低通滤波,写成Kd s/(τs+1),用τ限制高频增益。

比例、积分、微分三项的作用可以放在一张表里看,但表只能给方向,不能代替参数整定。真正动手时,先 P 到响应快但不持续振荡,再加 I 消静差,最后加 D 压超调;每加一项都回头看闭环极点和时域波形,别只看一个指标。

控制项主要作用副作用对稳态误差的影响
比例 P加快响应,减小误差增益过大引起振荡减小但不能消除 0 型系统阶跃误差
积分 I消除阶跃稳态误差相位滞后,降低稳定裕度提高系统型别,阶跃误差可到零
微分 D增加阻尼,减小超调放大高频噪声对阶跃稳态误差基本无影响

4.4 用一段仿真对比 P、PI、PID 的阶跃响应

下面这段 Python 用一阶对象1/(s+1)对比三种控制器。代码只观察趋势,参数不要照抄,重点是看稳态值和超调怎么变。

import numpy as np from scipy import signal import matplotlib.pyplot as plt plant = signal.TransferFunction([1], [1, 1]) # G(s)=1/(s+1) t = np.linspace(0, 10, 1000) C_p = signal.TransferFunction([2], [1]) # P: 2 C_pi = signal.TransferFunction([2, 1], [1, 0]) # PI: 2 + 1/s C_pid = signal.TransferFunction([2, 3, 1], [1, 0]) # PID: 2 + 3/s + s for C, label in [(C_p, "P"), (C_pi, "PI"), (C_pid, "PID")]: # 单位负反馈闭环:C*plant / (1 + C*plant) cl = signal.feedback(C * plant, 1) _, y = signal.step(cl, T=t) plt.plot(t, y, label=label) plt.axhline(1, color="k", linestyle="--", linewidth=0.8) plt.legend() plt.xlabel("t") plt.ylabel("y(t)") plt.show()

signal.feedback(C * plant, 1)表示单位负反馈,signal.step给阶跃响应。P 控制稳态到不了 1,PI 和 PID 因为积分项把稳态误差压到零;PID 的微分项让上升过程更平稳,但参数不当时也会出现高频抖动。仿真里没有噪声、饱和和采样,所以它只能验证线性模型下的趋势,不能替代实际闭环测试。

5. 避坑与排查:自动控制原理里最容易“算对但用错”的几个地方

自动控制原理的公式不难,难的是每个公式都有前提。血泪经验是:算出一个数不等于结论成立,先检查前提,再看数值。下面这些踩坑记录,基本都发生在“公式没错、顺序错了”的时候。

5.1 极点、终值与根轨迹的踩坑记录

现象:把s=0代入误差传递函数,得到一个有限稳态误差,就判定系统稳定。原因:终值定理的前提是sE(s)的极点都在左半平面,闭环有右半平面或虚轴极点时,时域极限根本不存在,s=0代入只是代数形式。解决:先写闭环特征方程,用劳斯判据或求根确认所有闭环极点在左半平面;再检查sE(s)的极点;最后才做s→0的极限。顺序不能反。

现象:根轨迹画出来有一段伸进右半平面,但时域仿真看起来“收敛”了。原因:根轨迹横轴是控制器参数K,仿真用的K可能不在那段右半平面对应的区间;也可能仿真时间太短,发散还没显现;非线性饱和还会让响应暂时有界,看起来像稳定。解决:把实际K标在根轨迹上,读出对应的闭环极点;再用足够长的时间做阶跃仿真,并检查执行器是否饱和。根轨迹只说明线性模型下极点怎么走,不能替代非线性验证。

现象:用dK/ds=0求分离点,解出一个重根,但代回去发现该点不在根轨迹上。原因:dK/ds=0只是分离点的必要条件,解可能对应K<0,也可能落在不属于根轨迹的实轴段。根轨迹只取K≥0且满足相角条件的点。解决:把解代回K=-1/[G(s)H(s)]检查K是否非负;再用实轴段“右侧开环实数极点加零点总数为奇数”的规则筛一遍;最后用相角条件复核。

现象:拿开环极点判闭环稳定性,看到开环全在左半平面就放心了。原因:反馈会改变极点位置,开环稳定不代表闭环稳定,高增益可能把闭环极点推到右半平面。解决:写闭环特征方程1+C(s)G(s)H(s)=0,求闭环极点或用劳斯判据;根轨迹图上只看闭环极点分支,不看开环极点本身。

5.2 控制器与仿真验证的踩坑记录

现象:积分增益Ki越大,稳态误差消得越快,但系统开始振荡甚至发散。原因:积分引入相位滞后,降低稳定裕度;一阶对象加 PI 后闭环变二阶,Ki过大会把阻尼比压得很低。解决:先只用 P 把响应调到“快但不持续振荡”,再加 I;每次增加Ki都看超调和调节时间,必要时加 D 或降低带宽。不要用“误差消得快”作为唯一指标。

现象:微分项一加,仿真波形出现毛刺,实际系统抖动更明显。原因:理想微分高频增益大,测量噪声被放大;离散实现里的差分对噪声更敏感。解决:给微分加一阶低通滤波,写成Kd s/(τs+1),τ按噪声频率选;仿真时主动加噪声源,不要只用干净阶跃信号验证。

现象:连续域仿真很稳,实际系统却抖动或超调。原因:采样、零阶保持器、执行器饱和、传感器延迟都没有建模,连续域里很大的相位裕度到了离散域可能已经不够。解决:把采样周期、零阶保持器、饱和限幅和延迟加进仿真;降低闭环带宽留裕度;必要时直接用离散控制器设计,而不是连续设计完再离散化。

排查时我一般按“先极点、再条件、后参数”的顺序走:先确认闭环极点是否都在左半平面,再确认终值定理和根轨迹的适用条件,最后才调 PID 参数。表格只能提示方向,真正能定位问题的是把每个环节的传递函数和实际参数对上去。

症状先查什么常见原因
稳态误差算出来是有限值,但响应发散闭环极点、sE(s)极点终值定理前提不满足
根轨迹和仿真结论矛盾实际K范围、仿真时长、饱和看错分支或非线性影响
加积分后振荡闭环阻尼、相位裕度Ki过大,二阶系统阻尼不足
加微分后毛刺大噪声频谱、微分滤波理想微分放大高频噪声

6. 设计取舍:稳定性、快速性与实现代价之间怎么选

控制器设计不是找唯一答案,而是在约束下挪极点。稳定性是底线,快速性是目标,实现代价是边界。比例增益能把极点往左推、加快响应,但推过头会降低阻尼;积分能提高型别、消掉阶跃误差,但带来相位滞后;微分能增加阻尼,却把噪声请进门。三者不是越多越好,而是看系统最缺什么。

6.1 先保极点,再谈指标

我一般会先看闭环极点:全在左半平面,才有资格谈超调、调节时间、稳态误差。然后看型别和终值条件,确认误差公式能用。最后才在根轨迹上选K,或者用频域裕度选截止频率。根轨迹适合看参数变化下极点怎么走,频域适合看鲁棒性和噪声抑制,两者不是替代关系。连续域设计完还要回到离散实现,采样周期、饱和、延迟都会改变实际极点位置。

6.2 一条验证路径:从传递函数到根轨迹再到时域仿真

拿到一个回路,我会按这条路径走一遍:写开环传递函数,确认零极点;写闭环特征方程,用劳斯判据或求根判稳;画根轨迹,标出实际参数对应的闭环极点;算稳态误差,检查终值定理条件;最后做时域仿真,加入饱和、噪声和采样。每一步都可能推翻前一步的结论,但顺序不能省。

取舍点偏稳定偏快速实现代价
比例增益留裕度,降低Kp提高Kp过大易振荡
积分增益降低Ki提高Ki消误差相位滞后、饱和
微分作用加滤波,保守使用提高Kd压超调噪声放大、离散抖动
设计域频域看裕度根轨迹看极点离散化后需复验

从那以后我每次拿到一个控制回路,都先把闭环极点、终值条件和根轨迹分离点走一遍,再动 PID 参数。这套 13 期全的自动控制原理课程笔记资源适合放在手边,当你在传递函数、稳定性和根轨迹之间来回卡住时,它能把推导链条接起来,文末有获取方式。希望帮到你。

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