比例:永远差那么一点
最朴素的控制律:差得越多,用力越大。它简单、稳、快,而且有一个无法回避的毛病——它永远到不了目标。这个毛病不是实现上的疏忽,是这条控制律的定义直接推出来的,而理解它为什么必然发生,是理解下一个旋钮的前提。
一台设备:给它 1 份功率,最终温度升 1 度(增益 K = 1);它有 10 秒的惯性,没有延迟。
你用纯比例控制:控制量 = Kp × (目标 − 当前)。目标设成 1.0,从 0 开始。
把 Kp 设成 9。等它彻底稳下来之后,温度会停在哪?
如果你选了 A,请把「一直推到误差为零」这句话再读一遍,然后问:误差真的为零的那一刻,控制器的输出是多少?
一条一行的控制律
比例控制(proportional control,P)就一句话:
u = Kp × e 其中 e = r − y(目标 减 实际)
差得越多,用力越大;差得少了,就轻点。这条规则朴素到几乎不需要解释,而且它是你每天在做的事:车离前车远了多踩点油,近了松开;账上钱少了多接活,多了就歇歇。
它有三个真实的优点,不该被小看:
- 不会自己抖起来(在一级惯性对象上,第 4 章已经证过);
- 没有记忆——它不记得过去发生过什么,所以不存在「攒了一肚子火」这种事(第 15 章会告诉你有记忆的控制器有多能记仇);
- 快——误差一出现,输出立刻到位,没有任何积累过程。
然后是那个毛病。
为什么它必然差一点
先用一句话把它说穿,然后再算:
比例控制器要产生输出,就必须存在误差。误差归零的那一刻,它的输出也归零了。
想象那台加热器已经稳在目标温度上。稳住意味着它在持续散热,所以必须持续加热——阀门必须开着某个开度。而阀门开度 = Kp × 误差。要让开度不为零,误差就不能为零。
换句话说:那个残余的误差,就是它用来「养活」自己输出的东西。它不是没修好,它是必须留着这么多才能维持现状。
这个残余误差有个名字叫稳态误差(steady-state error,ess),而它的大小有一个极其简单的公式:
稳态时一切都不动了,所以:
# 稳态时,设备的输出 = 增益 × 输入
y = K · u
# 而控制器的输出 = Kp × 误差
u = Kp · (r − y)
# 代进去:
y = K · Kp · (r − y)
y (1 + K Kp) = K Kp · r
y = r · K Kp / (1 + K Kp)
# 所以误差:
e = r − y = r · [ 1 − K Kp/(1 + K Kp) ]
= r / (1 + K Kp)
★ 稳态误差 = 目标 / (1 + 回路增益)
K·Kp 这个乘积叫回路增益(loop gain):信号绕环走一圈被放大了多少倍。它是这本书里最重要的一个量之一,第 14 章那两把尺子量的都是它。
注意这个式子的形状:分母永远比分子大 1。所以稳态误差永远大于零,无论 Kp 多大。你只能让它越来越小,不能让它等于零。这是一条渐近线,不是一个可以够到的点。
这就是本章开头那题的答案:Kp = 9,K = 1,回路增益 9,稳态误差 = 1/(1+9) = 10.00%,温度停在 0.9000。
拖动下面的滑杆自己看。注意那条曲线:它单调爬升、不越线,然后停在一个不是 1.0 的地方。
整张表:
| Kp | 回路增益 | 稳态误差 | 最终停在 | 闭环时间常数 | 比开环快 |
|---|---|---|---|---|---|
| 0.5 | 0.5 | 66.67% | 0.3333 | 6.667 s | 1.5× |
| 1 | 1 | 50.00% | 0.5000 | 5.000 s | 2.0× |
| 2 | 2 | 33.33% | 0.6667 | 3.333 s | 3.0× |
| 4 | 4 | 20.00% | 0.8000 | 2.000 s | 5.0× |
| 9 | 9 | 10.00% | 0.9000 | 1.000 s | 10.0× |
| 19 | 19 | 5.00% | 0.9500 | 0.500 s | 20.0× |
| 49 | 49 | 2.00% | 0.9800 | 0.200 s | 50.0× |
| 99 | 99 | 1.00% | 0.9900 | 0.100 s | 100.0× |
这张表里有一件事值得单独指出:「误差小」和「反应快」是同一个旋钮控制的,而且是同一个倍数。回路增益 9,误差小十倍、响应也快十倍。它们不是两个可以分别调节的性能指标,它们是同一件事的两个说法。
这一点在后面会变得很重要:当你为了不振荡而降低增益时,你同时失去了精度和速度,没有办法只放弃一样。
比例控制的一切好坏,都由回路增益 K·Kp 这一个数决定:
- 稳态误差 =
1/(1+K·Kp) - 速度提升 =
(1+K·Kp)倍 - 抗扰动能力 = 扰动的影响被除以
(1+K·Kp)
三条全是「越大越好」。所以你自然会问:那到底是什么拦着我把它调大?
不是功耗,不是成本,不是执行器上限。是那个到卷 III 才登场的东西。而在此之前,第 6 章会先给你一个不用加大增益就能把稳态误差干掉的办法。
「比例带」:同一件事的另一种说法
如果你去看工业温控器或者老一点的资料,会看到一个叫比例带(proportional band,PB)的参数,单位是百分比。它就是 Kp 的倒数换了个说法:
PB = 100% / Kp # 读法:「误差要有多大,控制量才会从 0 走到满量程」 # PB = 10% ⇔ Kp = 10 —— 误差占量程 10% 时,阀门就全开了(很凶) # PB = 100% ⇔ Kp = 1 —— 误差要占满量程,阀门才全开(很温和) # PB → 0% ⇔ Kp → ∞ —— 退化成开关控制(第 16 章)
比例带的好处是它有物理直觉:「差 5 度阀门就全开」比「Kp = 20」好想象得多。见到它别慌,就是同一个旋钮。
老式抽水马桶的浮球。那是一个纯粹的机械比例控制器:水位越低,浮球越低,杠杆把进水阀开得越大。它也精确地表现出稳态误差——水永远停在略低于关闭点的位置,因为阀门要保持一丝丝开度才能补上漏掉的水。老马桶那种「一直细细地流」就是这么来的。
自动扩容的目标利用率。「目标 CPU 60%」这类规则,本质是比例控制。而如果你的扩容规则没有积分项,它就会稳定在一个不等于 60% 的值上——很多人以为是配置没生效,其实是 1/(1+K) 在起作用。
限速时的油门。没有巡航定速的时候,人靠比例控制维持车速:慢了多踩点,快了松一点。而上坡时你会发现车速稳定地比限速低一点点——你的脚也有稳态误差。人克服它的方式是「觉得不对劲就多踩一点」,那正是下一章的积分项。
这个直觉的错误在于它把「渐近趋近」当成了「可以达到」。1/(1+K) 这条曲线永远在零上方,你只是在花越来越大的代价买越来越小的改善:从 10% 压到 1%,回路增益要从 9 涨到 99——力气涨 11 倍,只换回 9 个百分点。
而这 11 倍力气是有代价的,只不过在这台理想的一级惯性设备上还看不见。等到第 9 章给它加上 2 秒延迟,你会发现回路增益连 8.5 都过不去——压到 1% 所需要的那个 99,从一开始就不在选项里。
这才是积分项真正的价值:它不是「另一种把误差调小的办法」,它是在你的增益预算被延迟卡死之后,唯一还能把稳态误差干到零的东西。
B温度停在 0.9000,稳态误差 10.00%。而且顺便:闭环时间常数从 10 秒变成 1.000 秒,快了整整 10 倍。
那个残余的 0.1 不是没修完,是必须留着:控制器靠它产生输出 0.9,而这台设备正需要 0.9 的输入才能维持在 0.9 度。误差、输出、温度三者互相咬合,一个都不能动。
A 「一直推到误差为零」——这是把比例控制器想成了一个有意志的东西。它没有意志,它只有一条乘法。误差真的为零时它的输出也是零,而输出为零时温度会掉下来——所以这个状态不可能是稳态。 C 「差一半」——这是 Kp = 1 时的答案(回路增益 1 → 误差 50%)。很多人对「增益」的直觉停在「乘以 1」附近,而这个式子是1/(1+K),不是 1/K,那个 +1 很关键:它是没有控制器时的基准。
D 「推过头九倍」——把开环增益和闭环行为搞混了。开环里给输入 9 确实会到 9;但闭环里温度一升起来,误差就变小,控制量随之变小。环会自己把自己拉住,这正是闭环和开环的根本区别。
这一章的一句话
比例控制靠误差活着,所以它绝不会把误差消灭干净——那个残余不是缺陷,是它维持现状的口粮。
下一章加上第二个旋钮,它专治这个毛病,而且治得非常彻底:只要积分增益大于零,不管多小,稳态误差都精确归零。代价是这个环从此有了记忆——而记忆会带来一样比例控制从来没有过的东西:过冲。你还会看到全书最漂亮的一次凑巧:一阶设备加 PI 控制,闭环恰好是那个标准的二阶系统,第 4 章那张阻尼比对照表可以直接套上去用。