三阶对象根轨迹法控制器设计与Simulink仿真建模

发布时间:2026/10/12 7:22:35
三阶对象根轨迹法控制器设计与Simulink仿真建模
我一直觉得控制器设计里最容易被低估的工具就是根轨迹法。很多人学的时候觉得它只是画图的作业题真到用 Simulink 做仿真建模时又开始凭感觉试 PID直到试不动了才回头翻课本。今天这篇内容我想用一个完整的三阶对象把基于 Simulink 的根轨迹法控制器设计与仿真建模示例走一遍从怎么画根轨迹、怎么手算出满足阻尼比要求的增益到在 Simulink 里搭闭环模型、看阶跃响应再加一个滞后校正改善斜坡稳态误差。适合正在学自动控制原理、做课程设计或者刚开始用 Simulink 做电机/温控/机械系统控制的朋友参考。1. 根轨迹法到底在解决什么问题先说一个基本事实线性定常系统的动态性能比如超调量、调节时间、上升时间基本由闭环极点决定。你给系统一个阶跃输入输出波形是快是慢、是稳是振荡背后都是那些闭环极点在起作用。哪怕你把目标说得天花乱坠最后落到数学上就是要让闭环极点落在合适的位置。闭环极点是怎么来的对单位反馈系统来说闭环特征方程是 1 K·G(s) 0其中 G(s) 是开环传递函数K 是待设计的增益。这个方程里一旦 K 变了闭环极点就会跟着移动。根轨迹法做的事情就是把“K 从 0 变化到无穷大时闭环极点到底画在 s 平面哪个位置”这条曲线完整画出来。你可能会觉得直接用 MATLAB 求闭环极点不就行了吗问题是 K 是一个连续变量不可能每个值都去解一次方程。根轨迹图的好处是一条曲线就把所有可能的闭环极点位置都摆在你面前你只需要根据性能指标在线上挑一个点反推这个点对应的 K 值。这就是根轨迹法的本质把控制器设计变成在图上找点。那为什么一定要配合 Simulink因为根轨迹法设计的是线性模型但实际系统里会有饱和、死区、摩擦这些非线性因素。Simulink 的价值在于你可以在同一套模型里做线性验证和非线性校核。先用根轨迹法算出理论增益再在 Simulink 里搭出闭环回路看真实响应两者互相印证这才是完整的工程流程。我见过太多人只会在 MATLAB 命令行里敲 rlocus却不知道 Simulink 里怎么建闭环模型导致理论和仿真对不上最后怀疑算法错了。2. 从哪来被控对象与根轨迹骨架分析2.1 一个带积分环节的三阶对象为了让讨论足够具体我选一个很常见的被控对象G(s) 1 / [s(s2)(s6)]这个传递函数代表了很多实际被控对象的简化模型一个积分环节加两个惯性环节。比如直流电机的转角控制电机本身有积分特性再叠加电气惯性和机械惯性简化后就长这样再比如某个加热系统的温度控制加热功率对温度的积分过程加上热容和散热延迟也容易归成这种形式。分母展开后是 s³ 8s² 12s三个开环极点分别在 0、-2、-6。为什么选三阶而不是教材里最常见的二阶因为三阶系统能展示根轨迹的完整形态有分离点、有渐近线、有与虚轴的交点还能看到“增益太小系统太慢增益太大系统振荡甚至不稳定”的完整变化过程。如果是纯二阶系统根轨迹太规整很多东西看不出来。2.2 先手工画出根轨迹的骨架画根轨迹最忌讳的是对着软件结果直接抄。哪怕不用尺子也要先把手算骨架搭出来这样才不会犯方向性错误。我按常规步骤走一遍。第一步确定分支数和起点终点。开环极点有三个0、-2、-6所以根轨迹有三条分支分别从这三个极点出发。三条分支的终点要么走向无穷远要么走向开环零点。这个对象没有有限零点所以三条分支都趋向无穷远。第二步确定实轴上的根轨迹段。规则是“实轴上某点右侧开环零极点总数为奇数时该段属于根轨迹”。对这个系统右侧极点数量如下在区间 (0, ∞) 上右侧极点数为 0偶数不属于根轨迹在区间 (-2, 0) 上右侧极点数为 1奇数属于根轨迹在区间 (-6, -2) 上右侧极点数为 2偶数不属于根轨迹在区间 (-∞, -6) 上右侧极点数为 3奇数属于根轨迹。所以实轴上的根轨迹段是 [-2, 0] 和 (-∞, -6]。这里有个容易踩的坑很多人想当然以为-6 到 -2 之间是一条根轨迹段其实那个区间右侧有 0 和 -2 两个极点偶数不是根轨迹。第三步找分离点。分离点就是闭环特征方程出现重根的地方也是实轴上根轨迹的分叉点。用 dK/ds 0 计算特征方程写为 s³ 8s² 12s K 0求导得到 3s² 16s 12 0解得 s ≈ -0.91 和 s ≈ -4.42。这里必须多说一句解出来的两个点不能直接全收。s ≈ -0.91 位于 [-2, 0] 区间内是真分离点代入幅值条件得到 K ≈ 5.04而 s ≈ -4.42 虽然满足求导方程但它对应的开环增益是负的不在 K 0 的根轨迹上所以要舍掉。这种“求导解出冗余点”的情况很常见判断标准就是看该点是否在实轴根轨迹段上。第四步算渐近线。三条分支趋向无穷远渐近线交点位于实轴的 -8/3 ≈ -2.67渐近线与实轴夹角为 ±60° 和 180°。这个信息虽然不参与后续增益计算但画图时能帮你确认复平面的分支走向朝哪边尤其是根轨迹在分离点之后是往上还是往下弯曲。第五步找与虚轴的交点。把 s jω 代入特征方程(jω)³ 8(jω)² 12(jω) K 0整理后实部为 -8ω² K虚部为 -ω³ 12ω。令虚部为零得 ω √12 ≈ 3.46令实部为零得 K 8ω² 96。也就是说当 K 96 时闭环极点落在 ±j3.46 处系统处于临界振荡状态。2.3 用 MATLAB 验证并画图手算完了再用 MATLAB 验证一下。只需要三行代码G tf(1, [1 8 12 0]); rlocus(G); sgrid;运行后你会看到三条分支一条从 -6 出发沿着负实轴往左走向无穷远另外两条从 0 和 -2 出发在约 -0.91 处相遇并分离进入复平面形成一个向右弯曲的“拱形”最终越过虚轴进入右半平面。这套形态完全符合手算的骨架。我把关键参数整理成一张速查表后面计算和排查问题都会用到关键位置坐标/数值说明开环极点0、-2、-6三条根轨迹分支的起点实轴根轨迹段[-2, 0] 和 (-∞, -6]只在这两段上取实根分离点s ≈ -0.91K ≈ 5.04从三个实极点过渡到一对复极点渐近线交点σ ≈ -2.67夹角 ±60°、180°与虚轴交点s ±j3.46K 96临界稳定点劳斯判据稳定范围0 K 96与根轨迹交点互相印证顺便说一句用劳斯判据也能得到 K 的临界值。特征方程 s³ 8s² 12s K 0 的劳斯表第一列正数条件给出 0 K 96临界时辅助方程 8s² 96 0 的解正是 ±j3.46。两条路线殊途同归验证了计算没问题。3. 阻尼比0.5对应的增益K是怎么算出来的3.1 从性能指标到阻尼线假设现在设计指标要求系统的阻尼比 ζ 0.5。这个阻尼比对应阶跃响应的超调量约 16.3%峰值时间约 2.42 秒调节时间约 5.33 秒是工程里比较常用的“兼顾快速性和稳定性”的折中选择。在 s 平面上等阻尼比线是一条从原点出发的射线。ζ 0.5 意味着闭环主导极点在第三象限极点的辐角为 120°也就是实部与虚部之比满足实部绝对值 ζ·ωn虚部 ωn·√(1-ζ²)。当 ζ 0.5 时极点可以写成s -0.5ωn ± j0.866ωn我们的任务是找这条射线与根轨迹的交点进而确定交点的 ωn 和 K。3.2 代入特征方程手算把 s -0.5ωn j0.866ωn 代入闭环特征方程 s³ 8s² 12s K 0。这里有个经典技巧先单独看虚部。因为 s 本身来自 120° 方向的点s³ 的辐角是 360°所以 s³ 是纯实数不贡献虚部。虚部只来自 8s² 和 12s。8s² 的虚部是 -8·0.866·ωn²12s 的虚部是 12·0.866·ωn。令虚部为零-6.928ωn² 10.392ωn 0解得 ωn 0 或 ωn 1.5。取非零解 ωn 1.5于是期望主导极点为 s -0.75 ± j1.299。再把实部凑起来。s³ 3.3758s² -9 - j15.58812s -9 j15.588虚部抵消后实部满足 3.375 - 9 - 9 K 0得到 K 14.625。如果你觉得手算麻烦也可以用 MATLAB 的 rlocfind 交互式选点先画根轨迹再用 sgrid(0.5, []) 画出阻尼线然后 rlocfind 在交点附近点击命令行会返回最近的增益 K 和闭环极点。实测下来点击结果与理论值 K 14.625 非常接近可以作为交叉验证。3.3 闭环极点与动态指标预判K 14.625 时把三个闭环极点都求出来主导极点-0.75 ± j1.299第三个极点-6.5三个极点之和必须等于特征方程一次项系数的相反数也就是 -8所以第三个极点一定是 -6.5。这个极点离虚轴的距离是主导极点实部绝对值的 8.67 倍按照主导极点法的经验它对动态响应的贡献基本可以忽略。于是系统等效成一个阻尼比 0.5、无阻尼自然频率 ωn 1.5 的二阶系统。理论指标如下性能指标数值超调量16.3%峰值时间2.42s调节时间2%误差带5.33s阶跃稳态误差0I型系统斜坡稳态误差约0.82注意斜坡稳态误差这一项。这个系统有一个积分环节所以是 I 型系统阶跃响应没有稳态误差但输入斜坡时速度误差系数 Kv K/12 14.625/12 ≈ 1.22稳态误差就是 1/Kv ≈ 0.82。这个误差偏大等会儿第五节会专门处理它。4. Simulink建模仿真全流程4.1 先从整体上想清楚模型结构在 Simulink 里搭建单位反馈闭环系统结构并不复杂输入信号经过求和点得到误差误差经过增益 K再进入被控对象传递函数输出反馈回求和点。写成信号流就是Step → Sum(±) → Gain → Transfer Fcn → Scope同时 Transfer Fcn 输出再反馈回 Sum 的负输入端。这个结构看起来简单但很多人第一次搭时会在反馈连接上出问题要么忘了把输出接回求和点要么把正负号设反要么把 Gain 放到了反馈通路上。统一建议增益和控制器全部放在前向通路反馈通路保持单位反馈。这样闭环传函正好是 K·G(s)/(1 K·G(s))与根轨迹计算一致。4.2 拖模块与参数设置新建一个 Simulink 模型从库浏览器里拖出以下模块路径我都标出来StepSimulink/Sources/Step默认终值 1够用SumSimulink/Math Operations/Sum双击把符号设为“±”表示输入为正、反馈为负GainSimulink/Math Operations/Gain增益值先填 1Transfer FcnSimulink/Continuous/Transfer Fcn分子填 [1]分母填 [1 8 12 0]ScopeSimulink/Sinks/Scope。模块之间用线连起来反馈线从 Transfer Fcn 的输出端拉到 Sum 的下端输入。连完以后我建议再拖一个 To Workspace 模块接到被控对象输出端变量名设为 y这样后面可以用命令行绘图方便批量对比。这里特别提醒一点Transfer Fcn 模块的分母系数必须按 s 降幂排列而且长度要一致。如果填成 [1 8 12]那相当于传函少了一个 s 因子根轨迹完全不同。你可以用 tf(1, [1 8 12 0]) 在 MATLAB 里验证模型里填的是同一个多项式。4.3 三组仿真对比K1、K14.625、K96先把 Gain 设为 K 14.625仿真时间设 20 秒求解器用默认的 ode45 变步长运行后 Scope 里应该看到超调约 16%、峰值时间约 2.4 秒、约 5.5 秒进入稳态带的阶跃响应。这个波形和理论预判基本吻合。为了体现根轨迹法的价值我建议再跑两组对比增益 K系统状态阶跃响应表现K 1三个负实极点过阻尼没有超调但响应极慢约 30 秒以后才慢慢接近终值K 14.625一对主导复极点 远离的实极点超调约 16%5.5 秒内稳定动态指标刚好K 96极点落在虚轴 ±j3.46输出等幅振荡不衰减K 1 那组仿真我把时间拉到 90 秒你会看到一个“慢吞吞”的爬升过程。这就是根轨迹图上 K 太小、主导极点太靠近虚轴的表现。K 96 那组理想线性系统会出现持续等幅振荡实际仿真里如果求解器误差稍微引入一点数值扰动波形可能微微发散但振荡特征非常明显。这说明临界增益附近的系统灵敏度极高工程上不会真的把增益设计在这个位置。有人可能会问为什么不在 Simulink 里直接看根轨迹的“极点移动”其实 Simulink 本身更擅长看时域波形根轨迹计算主要靠 MATLAB 命令行。正确的工作方式是MATLAB 算增益 → Simulink 验证波形两者交替进行。这样既发挥了根轨迹法的理论优势又用仿真确认了模型的闭环行为。4.4 用线性化工具验证闭环极点仿真波形只能看到“现象”如果想确认闭环极点是不是真的在理论位置可以用 linmod 对 Simulink 模型做线性化。前提是模型里只包含线性模块别加饱和、死区之类的非线性元件。[A, B, C, D] linmod(模型名); poles eig(A)把模型名换成你自己保存的名字运行后得到的特征值应该非常接近 -0.75 ± j1.299 和 -6.5。这个验证价值很大因为你可能搭错反馈极性或者填错分母而不自知时域波形碰巧还能看但极点位置对不上。线性化一验问题立刻暴露。5. 再进一步用滞后校正改善斜坡稳态误差5.1 先搞清楚为什么斜坡误差这么大比例增益设计到 K 14.625动态指标满足了但这个系统在斜坡输入下稳态误差约 0.82也就是说输入是 t 时输出长期落后输入约 0.82 个单位。对于很多随动系统来说这个误差不可接受。根轨迹法设计控制器到这里就到了关键分岔口如果只想改进动态指标可以上超前校正如果想改进稳态精度同时尽量不破坏已有的动态性能就上滞后校正。滞后校正的基本思想是在低频段提高开环增益在期望主导极点附近引入的相角滞后足够小小到几乎不影响动态特性。从根轨迹的角度看就是用一对距离原点很近、比值约 10 的零极点把低频增益抬上去但“绕开”主导极点附近的根轨迹形状。5.2 滞后校正零极点怎么选滞后校正器写成Gc(s) (s z) / (s p)其中 z 和 p 都是很小的正数且 z p。核心要求有两个第一z/p 的比值决定低频增益提升倍数一般取 5 到 10第二z 要放在离主导极点足够远的地方使校正器在主导极点处产生的相角滞后不超过 5°~10°。本例主导极点实部为 -0.75我把零点放在 z 0.2即实部的 1/3.75极点放在 p 0.02保证 z/p 10。验证一下相角影响。在期望主导极点 s0 -0.75 j1.299 处s0 0.2 的相角约 113°s0 0.02 的相角约 119.3°两者之差约 -6.3°。这个滞后量很小根轨迹在主导极点附近只会发生轻微偏移动态性能影响可以接受。如果零点和极点再靠近原点比如 z 0.1、p 0.01相角影响会更小但一般没有必要。按照根轨迹的幅值条件加入 Gc 后总增益需要重新计算。未校正时 K 14.625 满足 |K·G(s0)| 1现在多了一个幅值约 0.947 的校正器所以新的总增益约为 14.625 / 0.947 ≈ 15.45。这也提醒你滞后校正不是“挂上去就完事”增益要跟着幅值条件微调否则主导极点位置会漂。设计完成后速度误差系数 Kv 15.45 × 0.2 / (2 × 6 × 0.02) ≈ 12.87斜坡稳态误差降到 1/12.87 ≈ 0.078比原来的 0.82 改善了十倍左右。5.3 Simulink 里怎么把控制器加进去在原模型的基础上非常简单在 Gain 之后、被控对象 Transfer Fcn 之前再串一个 Transfer Fcn 模块作为控制器。控制器模块参数按顺序填Numerator[1 0.2]Denominator[1 0.02]然后把 Gain 的值从 14.625 改成 15.45。其余连线不用动反馈还是从被控对象输出端拉回 Sum 的负输入端。需要再强调一次模块串联顺序Step → Sum → Gain → Gc → G → Scope。如果把 Gain 和 Gc 顺序调换信号流相乘本身是交换的不影响结果但为了阅读模型时思路清晰建议统一把增益放在最前面控制器传递函数放后面。5.4 对比阶跃响应和斜坡响应加完滞后校正重新运行阶跃仿真你会发现响应波形和未加校正时几乎重合超调量、峰值时间变化很小。这就是滞后校正“以低频增益换稳态精度、不牺牲动态”的特点。接下来做斜坡测试。把输入源从 Step 换成 Sources 库里的 Ramp 模块斜率保持默认 1。为了看误差你可以把 Scope 直接接到 Sum 的输出端也就是误差信号 e r - y。仿真时间设 30 秒稳态后误差应该稳定在 0.078 左右。如果直接用被控对象输出和输入做差也能看到输出曲线与斜坡曲线基本平行但差一个固定小量。这里有一个实操小技巧在 Scope 里直接看误差刻度可能太小导致看起来是零。最好加一个 To Workspace 模块记录误差序列仿真结束后用 mean(e(end-100:end)) 取末端平均值这样得到的就是量化后的稳态误差。6. 常见问题与排查技巧实录6.1 根轨迹画出来和手算对不上最常见的原因是传递函数分母写错。在 MATLAB 里 tf(1, [1 8 12 0]) 和 Simulink 里 Denominator 填 [1 8 12 0]两者必须完全一致。如果分母少一个 0就是把积分环节丢了根轨迹形态会完全不同。另一个原因是变量类型问题Matlab 里同时存在多个同名变量时rlocus 可能画出旧变量的根轨迹建议每次计算前 clear 一遍相关变量或直接给变量换新名字。6.2 分离点解出两个根到底取哪个求导解分离点时经常会得到多个候选点。判断标准很简单先判断该点是否在实轴根轨迹段上再计算对应的 K 是否为正。本例中 s ≈ -0.91 在 [-2, 0] 区间内且对应 K ≈ 5.04保留s ≈ -4.42 虽然在 (-∞, -6] 区间外不对其实它在 -6 到 -2 之间而这个区间本来就不是根轨迹段所以弃掉。如果你不确定直接把候选点附近的 K 值符号算一遍K 为正且闭环有重根的位置才是真分离点。6.3 Simulink 仿真发散或者输出满屏振荡先看 K 是不是超过了临界增益 96。K 越大闭环极点越靠近虚轴只要越过虚轴系统就发散。把 Gain 模块挡住都能想到根轨迹图上你在虚轴右侧找不到任何 K 值因为根本不存在。如果 K 在 0 到 96 之间但仿真还是振荡得很厉害再检查求解器步长是否过大。建议把仿真步长上限设到 0.01 秒左右或者干脆用固定步长 ode4。6.4 仿真的超调、调节时间和理论算的不一样先别急着怀疑理论。三阶系统毕竟不是纯二阶系统第三个极点虽然离虚轴很远但多少会有影响。更常见的情况是你在 Simulink 里加了 Saturation 或 Rate Limiter非线性环节改变了系统行为。根轨迹法假设线性一旦加入这些模块理论值就只能当作参考。想验证理论先保持模型全线性确认波形一致后再加非线性。6.5 用 rlocfind 选点不准确rlocfind 要求你用鼠标点击根轨迹曲线附近误差来自手点位置。有一个技巧先用 sgrid 画出阻尼线然后用 zoom 放大交点区域点选“交点中心”返回值会更精确。如果你想完全避免手点就按照第五节的方式手算代入特征方程解出 ωn 和 K得到的是解析精确值。我把这些经验整理成一张速查表问题现象可能原因排查思路根轨迹形态和手算不一致分母多项式错误或变量被覆盖检查 tf 分母清空同名变量分离点多解把 K 为负的候选点误当真用实轴根轨迹段和 K 符号双重判断仿真发散增益超过临界值 96检查 Gain对照根轨迹与虚轴交点波形振荡剧烈但增益合法求解器步长过大限制步长上限或改用固定步长指标与理论差太多模型存在非线性环节先线性验证再加饱和/限幅7. 个人体会与可以继续扩展的方向根轨迹法这套流程走下来我最大的体会是它不是为了让你手算一堆公式而存在的。它其实是一种“可视化的系统思维”——开环增益怎么影响闭环极点极点在 s 平面上的位置又快慢、稳不稳这些事在根轨迹图上一目了然。相比直接调 PID 参数的黑盒思路根轨迹法至少告诉你你现在调的那个数把极点推到了哪里下一步该往哪推。如果你做完这个示例还想继续深入我建议沿着两条路走。一条是把比例控制换成 PID用根轨迹法分别分析比例、微分、积分环节对根轨迹形状的影响另一条是给被控对象加一个超前校正看看如何通过引入零点把根轨迹“拉”到更理想的区域。Simulink 里模块不用大改只是控制器块的 Numerator 和 Denominator 换一下就能继续玩下去。最后分享一个小习惯我在调系统时会把根轨迹图打印出来贴在旁边每改一个参数就在图上标一笔看极点往哪个方向动。这比反复看时域波形更直观。做控制器设计搞清楚“极点在哪儿”永远比“波形长什么样”更重要。