控制设计这行,没有谁没在 MATLAB 里按过 F1。可我见过不少人,画根轨迹只会一句rlocus(sys),然后看着图问“这交点到底对应多大增益”“为什么轨迹少了一段”“能直接从图里读出阻尼比吗”。你如果肯把 rlocus 的帮助文档从头到尾读一遍,会发现官方文档写得并不长,但信息密度很高:它决定了你能否快速定位临界增益、判断极点移动方向、知道参数变化对稳定性的影响,以及用多大增益去换一个合理的阻尼比。
这篇内容的来源很直接:我用 DeepSeek 对 MATLAB 官方 rlocus 帮助文档做了一遍系统性翻译,再结合自己平时画根轨迹、调控制参数的实操经验做了一个整合版。翻译文档这件事,难点其实不在“英文到中文”,而在控制理论术语的一致性,以及函数名、参数名要不要保留原文。我会把这两个问题一起讲透。文中的代码都在常见 MATLAB 环境下跑过,例子全是自建的开环传递函数,不涉及具体项目背景,你拿去就能直接复现。
1. rlocus 到底在帮我们回答什么问题
1.1 根轨迹画的是闭环极点随增益移动的路径
先搞清楚一个最基本的概念:根轨迹不是“系统的响应曲线”,也不是“频率响应”,它画的是闭环极点随着某个增益参数变化而移动的轨迹。
一个典型单位负反馈系统,开环传递函数是 G(s),闭环特征方程写作:
1 + K * G(s) = 0
这里的 K 就是我们不断改变的增益。当 K 从 0 变化到无穷大的时候,闭环极点会在复平面上走出若干条曲线,这些曲线合起来就是根轨迹。闭环极点的位置决定了系统的稳定性、阻尼比、自然振荡频率,所以根轨迹图本质上是“一张增益变化下的稳定性地图”。
官方帮助文档的英文表述是 “rlocus computes the root locus of a specific SISO system”,这里 SISO 值得画个重点。rlocus 只针对单输入单输出系统,多输入多输出系统通常要先做通道拆分,或者用其他工具。文档没有把这个限制放进函数名里,但函数体内部明确要求 sys 必须是单输入单输出。我见过有人拿一个两输入两输出模型直接丢进 rlocus,结果报错,这就是没看 help 前几句话的代价。
1.2 帮助文档看起来平淡,信息量其实分四层
把 rlocus 的官方 help 完整读一遍,内容逻辑是清晰分层的:
第一层是语法层,告诉你这个函数怎么调用,有哪几种写法,有没有返回值。这也是大多数人最容易跳过的地方,但恰恰是这层决定了你能不能拿到数值结果,而不只是看一张图。
第二层是描述层,讲函数执行原理。文档会说明 rlocus 基于开环零极点计算闭环极点轨迹,会提到增益向量的生成逻辑。看懂这层,你才知道为什么默认绘图的增益点不是均匀分布的。
第三层是参数层,说明输入参数 sys 支持什么类型的数据,包括传递函数模型 tf、零极点增益模型 zpk、状态空间模型 ss,还包括离散系统。这个信息直接决定你手里的模型能不能直接用,需不需要先做转换。
第四层是提示与技巧层,官方会提醒你一些图形属性、坐标轴限制、以及配合 sgrid 或 zgrid 使用的方法。这一层通常比较短,但实战价值很高。
1.3 一张图上能读出四种关键信息
我把根轨迹图上的信息归纳成四类,这比单纯背相角条件、幅值条件更接近工程直觉:
第一,稳定性范围。只要根轨迹越过虚轴进入右半平面,系统就可能失稳。你能从根轨迹与虚轴的交点反推出临界增益,这是最常用的一项能力。
第二,阻尼特性。把代表等阻尼比和等自然频率的网格叠加到图上,轨迹与网格相交的位置就对应一组阻尼比和自然频率数据。你想要阻尼比等于 0.5,就在图上找那条网格线。
第三,极点运动方向。轨迹从开环极点出发,向开环零点或无穷远处移动。观察运动趋势,你能判断系统是快速趋于稳定,还是先冲向右半平面再折返。
第四,系统类型。轨迹的条数等于开环极点数,渐近线的角度和起点反映了系统阶次及开环极点分布。这个信息对设计校正环节很有用。
理解了这四层,再去看官方文档的细节,很多句子就变具体了。
2. 官方语法逐条拆解:五种常见调用方式
2.1 基本调用形式
官方文档列出的核心语法并不复杂,我整理成一张表,对应不同需求:
| 调用方式 | 用处 | 典型场景 |
|---|---|---|
rlocus(sys) | 绘制默认增益范围下的根轨迹 | 快速看图,分析稳定性趋势 |
rlocus(sys, k) | 用指定的增益向量 k 绘制 | 关注特定增益段的变化细节 |
rlocus(sys1, sys2, ...) | 多个系统绘制在同一张图 | 对比两种控制器结构 |
[r, kout] = rlocus(sys) | 返回闭环极点数组 r 和对应增益 kout | 需要定量分析,不只是看图 |
r = rlocus(sys, k) | 返回指定增益下的极点位置 | 精确获取某个增益下的极点 |
最基本的rlocus(sys)最省事,但它的默认增益向量是 MATLAB 根据系统自动生成的,范围能不能覆盖到临界增益,取决于分母多项式和零点位置。对于简单二阶系统通常没问题,但到了三阶四阶或含非最小相位零点的系统,自动增益范围经常不理想。这时候就要用第二种方式手动指定 k。
2.2 为什么要手动传入增益向量
手动传入增益向量 k 的价值在于“可控”。举个例子,一个三阶系统我关心的增益范围是 0 到 100,自动生成的 k 可能只画到 30,那么右半平面的轨迹就完全看不见。更让人困惑的是,自动增益是非均匀分布的,在轨迹变化剧烈的地方取点密,在变化平缓的地方取点疏,这种策略虽然绘图效率高,但当你需要把某个精确位置抠出来时,不够用。
手动指定 k 的做法很简单:
Klist = linspace(0, 100, 2000); rlocus(G, Klist);这样增益从 0 均匀切分到 100,共 2000 个点。点越多,轨迹越平滑,且不会漏掉关键转折。代价是计算量大一点,但对现代电脑来说基本可以忽略。
需要注意,k 的取值可以包含负数。增益不一定是正数,在某些工程场景下需要考虑负增益,比如某些执行器反向安装,或者控制方向会切换的系统。官方文档没有特殊说明这一点,但传入负数向量是合法行为,根轨迹会向左半平面或右半平面的对应方向展开。
2.3 返回值的正确打开方式
很多人的误区是:rlocus(sys)画完图就结束了,完全不用返回值。实际上,当你想量化“临界增益 K 大约等于多少”时,就要用带返回值的写法:
[r, kout] = rlocus(G);这里的 r 是闭环极点的位置数组,矩阵规模取决于系统阶数和增益点数量。kout 是与 r 相对应的增益向量。你可以在 kout 中找到临界增益附近的取值,再去 r 中找到对应的极点,判断它离虚轴有多远。
还有一种写法是只返回传入增益下的极点:
Ktest = 20.5; r = rlocus(G, Ktest);这个写法相当于“指定增益求极点”,很适合批量计算。我在做参数扫描时,经常把它放进 for 循环里,对一组增益值分别求闭环极点,然后统一判断稳定性,效率和准确性都远高于肉眼读图。
2.4 多系统同图对比
官方语法中还有一条rlocus(sys1, sys2, ...),允许同时传入多个系统。它会把不同系统的根轨迹画在同一张坐标图里,并用不同颜色区分。这个功能在比较“加入控制器前”和“加入控制器后”的轨迹差异时特别好用。
不过我建议你对比时明确记录每个颜色对应哪个系统。一旦图上有四五条轨迹交叉在一起,颜色就变成抢救性信息了。我的习惯是画完立刻执行legend,并把图例位置调到不遮挡轨迹的区域。
3. 完整实操:从一个开环模型到临界增益
3.1 搭建开环传递函数
下面用一个具体的三阶系统走完整流程。开环传递函数:
G(s) = 1 / [s(s + 2)(s + 4)]
这是一个典型的积分加两个惯性环节的模型,常用于模拟电机速度控制或简单机械系统的近似模型。在 MATLAB 里建立模型的方式很直接:
s = tf('s'); G = 1 / (s * (s + 2) * (s + 4));这里用tf('s')定义拉普拉斯变量 s,然后直接写出传递函数表达式。这种写法比tf([1], [1 6 8 0])直观得多,也方便后续修改参数。
你可以先用zpk(G)看一眼零极点形式:
zpk(G)结果会显示零极点增益模型:一个零点都没有,三个极点分别在 0、-2、-4。这正是根轨迹的出发点:三条轨迹分别从这三个极点出发,因为系统没有有限零点,所以随着增益增大,三条轨迹都趋向无穷远。
3.2 绘图并叠加等阻尼网格
执行:
figure; rlocus(G); sgrid;sgrid会在当前图上叠加等阻尼比线和等自然频率线,对应英文的 damping ratio 和 natural frequency。网格线不是装饰,它让你能直接在图上读出某个轨迹交点对应的阻尼比。
实际绘制效果中,能明显看到一条轨迹从原点出发,向右半平面弯曲,另外两条从 -2 和 -4 出发,在中途相向运动,最终在某个位置分离,再分别向上和向下延伸。这个“先汇合再分离”的位置就是分离点,英文叫 breakaway point。
3.3 计算临界增益的定量公式
要获得精确的临界增益,用肉眼在图上找交点是不够的。可以结合特征方程计算。
对于单位负反馈,闭环特征方程:
1 + K * G(s) = 0
代入 G(s),得到:
s^3 + 6s^2 + 8s + K = 0
设虚轴交点为 s = jω,代入:
(jω)^3 + 6(jω)^2 + 8(jω) + K = 0
实部和虚部分别为零。虚部方程:
-ω^3 + 8ω = 0
解得 ω = sqrt(8),约等于 2.828。代入实部方程:
-6 * 8 + K = 0
所以 K = 48。也就是说,当增益超过 48 时,闭环极点进入右半平面,系统由临界稳定变为不稳定。这个结果如果完全靠默认rlocus图去读,误差会很大,但如果配合手动增益向量,画出来后在交点附近放大,能看到轨迹在 K 接近 48 时正好压在虚轴的 ±2.828j 附近。
这条计算路径也解释了为什么帮助文档会建议你手动指定增益向量:默认增益点不会专门照顾虚轴交点,你放大图之后可能发现轨迹在交点附近断开了,实际就是增益点密度不够。
3.4 用 rlocfind 在图上直接选设计点
如果你不想手算,MATLAB 还提供了一个配套函数rlocfind,它和 rlocus 配合使用:
figure; rlocus(G); sgrid; [kpole, poles] = rlocfind(G);运行到rlocfind这一行时,命令行会提示你在根轨迹图上选择一个点。鼠标在图上点击目标位置后,MATLAB 会返回使闭环极点经过该点所需的增益,以及对应的全部极点位置。
我常用这个方法来选“阻尼比刚好等于 0.5”的设计点:先让sgrid把阻尼比 0.5 的射线画出来,然后在射线和根轨迹的交点附近点击,读出的增益就是满足阻尼比要求的设计增益。相比手动用数值搜索,速度快得多,而且能直观感受到轨迹对参数的敏感程度。
4. 读根轨迹时最容易翻车的四个细节
4.1 多回路系统不能直接套用单回路结论
rlocus 默认画的是单位负反馈下的闭环极点轨迹。如果你的系统不是单位负反馈,而是带有前置滤波器、前向通道和反馈通道都有独立传函的结构,直接调用 rlocus 画出的轨迹并不严格等于真实闭环极点轨迹。
正确的做法是把系统整体化简为一个等效开环传递函数,再调用 rlocus。例如反馈通道传函是 H(s),前向通道是 G(s),等效开环就是 G(s)H(s)。这个过程官方文档只给了很简略的说明,但它恰恰是实际工程里最常见的误用场景。
4.2 离散系统要配合 zgrid 而不是 sgrid
离散系统同样调用 rlocus,但结果画在 z 平面,而不是 s 平面。z 平面的稳定性边界是单位圆,等阻尼比和等自然频率的网格也不一样。如果继续用 sgrid,得到的是错误的网格参照。
离散系统建议使用:
rlocus(Gd); zgrid;zgrid 画出的网格以单位圆为界,等阻尼比线形和 s 平面明显不同,读图时不要混用。帮助文档里“离散系统”那一小段提过这一点,但很容易被忽略,因为大部分人的注意力都集中在连续系统上。
4.3 非最小相位系统和右半平面零点的误导
如果开环传递函数含有右半平面零点,根轨迹的形状会非常反直觉:某些增益范围内轨迹可能先向右半平面延伸,再折返回左半平面。单从相角条件看,这是完全正确的行为,但如果你按照“轨迹在右半平面就必然不稳定”的直觉去判断,就会得出错误结论。
更隐蔽的是,带有右半平面零点的系统即使闭环极点都在左半平面,也可能存在非最小相位引起的反向响应。根轨迹图上体现不出时域响应方向,所以不要用根轨迹图单独判断动态品质,它回答的是极点移动问题,不是阶跃响应方向问题。
遇到这种情况,我会额外画一下阶跃响应或者用 step 函数验证,而不是只看根轨迹。这个习惯帮我避免过好几次误判。
4.4 时滞系统要先做近似,再看轨迹
实际系统中经常存在纯延迟,例如传感器采样延迟、网络传输延迟。延迟在传递函数里表现为 e^(-τs),这是一个超越函数,不能直接参与多项式根轨迹运算。官方 rlocus 也不直接支持这种非线性项。
工程上常用的做法是用一阶或二阶帕德近似把延迟替换为有理传递函数,然后再画根轨迹。这样做会带来高频段的误差,但低频和中频段的主轨迹可信度较高。你在论文或设计报告中如果写了根轨迹图,必须注明这是经过延迟近似的模型,否则评审会直接质疑结果的准确性。
5. 常见问题速查与排查实录
5.1 根轨迹看起来缺了一条分支
最常见的原因是默认增益向量范围太窄,一部分轨迹在更大增益下才出现。我处理这类问题的方法很简单:把增益范围扩大到 0 到 10000,用对数或线性均匀分布都行,再看绘图结果。如果增益范围己经很大,但分支数仍然少于开环极点数,就要检查系统是否出现了零极点对消。
零极点对消是一个非常隐蔽的坑。MATLAB 在化简传递函数时可能会自动约掉完全相同的零极点,但浮点计算中“几乎相同”的零极点不会自动对消,绘图时就会多出一条非常接近坐标原点的小轨迹。这时根轨迹的条数会多于实际主导极点数,图面复杂但信息冗余。
建议在建模之前就主动检查:
minreal(G)把能够对消的零极点清理干净。
5.2 轨迹在关键位置断开不连续
轨迹断断续续,通常是增益取点不够密。默认 k 是自动选择的,虽然 MATLAB 在曲率大的地方会加密,但遇上分离点、虚轴交点这类敏感位置,还是容易漏点。解决方式就是手动指定更密的增益向量,比如从 0 到 100 取 5000 个点。
要注意,有些看似“断点”的地方其实是两条轨迹在数值上非常接近,但并未相交。放大图以后能看到中间有一条极细的间距。这时候不要强行认为轨迹交叉,而是应该核对对应极点是否真的重合。判断依据是看该处的增益向量是否只有一个对应值,还是出现了两个相同增益的极点。
5.3 rltool 和 sisotool 是更交互化的升级
官方 help 的末尾通常会引用相关工具,其中 rltool 和 sisotool 是交互式图形环境。它们可以让你拖动极点、调整增益、实时观察闭环响应,本质上是在 rlocus 的计算内核外面套了一层 GUI。
如果你只是画一张静态图,rlocus 足够。如果你要来回试探控制器参数,我建议直接打开 rltool,效率和直觉都好得多。注意,rltool 底层返回的数据和 rlocus 完全一致,不会出现“不同工具结果不同”的问题。
5.4 图例和线型混乱
当同图绘制多个系统时,线型颜色自动分配,但颜色循环顺序可能和你的预期不一致。为了避免认错曲线,建议画完立刻添加图例,并且自定义线型:
rlocus(G1, '-', G2, '--', G3, '-.'); legend('原系统', '加PD', '加PI');额外的小技巧是使用hold on和plot手动叠加你计算出的特定极点,用圆圈或叉号标出来,视觉上更直观。
6. help 文档翻译里的术语陷阱与提示词经验
6.1 用 DeepSeek 翻译 help 的正确姿势
我这次把 rlocus 的官方 help 交给 DeepSeek 翻译时,并不是直接复制粘贴然后等待结果。直接翻译的版本虽然通顺,但有两个问题:术语不一致,部分句子有过度补充。
后来我调整了提示词,采取下面这种结构化要求:
你是控制理论方向的技术文档翻译。请将以下英文帮助文档翻译成简体中文: 1. 函数名、参数名、变量名一律保留英文; 2. 数学表达式不要翻译,例如 s、K、jω 保持原样; 3. 控制术语使用国内教材通用译法,例如 root locus 翻译为根轨迹,damping ratio 翻译为阻尼比; 4. 不要增删内容,不要加解释性括号; 5. 段间保留原文编号。这里最关键的是第三条。国内教材里有些术语有多种译法,比如 natural frequency 有“自然频率”和“固有频率”两种常见表达,zpk 模型叫“零极点增益模型”。如果 AI 每段选用不同译法,读起来就会割裂。
6.2 典型术语对照,建议收藏
我整理了 rlocus 帮助文档中出现频率较高的一组术语对照:
| 英文 | 中文 | 说明 |
|---|---|---|
| root locus | 根轨迹 | 核心术语 |
| open-loop poles | 开环极点 | 起点 |
| open-loop zeros | 开环零点 | 终点或牵引方向 |
| closed-loop poles | 闭环极点 | 根轨迹上的点 |
| gain vector | 增益向量 | 参数 k |
| damping ratio | 阻尼比 | sgrid 等值线 |
| natural frequency | 自然频率 | 常译为固有频率,实际通用 |
| characteristic equation | 特征方程 | 闭环研究基础 |
| breakaway point | 分离点 | 多条轨迹相遇处 |
| asymptote | 渐近线 | 轨迹趋向无穷的角度 |
| SISO | 单输入单输出 | 系统类型限制 |
这些词在翻译时不能随意发挥。比如 root locus 有人会翻成“根本轨迹”,那就成外行了。
6.3 翻译后需要人工复核的句子类型
即使有了很好的提示词,AI 翻译结果仍然需要人工复核。我在这次实践中发现三类容易出错的地方。
第一类是以“if”“when”开头的条件句,AI 经常把“If sys is a SISO model”翻译成“如果系统是一个 SISO 模型”,这本意没问题,但控制术语中“系统”和“模型”并不完全等价。官方语境里 sys 是“模型对象”,翻译成“模型”更严谨。
第二类是关于返回参数的描述。英文里 “returns the closed-loop poles of sys” 直译是“返回系统的闭环极点”,但实际返回的并不是所有极点,而是当前增益向量对应的极点集合。翻译时应该补充“数组”或“集合”这类限定词,否则读者会误以为返回的是单一数值。
第三类是图形对象属性描述,例如 “marker”和“LineStyle”,这类属性名不能翻译,否则代码对不上。AI 容易把它们也中文化,这是最危险的一类错误。
6.4 你可以做一张自己的速查卡
我建议你基于翻译完成的 help 文档,做一张三列速查卡:第一列是语法,第二列是官方说明的中文摘要,第三列是你自己实验后的补充。这样日后再画根轨迹,不需要重新翻 help,直接看卡片就够了。
我的速查卡上是这么写的:
rlocus(sys):绘制默认增益范围根轨迹,先用来快速观察趋势。rlocus(sys, k):手动指定增益向量,适合精确观察交点。[r, kout] = rlocus(sys):返回极点矩阵和增益向量,用于定量分析。r = rlocus(sys, k):指定一组增益,返回对应极点。sgrid:画连续系统的等阻尼比和等自然频率网格。zgrid:画离散系统的单位圆及网格。
这张卡内容不多,但都是高频使用项,比重新翻一遍长文档快得多。
7. 最后说一点我自己实操中的体会
根轨迹这个工具,看着像是教科书里的经典内容,但在实际用的时候,我和身边人踩过的坑几乎都集中在默认参数和术语理解上。默认增益向量很好用,但你一旦需要精确定量结果,就必须主动指定增益范围;官方文档写得很规范,但初次阅读很容易漏掉 SISO 限制和离散系统网格这类关键细节。
我个人现在的习惯是:先rlocus(sys)快速看全局,再用手动增益向量把局部放大,最后用rlocfind或者特征方程计算拿到准确数值。整个流程下来,一张图加一组数,设计报告里既有视觉证据又有定量结论,足够让人信服。
还有一个小经验:如果你也打算把 help 文档用 DeepSeek 翻译成中文,记得把翻译结果当作“带批注的提纲”来用,不要当成可以无脑引用的最终版本。控制理论的术语体系相对稳定,但每个版本帮助文档的措辞和示例都会有细微差别,对照官方原文校准一遍再嵌入自己的笔记,才真正变成你自己的东西。
根轨迹的边际收益在于,你不需要背下所有规则,只需要在关键增益处把轨迹看清楚,系统的稳定性边界自然就浮出来了。画图的人常有,画完还能解释清楚增益与稳定性的,才算把 rlocus 用到位。