根轨迹法结合Simulink的控制器设计与仿真验证全流程
发布时间:2026/10/15 7:25:43 锦皓数字建站

根轨迹法大概是最容易被低估的一个控制器设计工具。课堂上它是画图题给一个开环传递函数画根轨迹、判断稳定性、算分离点。但在实际工程里它的真实用途是解决我想要系统又快又稳控制器参数到底该取多少这种具体问题。配合Simulink的仿真建模根轨迹法可以从纸上的一条特征根曲线变成一套可以直接验证、反复微调的控制器参数。这篇文章就聚焦一件事从性能指标出发用根轨迹法设计一个控制器然后在Simulink里把整个闭环系统搭出来跑通仿真、量化指标、再处理实际工程中常见的偏差。适合正在学自动控制原理、对Simulink建模还不太熟的同学也适合刚入行、需要快速完成控制器整定的工程师。后面所有步骤我都会给出能被复现的具体数值和操作细节不是泛泛而谈。1. 先搞清楚根轨迹法到底在设计什么我在看很多初学者接触根轨迹的时候注意力全放在怎么画图上结果画完之后不知道拿这张图干什么。其实根轨迹法的核心思想特别直白系统的闭环极点决定动态特性而闭环极点会随着开环增益变化。根轨迹就是描述开环增益从0变到无穷时闭环极点走了哪些位置的一套曲线。1.1 根轨迹画的不是轨迹是闭环极点的搬迁路线假设有一个单位负反馈系统开环传递函数为G(s)闭环传递函数是G(s)/(1G(s))闭环极点就是1G(s)0的根。如果把G(s)写成K·N(s)/D(s)的形式那么特征方程就是1 K·N(s)/D(s)0整理一下就是D(s) K·N(s)0。K从0开始增大时特征方程的根会在复平面上移动这些移动路径就是根轨迹。图上的x和o分别表示开环极点和开环零点x是D(s)0的点o是N(s)0的点。根轨迹从开环极点出发终止于开环零点或无穷远。你通过改变K就能让闭环极点走到目标位置。而闭环极点落在哪里直接决定了超调量、调节时间、振荡频率这些性能指标。所以根轨迹法本质上是在回答一个问题我想要极点落在某个位置开环增益K应该取多少或者控制器结构要改成什么样。1.2 设计控制器就是给系统装根装零如果只用增益K你能做的只是沿着已经存在的根轨迹移动极点但有时候这根轨迹根本不会经过你想要的位置。好比一条路是固定的你想去的地方不在路上那光踩油门没用。这时候就需要控制器C(s)来修路——通过给系统加零点和极点硬生生把根轨迹掰到目标区域附近。超前校正、滞后校正、PID本质上都是加零点和极点。超前校正在左半平面加一个零点和一个更靠左的极点用来增大相角裕度、把根轨迹往左拉让系统更快更稳滞后校正在原点附近加一个极点和一个零点用来提高低频增益、改善稳态误差。理解了这一步你就明白了Simulink里那些一两行的仿真案例背后就是这套搬极点、拉轨迹的思路。2. 一个二阶积分对象先建模再画根轨迹找差距纸上谈兵没有意义。为了把整个流程串起来我选一个很典型的被控对象一个电枢控制的直流电机位置系统经过简化之后可以用二阶积分环节来描述。这个模型在自动控制教材里很常见真实系统中不少转速控制、位置控制对象也都能近似成这样。2.1 用传递函数描述被控对象为什么选4/[s(s2)]这类系统的典型传递函数是G(s) K / [s·(s a)]这里分母里有一个积分环节s意味着系统是Ⅰ型系统对阶跃输入天然无静差另一个惯性环节sa来自电机的机电时间常数。为了让数值好算我取K4、a2即G(s) 4 / [s(s 2)]这个对象开环极点两个0和-2没有开环零点。这是一个结构最简单又不失代表性的模型——它有一个积分环节有真实的惯性能体现设计过程中各种典型问题。你在MATLAB命令行敲下面三行就能得到它的根轨迹图s tf(s); G 4/(s*(s2)); rlocus(G);2.2 未校正系统的根轨迹与性能差距先看这个系统直接用单位负反馈、什么都不加时的表现。它的闭环特征方程是s^22s40闭环极点是-1±j√3阻尼比ζ0.5自然频率ωn2 rad/s。按照经典二阶系统公式估算阶跃响应超调量大约是σ≈exp(-πζ/√(1-ζ^2))≈16.3%调节时间按2%误差带约为ts≈4/(ζ·ωn)4s现在给出一组设计指标超调量不超过15%调节时间不超过3秒。对比一下16.3%和4秒全部超标而且不是差一点。更关键的是如果我只把K往大调根轨迹会沿着一条固定曲线走K增大时闭环极点从实轴上的0和-2汇合然后沿着垂直于实轴的方向进到复平面。K取不同值时阻尼比会变系统不一定能同时满足又快又稳。我需要的是在根轨迹上找到一个位置同时满足阻尼比够大、自然频率够高这个位置还得是能通过调整K到达的。2.3 性能指标翻译成期望主导极点位置设计控制器之前第一步是把时域指标变成复平面上的期望区域。这里要用到两组经典近似公式超调量与阻尼比的关系σ≈exp(-πζ/√(1-ζ^2))调节时间与阻尼比、自然频率的关系2%误差带近似ts≈4/(ζ·ωn)按照ζ0.55左右ωn取大一点可以计算得到σ大约9.6%、ts大约3s以内留出余量。我取期望主导极点为s_d -1.4 ± j1.9这个点对应的阻尼比约0.59自然频率约2.36 rad/s理论上超调10%上下调节时间2.9秒左右满足15%、3秒的指标。后面所有设计工作就是想办法让闭环主导极点落到这个点附近。在MATLAB里可以用sgrid把阻尼比和自然频率网格叠到根轨迹上sgrid(0.55, 2.36);这样你一眼就能看出未校正系统想要通过调K让主导极点落在期望区域还差多少。3. 超前校正设计手算零极点与增益的完整过程目标明确了接下来就需要设计控制器。这一步我不建议直接打开Simulink拖模块而是先在MATLAB里或者手算把控制器结构定下来。原因很简单Simulink是验证工具不是设计工具。你在仿真里盲目调参数调出来的结果往往只对当前工况有效换个输入信号就露馅。先有了理论依据后面仿真才有对照。3.1 为什么要加超前校正而不是直接调增益理论上未校正系统的根轨迹上确实存在阻尼比大于0.5的点比如K4时闭环极点就在ζ0.5的等阻尼比线上但是自然频率只有2 rad/s调节时间要到4秒。如果继续增大K阻尼比会下降超调变大如果减小K响应变慢。换句话说仅靠调增益无法把期望极点搬到-1.4±j1.9的位置因为-1.4±j1.9根本不在未校正系统的根轨迹上。超前校正的作用就是通过加一个零点和一个更靠左的极点把根轨迹往左掰让期望极点成为闭环极点。从另一个角度看超前校正和PD控制的思路是相通的但PD控制器的纯微分项会放大高频噪声物理实现上也不如用一个零点加极点的超前网络来得自然。所以在Simulink里我用连续传递函数的形式搭超前校正器这也是实际工程中最常见的做法。3.2 相角补偿量怎么算超前校正的设计逻辑是如果期望极点是闭环极点那它必须满足根轨迹的相角条件和幅值条件。具体来说校正后开环传递函数C(s)G(s)在s_d处的相角必须是-180°或者180°取决于你习惯的写法。把C(s)写成Kc(sz)/(sp)的形式我们需要满足∠(s_dz) - ∠(s_dp) ∠G(s_d) -180°先算一下未校正的∠G(s_d)。s_d-1.4j1.9两个极点分别在0和-2。从s_d到极点0的向量是-1.4j1.9相角约是126.4°到极点-2的向量是0.6j1.9相角约72.4°。所以∠G(s_d) -126.4° - 72.4° -198.8°等价换算一下这里离-180°差了大约18.8°。理论上校正器只需提供约18.8°的相位但工程上我都会留一点余量取20°到25°。这里取20°这样即使后续增益略偏系统也不至于马上掉到指标之外。通过上面的公式可以反推零点和极点的几何关系。3.3 零极点位置与增益的求法设计超前校正零极点位置有标准的几何做法。第一步先放零点我把零点放在s_d左侧后方附近比如z2.2。这个选择有一定自由度但会影响最终增益和实际响应先不深究下文第5章我专门讲这个。当z2.2时从s_d到零点-2.2的向量是0.8j1.9相角约67.2°。要在s_d处产生20°的超前相位那么从s_d到极点-p的向量相角必须是67.2°-20°47.2°。于是存在单调关系设s_dp (p-1.4)j1.9其相角为47.2°即1.9/(p-1.4) tan(47.2°)。算出来p-1.4约等于1.76所以p≈3.16。这样校正器的零极点就确定了初步形式为C0(s) (s2.2)/(s3.16)接着用幅值条件求增益Kc。幅值条件要求校正后开环幅值在s_d处为1即|Kc·C0(s_d)·G(s_d)| 1逐个算模长|s_d|√(1.4^21.9^2)≈2.36|s_d2|≈1.99|s_d2.2|≈2.06|s_d3.16|≈2.59。代入得到Kc·4·2.06/(2.36·1.99·2.59) 1解出来Kc约等于1.48我取整到1.5。最终校正器就是C(s) 1.5(s2.2)/(s3.16)注意这里的Kc不是根轨迹图上那个K。根轨迹图默认的是C(s)G(s)的整体环路增益C0(s)里面增益是1Kc是作为额外增益叠上去的。这一步搞混的话后面验证会陷入混乱。3.4 用rlocus验证设计结果设计完就赶紧验证。在MATLAB里把C0和G乘起来画根轨迹C0 (s 2.2)/(s 3.16); L0 G * C0; rlocus(L0); sgrid(0.55, 2.36);这时你会看到校正后的根轨迹恰好从期望极点附近弯了过去。再用rlocfind点一下期望极点附近查看对应的增益K rlocfind(L0);点选-1.4j1.9附近返回的K应该非常接近1.5。这说明前面手算的零极点位置和增益是自洽的。到这里控制器设计的关键数值已经全部确定C(s)1.5(s2.2)/(s3.16)就等仿真验证了。4. Simulink仿真模型搭建模块选择、参数与接线细节控制器设计完了进入Simulink仿真建模环节。这一步不需要什么高深技巧但有几个细节处理不好会让结果完全不可信甚至模型跑出奇奇怪怪的波形。我按搭建顺序一步步说。4.1 模型整体结构与信号流程先明确闭环结构Step阶跃信号作为输入经过Sum求和节点进入控制器C(s)再到被控对象G(s)对象输出就是系统响应。把对象输出引回Sum求和节点的负输入端形成单位负反馈。这样闭环传递函数就是C(s)G(s)/(1C(s)G(s))。在模型里我习惯用Transfer Fcn模块而不是Pole-Zero模块。Transfer Fcn直接填分子分母系数出错概率低Pole-Zero模块虽然也能填零极点但对初学者来说反而容易把增益和零极点搞混。控制器Transfer Fcn参数这样填Numerator[1.5 3.3]因为C(s)1.5(s2.2)1.5s3.3注意这是分子展开后的系数不是零极点形式。Denominator[1 3.16]因为分母是s3.16。被控对象Transfer Fcn参数这样填Numerator[4]Denominator[1 2 0]对应s^22s0千万别漏了最后一个0漏了就成了12s物理含义完全错误。Sum求和模块在Math Operations库双击打开参数对话框把List of signs设置为|-。竖线表示信号主输入路径加号是给定输入减号是反馈输入。如果保持默认的系统就变成正反馈了仿真一跑必飞。4.2 各模块参数与连线顺序从Simulink库浏览器里拖出Step、Sum、Transfer Fcn两个、Scope按顺序连线最后用一条线从对象输出端拉回Sum的负输入。这个连线顺序不要乱先连Step→Sum→控制器→对象→Scope再连反馈线。如果先连反馈线容易把主线擦掉。双击Step设置参数我一般把Step time设为0Initial value设为0Final value设为1。这样结果就是标准的单位阶跃响应。Scope不需要特别设置但只靠Scope肉眼读指标很吃力所以更推荐加一个To Workspace模块。接线方式是对象输出接一个Mux或直接给To Workspace我通常是再复制一条线到To Workspace。设置变量名yout保存格式选Timeseries。仿真完在命令窗口就能用plot(yout.Time, yout.Data)自己画图。4.3 求解器、步长与Scope的配置Simulink默认的求解器是变步长ode45多数连续系统仿真的确够用。这个模型是连续的线性系统用ode45没问题但有个隐患如果Max step size不限制快速非线性或者大增益系统的瞬态可能被跳过。所以我习惯把Model Settings里的Max step size设成0.01秒仿真停止时间设成5秒既能看到完整的调节过程又不会因为步长过大把峰值切掉。有一个很实用的检查方法看信号线上的颜色。Simulink里连续时间信号是黑色线离散信号是点划线。如果出现红色虚线说明信号类型不匹配多半是有模块把连续信号当离散处理了。这个模型里所有模块都是连续时间模块正常连线应该全是黑线。出现彩色线时先别急着仿真停下来检查。5. 仿真结果校验指标差在哪里、为什么差、怎么调模型搭完之后仿真只是几秒钟的事。但真正有价值的是把仿真结果和设计指标放在一起对比。这里最容易踩坑的地方在根轨迹法设计的是一个期望闭环极点但系统在动态过程中不只是那一对主导极点在工作设计时的近似误差会在这里暴露无遗。5.1 从Scope数据量化超调和调节时间点击Run之后Scope里应该出现一条先上升、到峰值后回落、最终稳定在1.0附近的曲线。看个大概不是目的我要的是量化数据。如果刚才加了To Workspace可以在命令窗口写y yout.Data; t yout.Time; S stepinfo(y, t, 1)stepinfo会直接返回超调量Overshoot、调节时间SettlingTime、峰值Peak等指标。这个比肉眼看Scope精准得多也方便你在调整参数时做前后对比。把这个结果和初始设计指标对一下。如果超调在13%~15%左右、调节时间在3秒上下说明设计基本合格可以直接用了。5.2 超调比理论高罪魁往往是零点效应这里有一个所有根轨迹设计者都会遇到的现象手算的时候期望主导极点对应的超调理论值是10%左右但Simulink仿真跑出来往往偏高达到14%甚至超过15%。这不是算错了而是零点效应在起作用。我在第3章选择的零点z2.2距离主导极点-1.4j1.9并不算远。这个零点虽然不改变闭环极点位置但它会让阶跃响应的初始阶段出现额外抬升直观表现就是超调变大。极点p3.16也离主导极点不远它的影响相对小一些但和零点一叠加实际响应就不可能和理想二阶模型完全一致。遇到这种情况不要急着改结构可以分两步调整第一把增益Kc从1.5降到1.35~1.4重新仿真观察超调是否回到允许范围。增益降低会让实际闭环极点略向下移动虽然不完全在期望位置但往往能换取更低的超调。第二如果降增益导致调节时间变长那就把零点往左移动比如z2.8重新算一遍p和Kc让零点离主导极点更远零点效应会减弱超调也会更接近理论值。这个微调过程就是工程和教科书的差别。教科书给你一个精确解工程则是在精确解附近找一个满足所有约束的可行解。仿真模型的价值就在这里你可以放心大胆地试几秒钟就能看到结果。5.3 工程约束增益调整与执行器饱和单纯的线性仿真通过指标之后还可以往前再走一步加入工程约束。最常见的就是执行器饱和。控制器输出范围是有限的电机力矩、阀门开度不可能无限大。在Simulink里可以在控制器和被控对象之间加一个Saturation模块设置上下限比如±5。然后给一个较大的阶跃输入比如从0到5再看系统响应。这时候会出现一个新现象控制器输出顶到饱和限相当于开环增益被临时降低系统的有效动态变成非线性实际响应会和线性仿真差别很大超调率反而可能更低但调节过程会拖出更长的尾巴。这个现象本身不是坏事它说明你选的控制器增益在正常工作范围内是合适的。真正要警惕的是如果线性仿真结果非常漂亮但你给控制器输出加一个很窄的饱和限后系统出现极限环振荡那说明校正器增益或者零极点位置在非线性约束下不够鲁棒。这时候通常的做法是降低Kc、重新评估期望极点位置或者干脆换结构。6. 进阶让根轨迹设计在Simulink里形成闭环最后再讲两个提升效率的技巧。这套流程走熟之后你会发现根轨迹法和Simulink仿真建模其实是同一个工作流的两个阶段根轨迹负责设计Simulink负责验证。但如果能掌握图形化工具和几种常用校正结构的切换整个过程的迭代速度还能再快一个量级。6.1 用Control System Designer做图形化拖拽MATLAB里有一款叫Control System Designer的交互工具输入controlSystemDesigner(G)就能打开。它会同时显示根轨迹图、波特图和闭环阶跃响应你可以直接用鼠标拖拽校正器的零点和极点位置每拖一下根轨迹曲线和阶跃响应曲线都会实时更新。这样就不用手算一轮、仿真一次再回来调整人眼能直观判断极点往哪边挪超调会变大还是变小。这个工具的用法和手算并不冲突。手算给出了一个合理起点图形化拖拽是在这个起点附近做局部搜索。Simulink模型搭好之后还可以把MATLAB里设计好的C(s)直接导成Simulink中的Transfer Fcn参数不需要手动展开多项式减少出错。6.2 什么时候该换滞后校正或PID这篇文章用的例子性能差距集中在响应不够快所以超前校正是最合适的选择。但实际项目里往往还有稳态精度的问题。比如系统开环增益不够斜坡输入下稳态误差超标这时超前校正帮不上忙需要在前面串一个滞后网络在原点和左侧较近处加一个极点和一个零点比如( s0.1 )/( s0.01 )用低频抬增益的方式改善稳态误差。更通用的做法是直接设计PID。PID的P和D部分等价于一个超前校正的效应I部分承担稳态精度。在Simulink里用PID Controller模块时把PID的零点极点规律和根轨迹图对照着看调试起来会非常有方向感——你现在知道P是改变增益、把极点沿轨迹移动D是加零点、把轨迹往左拉I是在原点附近加极点、抬高低频增益。知道这些之后调PID就不再是黑盒试错了。根轨迹法给静态公式注入了动态直觉这也是我建议每个做控制的都把它吃透的根本原因。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。