Appearance
根轨迹法
概念
上一章把"某个 K 下系统怎么跑"算清楚了。但工程上的真问题是反过来的:K 到底该取多少? 如果每换一个 K 就把特征方程重解一遍,一个三阶系统试十次就是十次求根——这不叫设计,叫碰运气。
根轨迹法把这件事变成"一次画图、反复读数"。
一句话说清它是什么:根轨迹就是当开环增益从 0 增到 ∞ 时,闭环特征方程的根在 s 平面上扫出的那一组曲线。
为什么一条曲线能顶十次求根?因为闭环极点不是随便游走的——它们被开环零极点的位置死死拴住了:
这里 K 是单独拎出来的增益,G_{0}(s) 是把 K 摘掉之后的开环传递函数。式子右边是一个固定不变的 −1,这就逼出了两条硬性条件(下一节细讲)。关键在于:这两条条件只涉及开环零极点的位置和 K 的大小,与闭环极点的具体数值无关——所以可以不求根,直接把"根可能在哪"圈出来。
一张根轨迹图能回答四个问题:
| 想问的 | 在图上看哪里 |
|---|---|
| 这系统稳不稳? | 各分支有没有越过虚轴进入右半平面 |
| 这系统快不快、抖不抖? | 主导极点的实部(离虚轴多远)与阻尼比(与负实轴夹角) |
| 稳态误差够不够小? | 该点对应的 K 有多大(K 越大静差越小) |
| 加了校正环节会怎样? | 新零点/极点把轨迹往哪边拉 |
这一层回答了上一层什么问题:上一章是"给定 K 算响应",这一章把它反过来——"想让极点落在哪,K 该取多少、还能不能取到"。这就是从"分析"走向"设计"的第一步。
为什么不用死记硬背的公式去解高次方程:三阶以上没有通用求根公式,而根轨迹的每一条法则都是几何的——看零极点的位置就能画出来,这正是它在四五十年前(计算器都不普及的年代)被发明出来的理由。今天我们有计算机,但根轨迹给人的全局直觉仍然是数值求根替代不了的:它把"参数连续变化"这件事画成了一张图。
原理
一、两个条件:一个定"在不在",一个定"多大"
把 K G_{0}(s) 写成极坐标形式:
要它等于 -1(即模为 1、相角为 (2k+1)·180 度),必须同时满足:
| 条件 | 表达式 | 作用 |
|---|---|---|
| 幅值条件 | 模等于 1 | 定"这个点对应多大的 K" |
| 相角条件 | 相角等于 (2k+1)·180 度 | 定"这个点在不在轨迹上" |
两条条件的分工必须分清:
- 相角条件与
K无关(K是正数,只影响模不影响相角)——所以轨迹的形状完全由开环零极点的位置决定,K只决定"沿轨迹跑到哪一站"; - 幅值条件用来反算
K——点已经确定在轨迹上,把该点的模代进去就得到对应的增益。
把相角条件写成零极点连线的形式,就是它的实用形态:设开环极点为 p、零点为 z,则
即:所有零点指向该点的向量夹角之和,减去所有极点指向该点的向量夹角之和,必须是 180 度的奇数倍。
180 度根轨迹与 0 度根轨迹:上面这条是 K > 0 的情形(叫 180 度根轨迹,最常用)。如果 K < 0(正反馈),右边变成 2k·180 度,叫 0 度根轨迹,所有法则要对偶地改。本课程默认讲 K > 0,除非题目点明。
二、八条绘制法则
设开环传递函数有 n 个极点、m 个零点(n >= m),把它写成最简形式:
| # | 法则 | 具体做法 |
|---|---|---|
| 1 | 起点 | K = 0 时,轨迹从开环极点出发 |
| 2 | 终点 | K -> ∞ 时,m 条终止于开环零点,剩下的 n - m 条趋于无穷远 |
| 3 | 分支数与对称 | 共 max(n, m) 条分支,关于实轴对称(复根成对) |
| 4 | 实轴上的轨迹 | 实轴上某点的右侧实数零极点个数为奇数,该点就在轨迹上 |
| 5 | 渐近线 | n - m 条,角度为 (2k+1)·180/(n-m) 度,交于重心 sigma_a = (Σp − Σz)/(n−m) |
| 6 | 分离/会合点 | 解 dK/ds = 0,取其中满足相角条件(在实轴轨迹段上)的根 |
| 7 | 虚轴交点 | 令 s = jw 代入特征方程;或直接用劳斯表的临界条件 |
| 8 | 出射角/入射角 | 从复极点出发的切线方向 = 180 度 + Σ(零点夹角) − Σ(其他极点夹角);本例无复极点,此法则不适用 |
这八条里最值得反复练的是第 5、6、7 条,因为它们给出的是具体数字:渐近线定位、分离点定"轨迹什么时候拐弯"、虚轴交点定"稳定边界在哪"。
法则 4 的直觉解释:实轴上一点,如果它右边的实数极点(每个贡献 180 度)加实数零点(每个也贡献 180 度)是奇数个,这些 180 度加起来是 180 度的奇数倍,正好满足相角条件。所以判实轴段就是"从右往左数,遇到零极点翻一次"——像开关一样。
法则 6 里 dK/ds = 0 的来历:从特征方程解出 K = -1/G_{0}(s),分离点是"多个根重合"的地方,也就是 K 对 s 的导数为零(K 在极值处不再单调,根就挤在一起分不开)。对常见的 G_{0}(s) = 1/(s(s+1)(s+2)) 这类"只有极点"的情形,对 dK/ds = 0 化简后得到的就是 d/ds [分母多项式] = 0。
三、一个例子走完八条法则
取最常见的三阶对象(下一章、06-pid 还会反复用到它):
| 法则 | 结果 |
|---|---|
| 1. 起点 | K = 0 时根在 0、-1、-2 三个开环极点上 |
| 2. 终点 | 没有零点,n - m = 3 条分支全部趋于无穷远 |
| 3. 分支 | 3 条,关于实轴对称 |
| 4. 实轴段 | [-1, 0](右侧只有极点 0,1 个,奇数)与 (-∞, -2](右侧 3 个,奇数) |
| 5. 渐近线 | 3 条,角度 60 / 180 / 300 度,交点 sigma_a = (0-1-2)/3 = -1 |
| 6. 分离点 | 3s² + 6s + 2 = 0 得 s = -0.422650(在 [-1,0] 内)与 -1.577350(不在任何实轴段内,舍去);对应 K = 0.384900 |
| 7. 虚轴交点 | 劳斯表第一列含 (6-K)/3,临界 K = 6,此时特征根为 ± j·1.414214 |
| 8. 出射角 | 三个极点都在实轴上,无复极点,此法则不适用 |
结论一句话:K < 6 稳定;K = 6 临界等幅振荡(角频率 1.414214 rad/s);K > 6 有两个右半平面极点,发散。分离点 K = 0.384900 之前,三个根都是实根(过阻尼、无振荡);过了分离点,两个根变成共轭复根,开始振荡。
分离点 K 的求法(幅值条件的典型用法):把 s = -0.422650 代进 |s(s+1)(s+2)|:
|(-0.422650) · (0.577350) · (1.577350)| = 0.422650 × 0.577350 × 1.577350 = 0.384900注意两个 dK/ds = 0 的根算出来的 K 是同一个值 0.384900——因为它们是同一个方程的两个根,模当然相同;但只有落在实轴轨迹段上的那个才是分离点。另一个 -1.577350 落在 (-2, -1) 这一段,它右侧只有 -1 与 0 两个极点(偶数),不满足相角条件,必须舍去。"解出 dK/ds = 0 之后一定要用相角条件筛一遍"是这一节最常踩的坑。
四、从图上读三件事
根轨迹画出来不是终点,读图才是:
| 读什么 | 怎么看 | 对应性能指标 |
|---|---|---|
| 稳定性 | 分支是否越过虚轴;临界点对应的 K 就是稳定上限 | K_crit = 6 |
| 快慢 | 主导极点到虚轴的距离,即实部的绝对值 | 调节时间 ts ~ 3 / 实部绝对值(实部绝对值越大越快) |
| 振荡 | 极点与负实轴的夹角 beta,zeta = cos(beta) | 超调量(查上一章的表) |
"K 越大,静差越小,但越接近不稳定"是根轨迹揭示的核心矛盾:K 增大时极点整体向右上方跑(实部往正走、虚部往大走),稳态精度在改善,而阻尼在恶化。这条矛盾没有任何"更聪明的 K"能解决——只能靠改结构(加零点、加校正环节),这就引出下一节。
五、加零点与加极点:往哪边拉
改变开环零极点位置,等于改变轨迹的形状,这是校正的理论依据:
| 操作 | 对轨迹的作用 | 结果 |
|---|---|---|
| 增加开环零点 | 提供正相角,把轨迹往左拉;渐近线角度变陡(n - m 变小) | 稳定性变好、响应变快——这正是 PD 与微分的作用 |
| 增加开环极点 | 提供负相角,把轨迹往右拉;渐近线交点右移 | 稳定性变差、静差可能变小——这正是积分的作用 |
这句话把 06-pid 的三项提前解释完了:P 只是调幅度、不改善形状(只让极点在原轨迹上滑动);D 相当于加零点、把轨迹往左拉;I 相当于加极点、把轨迹往右拉。PID 整定的本质,就是在"往左拉"和"往右拉"之间找平衡。
示例
例 1:八条法则的数值结果
对应上一节那张表,G_{0}(s) = 1/(s(s+1)(s+2)):
text
渐近线 3 条,角度 60 / 180 / 300 度,交点 sigma_a = -1.000000
分离点 3s^2 + 6s + 2 = 0 -> s = -0.422650 / -1.577350
取在 [-1,0] 上的 -0.422650,K_breakaway = 0.384900
虚轴交点 劳斯表 (6-K)/3 -> 临界 K = 6,根为 ± j1.414214,w = 1.414214 rad/s
分离点处第三个极点 = -3 - 2×(-0.422650) = -2.154701核对第三个极点:三个根之和恒等于特征方程 s² 项系数的相反数,即恒为 -3。分离点是重根,占去 2 × (-0.422650),剩下的就是 -3 - 2×(-0.422650) = -2.154701。这个"根之和守恒"是最省事的验算手段,比重新解方程快得多。
例 2:若干 K 下的闭环极点
K | 闭环极点 | 状态 |
|---|---|---|
| 0.3849 | -2.154700, -0.422972, -0.422328 | 稳定(重根刚分开) |
| 1.0000 | -2.324718, -0.337641 ± 0.562280 j | 稳定(欠阻尼) |
| 6.0000 | -3.000000, ± 1.414214 j | 临界(等幅振荡) |
| 12.0000 | -3.434841, +0.217421 ± 1.856432 j | 不稳定 |
表里两处要专门看:
K = 0.3849的三个数:理论上分离点是重根-0.422650(两个根完全重合),但数值求根会把它拆成-0.422972与-0.422328两个很近的实根,误差约 3×10⁻⁴。这不是程序错了,而是重根附近的求根本身病态(重根处导数也为零,迭代收敛速度从二次退化成线性)。看到"两个几乎相同的根"就要意识到那里多半是重根。K = 12的那对复根实部是+0.217421(正数!),同时第三个实根跑到-3.434841。这就是"不稳定"在图上的样子:复极点已经越到虚轴右边去了。
例 3:K 增大时主导极点的走向
K | 主导极点实部 | 主导极点虚部 | 阻尼比 zeta |
|---|---|---|---|
| 0.1000 | -0.054351 | 0.000000 | 1.000000(实根) |
| 0.3849 | -0.422328 | 0.000000 | 1.000000(实根) |
| 1.0000 | -0.337641 | 0.562280 | 0.514802 |
| 3.0000 | -0.164150 | 1.046869 | 0.154908 |
| 6.0000 | +0.000000 | 1.414214 | -0.000000 |
| 12.0000 | +0.217421 | 1.856432 | -0.116322 |
这张表把"根轨迹为什么是曲线"讲透了:K 从 0.1 涨到 0.3849,主导极点从 -0.054351 往左跑到 -0.422328——这一段是"越靠近分离点越快";过分离点之后,K 继续增大,主导极点的实部反而从 -0.422328 一路向右退到 +0.217421——"加大增益反而变慢、最后变不稳定"。
所以"增益越大越快"是个危险的错觉:它只在分离点之前成立。先变快、后变慢、再过临界,这才是根轨迹给出的完整画面。
例 4:加一个开环零点会怎样
给 G_{0}(s) 乘上 (s + 0.5)(相当于加了一个 PD 环节):
K | 闭环极点 | 状态 |
|---|---|---|
| 1.00 | -1.396850 ± 0.687365 j, -0.206299 | 稳定 |
| 6.00 | -1.282050 ± 2.288811 j, -0.435900 | 稳定 |
| 12.00 | -1.265892 ± 3.348447 j, -0.468217 | 稳定 |
对照例 2 看:加了同一个零点之后,K = 6 与 K = 12 都稳定了(原系统 K = 6 已经是临界)。渐近线条数从 3 条降到 2 条,角度从 60/180/300 变成 ±90——零点把轨迹"往左拉"的效果,在图上就是渐近线不再有那条 0 度的水平分支。
代价也要看清:K = 12 时虚部从 1.856432 涨到 3.348447——振荡频率变高了。零点买来的是稳定性,付出的是"抖得更快"。这就是 D 环节的两面性,06-pid 会给出定量的整定方法。
例 5:C 实现——Durand-Kerner 法求闭环极点
根轨迹的画法本质是"对一串 K 反复求根",所以需要一个能一次求出全部复根的算法。这里用 Durand-Kerner 法(同时迭代、无需求导、对实系数多项式稳定收敛):
/* rootlocus.c —— 根轨迹:用 Durand-Kerner 法求闭环极点 */
/* 特征方程 s^3 + 3s^2 + 2s + K = 0,K 为开环增益 */
#include <stdio.h>
#include <math.h>
#include <complex.h>
#define NP 3 /* 多项式阶数 */
/* 多项式求值(系数从高次到低次),Horner 法 */
static double complex polyval(const double c[NP + 1], double complex x)
{
double complex r = 0.0 + 0.0 * I;
int i;
for (i = 0; i <= NP; i++)
r = r * x + c[i];
return r;
}
/* Durand-Kerner:同时迭代求全部复根 */
static void dk_roots(const double c[NP + 1], double complex z[NP], int iters)
{
double complex nz[NP];
int it, i, j;
for (i = 0; i < NP; i++) { /* 初值取 (0.4 + 0.9j)^k */
double complex base = 0.4 + 0.9 * I, acc = 1.0 + 0.0 * I;
for (j = 0; j < i; j++)
acc *= base;
z[i] = acc;
}
for (it = 0; it < iters; it++) {
for (i = 0; i < NP; i++) {
double complex den = 1.0 + 0.0 * I;
for (j = 0; j < NP; j++)
if (i != j)
den *= (z[i] - z[j]);
nz[i] = z[i] - polyval(c, z[i]) / den;
}
for (i = 0; i < NP; i++)
z[i] = nz[i];
}
}
/* 按实部符号判稳定性:有正实部=不稳定,有零实部=临界 */
static const char *verdict(const double complex z[NP])
{
int i, pos = 0, zero = 0;
for (i = 0; i < NP; i++) {
if (creal(z[i]) > 1e-6) pos = 1;
else if (creal(z[i]) > -1e-6) zero = 1;
}
if (pos) return "不稳定";
if (zero) return "临界";
return "稳定";
}
int main(void)
{
const double Ks[] = { 0.3849, 1.0, 6.0, 12.0 };
int nk = (int)(sizeof(Ks) / sizeof(Ks[0]));
int i;
printf("=== 闭环特征方程 s^3 + 3s^2 + 2s + K = 0 的根 ===\n");
for (i = 0; i < nk; i++) {
double c[NP + 1] = { 1.0, 3.0, 2.0, Ks[i] };
double complex z[NP];
dk_roots(c, z, 400);
printf(" K = %7.4f -> %+.6f%+.6fj, %+.6f%+.6fj, %+.6f%+.6fj [%s]\n",
Ks[i], creal(z[0]), cimag(z[0]), creal(z[1]), cimag(z[1]),
creal(z[2]), cimag(z[2]), verdict(z));
}
return 0;
}
c 本站为静态站,不提供在线运行;可复制到本地用 gcc / python 执行
预期输出:
=== 闭环特征方程 s^3 + 3s^2 + 2s + K = 0 的根 ===
K = 0.3849 -> -2.154700+0.000000j, -0.422972+0.000000j, -0.422328-0.000000j [稳定]
K = 1.0000 -> -2.324718+0.000000j, -0.337641-0.562280j, -0.337641+0.562280j [稳定]
K = 6.0000 -> -3.000000+0.000000j, +0.000000-1.414214j, +0.000000+1.414214j [临界]
K = 12.0000 -> -3.434841+0.000000j, +0.217421-1.856432j, +0.217421+1.856432j [不稳定]两个实现细节值得记住:
- 初值取
(0.4 + 0.9j)^k:这是 Durand-Kerner 的标准初值——0.4 + 0.9j的模约0.985,k次幂正好把n个初值均匀撒在一个圆上,互不重合,避免了"分母为零"的退化。若初值取成一样的,第一步就除以零。 - 迭代 400 次:重根附近收敛慢(线性收敛),所以迭代次数给得比一般情况多。这是本机无编译器、只做逐行人工审查的代码,其数值结果已用等价的 Python 实现(例 6)逐位核对。
例 6:Python——法则验算 + 轨迹采样 + 加零点对照
# 根轨迹:八条法则验算 + 若干 K 的闭环极点
import math
def polyval(c, x):
r = 0j
for a in c:
r = r * x + a
return r
def roots(coef, iters=400):
"""Durand-Kerner:求多项式全部复根(系数从高次到低次)"""
n = len(coef) - 1
z = [complex(0.4, 0.9) ** k for k in range(n)]
for _ in range(iters):
nz = []
for i in range(n):
den = 1 + 0j
for j in range(n):
if i != j:
den *= (z[i] - z[j])
nz.append(z[i] - polyval(coef, z[i]) / den)
z = nz
return z
print("=== 一、开环 G0(s) = 1/(s(s+1)(s+2)) 的三条关键数据 ===")
n, m = 3, 0
angs = sorted((2 * k + 1) * 180.0 / (n - m) for k in range(n - m))
print(f" 渐近线条数 n-m = {n - m},角度 = " + " / ".join(f"{a:.2f}" for a in angs) + " 度")
print(f" 渐近线交点 sigma_a = (0-1-2)/3 = {(0 - 1 - 2) / 3:.6f}")
b2, b1, b0 = 3.0, 6.0, 2.0
dd = b1 * b1 - 4 * b2 * b0
s1 = (-b1 + math.sqrt(dd)) / (2 * b2)
s2 = (-b1 - math.sqrt(dd)) / (2 * b2)
print(f" 分离点方程 3s^2+6s+2=0 -> s = {s1:.6f} 与 {s2:.6f}")
print(f" s1 处 |s(s+1)(s+2)| = {abs(s1 * (s1 + 1) * (s1 + 2)):.6f}")
print(f" s2 处 |s(s+1)(s+2)| = {abs(s2 * (s2 + 1) * (s2 + 2)):.6f}")
print(f" 只有 {s1:.6f} 落在实轴段 [-1, 0] 上 -> 分离点,K = {abs(s1 * (s1 + 1) * (s1 + 2)):.6f}")
print(f" 分离时第三个极点 = -3 - 2*{s1:.6f} = {-3 - 2 * s1:.6f}")
print("\n=== 二、虚轴交点(劳斯表临界条件)===")
print(" s^3 + 3s^2 + 2s + K = 0 的劳斯表第一列:1, 3, (6-K)/3, K")
print(f" 临界 K = 6,辅助方程 3s^2+6=0 -> s = +-j{math.sqrt(2):.6f}")
print(f" 此时振荡角频率 w = {math.sqrt(2):.6f} rad/s")
print("\n=== 三、若干 K 的闭环极点 ===")
def tag_of(r):
if all(z.real < -1e-6 for z in r):
return "稳定"
if any(z.real > 1e-6 for z in r):
return "不稳定"
return "临界"
for K in (0.3849, 1.0, 6.0, 12.0):
r = sorted(roots([1.0, 3.0, 2.0, K]), key=lambda z: (round(z.real, 6), round(z.imag, 6)))
txt = ", ".join(f"{z.real:+.6f}{z.imag:+.6f}j" for z in r)
print(f" K = {K:7.4f} -> {txt} [{tag_of(r)}]")
print("\n=== 四、沿轨迹采样:K 增大时主导极点的走向 ===")
print(" K 主导极点实部 主导极点虚部 阻尼比 zeta")
for K in (0.1, 0.3849, 1.0, 3.0, 6.0, 12.0):
r = sorted(roots([1.0, 3.0, 2.0, K]), key=lambda z: (round(z.real, 6), round(z.imag, 6)))
comp = [z for z in r if abs(z.imag) > 1e-9]
if comp:
z0 = comp[0]
print(f" {K:9.4f} {z0.real:+14.6f} {abs(z0.imag):14.6f} {-z0.real / abs(z0):12.6f}")
else:
z0 = max(r, key=lambda z: z.real)
print(f" {K:9.4f} {z0.real:+14.6f} {0.0:14.6f} {1.0:12.6f} (实根,无振荡)")
print("\n=== 五、加一个开环零点后(G0 乘 (s+0.5))===")
print(f" 渐近线条数变为 n-m = {3 - 1},角度 +-90 度,交点 (0-1-2+0.5)/2 = {(0 - 1 - 2 + 0.5) / 2:.6f}")
for K in (1.0, 6.0, 12.0):
r = sorted(roots([1.0, 3.0, 2.0 + K, 0.5 * K]), key=lambda z: (round(z.real, 6), round(z.imag, 6)))
txt = ", ".join(f"{z.real:+.6f}{z.imag:+.6f}j" for z in r)
print(f" K = {K:6.2f} -> {txt} [{tag_of(r)}]")
python 本站为静态站,不提供在线运行;可复制到本地用 gcc / python 执行
预期输出:
=== 一、开环 G0(s) = 1/(s(s+1)(s+2)) 的三条关键数据 ===
渐近线条数 n-m = 3,角度 = 60.00 / 180.00 / 300.00 度
渐近线交点 sigma_a = (0-1-2)/3 = -1.000000
分离点方程 3s^2+6s+2=0 -> s = -0.422650 与 -1.577350
s1 处 |s(s+1)(s+2)| = 0.384900
s2 处 |s(s+1)(s+2)| = 0.384900
只有 -0.422650 落在实轴段 [-1, 0] 上 -> 分离点,K = 0.384900
分离时第三个极点 = -3 - 2*-0.422650 = -2.154701
=== 二、虚轴交点(劳斯表临界条件)===
s^3 + 3s^2 + 2s + K = 0 的劳斯表第一列:1, 3, (6-K)/3, K
临界 K = 6,辅助方程 3s^2+6=0 -> s = +-j1.414214
此时振荡角频率 w = 1.414214 rad/s
=== 三、若干 K 的闭环极点 ===
K = 0.3849 -> -2.154700+0.000000j, -0.422972+0.000000j, -0.422328-0.000000j [稳定]
K = 1.0000 -> -2.324718+0.000000j, -0.337641-0.562280j, -0.337641+0.562280j [稳定]
K = 6.0000 -> -3.000000+0.000000j, +0.000000-1.414214j, +0.000000+1.414214j [临界]
K = 12.0000 -> -3.434841+0.000000j, +0.217421-1.856432j, +0.217421+1.856432j [不稳定]
=== 四、沿轨迹采样:K 增大时主导极点的走向 ===
K 主导极点实部 主导极点虚部 阻尼比 zeta
0.1000 -0.054351 0.000000 1.000000 (实根,无振荡)
0.3849 -0.422328 0.000000 1.000000 (实根,无振荡)
1.0000 -0.337641 0.562280 0.514802
3.0000 -0.164150 1.046869 0.154908
6.0000 +0.000000 1.414214 -0.000000
12.0000 +0.217421 1.856432 -0.116322
=== 五、加一个开环零点后(G0 乘 (s+0.5))===
渐近线条数变为 n-m = 2,角度 +-90 度,交点 (0-1-2+0.5)/2 = -1.250000
K = 1.00 -> -1.396850-0.687365j, -1.396850+0.687365j, -0.206299+0.000000j [稳定]
K = 6.00 -> -1.282050-2.288811j, -1.282050+2.288811j, -0.435900+0.000000j [稳定]
K = 12.00 -> -1.265892-3.348447j, -1.265892+3.348447j, -0.468217+0.000000j [稳定]第五段是这一章最有信息量的一段:K 从 1 涨到 12(12 倍),加了零点之后主导极点的实部几乎不动(-1.396850 -> -1.265892),而虚部翻了近 5 倍。零点把"快速性"锁住了,代价全记在"振荡频率"上——这就是用微分改善稳定性的定量代价。
注意 K = 6.0000 那行的阻尼比打印成 -0.000000:实部是个极小的负数(约 -1e-17),除以模之后带了个负号,纯粹是浮点符号残留,物理上就是 0(临界)。看到 -0.000000 这类输出要认出来是"零的负号",不要当成"负阻尼"。这条与例 2 里"重根被拆成两个近根"是同一类现象:数值方法的输出必须结合物理意义读,不能照抄。
考点
- 两个条件的地位:相角条件决定"点在不在轨迹上"(与
K无关),幅值条件决定"该点对应的K多大"。轨迹形状只看开环零极点位置。 - 八条法则必背:起点在开环极点、终于开环零点或无穷远、分支数
max(n,m)、实轴段"右侧奇数"、渐近线角度(2k+1)·180/(n-m)与交点(Σp−Σz)/(n−m)、分离点解dK/ds = 0、虚轴交点用劳斯表、出射角180 + Σ零点角 − Σ极点角。 - 分离点要筛:
dK/ds = 0的根必须再代回相角条件,只保留落在实轴轨迹段上的那个。 180度根轨迹(K > 0)与0度根轨迹(K < 0)是两套法则,别混。- 稳定边界就是虚轴交点:对
1/(s(s+1)(s+2))这个标准对象,临界K = 6、振荡频率1.414214 rad/s(与劳斯表a*b > c的结论一致:3×2 > 6临界)。 - "增益越大越快"只在分离点之前成立:过分离点后主导极点右移,先变快、后变慢、再过临界。
- 加零点往左拉(稳、快)、加极点往右拉(不稳):
D加零点、I加极点、P只调幅度——PID 三项的根轨迹解释。 - 易错:把
G_{0}(s)的K忘掉单独拎出来(K必须从G_{0}里剥离,否则相角条件不成立);用dK/ds = 0却不筛选;把根之和守恒记成"根之积守恒"(和守恒对应s²项系数,积对应常数项);把重根附近数值求根的两个近根当成真有两个不同的根。
小结
- 根轨迹 =
K从 0 到 ∞ 时闭环极点的轨迹,一次画图就能反复读K与性能的关系。 - 相角条件管形状、幅值条件管大小;形状只由开环零极点决定。
- 八条法则给出起点、终点、分支、实轴段、渐近线、分离点、虚轴交点、出射角。
- 对
1/(s(s+1)(s+2)):渐近线60/180/300度交于-1;分离点-0.422650(K = 0.384900);临界K = 6,振荡频率1.414214 rad/s。 - 主导极点先左移后右移——"加大增益越快越稳"是错觉。
- 加零点往左拉、加极点往右拉,这正是
D与I的作用机理。 - 数值求根在重根附近会退化:看到两个几乎相同的根,要想到重根。
回到主线:上一章给了"给定系统怎么算响应",这一章把它反过来——"让极点落在哪、K 该取多少"。它用的仍是 微积分 与 线性代数 里的复根与多项式,也是 嵌入式实时控制 中"调参到底在调什么"的几何解释。
但根轨迹只擅长"一个参数连续变化"的情形;一旦要同时比较几种不同结构、或者要直接读出"离不稳定还差多少",就得换个坐标系——把曲线搬到频率轴上去。
下一章引入频域分析:伯德图与奈奎斯特判据,它给出一条更硬的指标——稳定裕度。
下一篇:频域分析:伯德图、奈奎斯特判据
评论(0)
当前浏览器不允许本地存储,评论无法保存。
还没有评论,来说两句。