不等错误发生
反馈有一个无法回避的结构性缺陷:它必须先看见误差才能动手。所以每一次扰动都必然先打进来一个坑,然后才被填上。前馈绕开了这件事——但它要付的钱,正好是第 2 章说过开环要付的那笔。这一章讲怎么让两者各出各的力。
一个整定良好的 PI 环,面对一个突然的扰动,峰值偏差是 0.1286(目标是 1.0)。
现在加上前馈:直接测量那个扰动,按模型算出需要多少补偿,不等误差出现就打进去。
问:如果你的前馈模型只有 50% 准(补偿量只算对了一半),配上原来那个反馈,峰值偏差会变成多少?
反馈的那道结构性伤口
先把问题说清楚。反馈环的工作流程是:
扰动来了 ──▶ 输出开始偏 ──▶ 传感器看见 ──▶ 控制器算 ──▶ 执行器动
└────────────┬────────────┘
在这段时间里,误差在不受控地长大
而这段时间**不可能为零**
这不是「反馈不够好」,这是反馈的定义决定的:它是一个基于误差工作的机制,所以它需要误差存在。「零误差控制」和「纯反馈」在逻辑上互斥。
而前馈的思路很直接:既然扰动是可以测量的,为什么要等它变成误差?
# 反馈:等它变成误差再修
┌──────────── 扰动 d
▼
目标 ─▶ ⊕ ─▶ [控制器] ─▶ [对象] ─┬─▶ 输出
▲(−) │
└──────── 测量 ◀──────────┘
# 前馈:直接从扰动那里抄近路,赶在它生效之前抵消掉
┌──── 扰动 d ────┐
▼ ▼
[前馈模型] (对象)
│ │
目标 ─▶ ⊕ ─▶ [控制器] ─▶ ⊕ ─▶ [对象] ─┬─▶ 输出
▲(−) │
└────────── 测量 ◀──────────────┘
★ 前馈那条路上**没有传感器反馈**,所以它不受第 11 章那条延迟律的约束,
也不会引起振荡 —— 它压根不是个环。
★ 代价:它的准确度完全等于你那个模型的准确度(第 2 章讲过的账)。
四种组合
| 做法 | 扰动后的峰值偏差 | 说明 |
|---|---|---|
| 什么都不做 | 0.5000 | 扰动原样打进来 |
| 只用反馈 | 0.1286 | 压掉 74%,但必须先挨一下 |
| 只用前馈(模型准) | 0.0183 | 比反馈好得多,但没人兜底 |
| 两个都用 | 0.0003 | 比纯反馈好 400 多倍 |
而模型不准时的情况才是重点:
| 前馈模型准确度 | 只用前馈 | 前馈 + 反馈 | 比纯反馈少 |
|---|---|---|---|
| 100% | 0.0183 | 0.0003 | 99.8% |
| 90% | 0.0500 | 0.0130 | 89.9% |
| 80% | 0.1000 | 0.0259 | 79.9% |
| 50% | 0.2500 | 0.0644 | 49.9% |
| 20% | 0.4000 | 0.1029 | 20.0% |
| 0% | 0.5000 | 0.1286 | 0.0% |
看最后一列:前馈的收益和它的准确度是线性的,而且没有下限惩罚。模型准 80%,就少 79.9% 的偏差;准 50%,就少 49.9%;准 0%(等于没做),就少 0% ——它退化成纯反馈,一分钱也不多亏。
再看中间那一列(只用前馈):模型准 100% 时它 0.0183,比纯反馈还好;模型准 80% 时就掉到 0.1000,和纯反馈差不多;准 50% 时 0.2500,比纯反馈差一倍。
两列对照,结论非常干净:前馈单干很脆,前馈配上反馈就变得很皮实。反馈在这个组合里的角色不是主力,是兜底——它负责收拾前馈没算对的那部分,而前馈算错多少,它就收拾多少。
所以那句可以带走的话是:前馈不需要准,只需要方向对。只要它把扰动的大部分削掉,剩下的交给反馈;而它就算完全失灵,你也不过是退回到没有它的状态。
什么时候值得做前馈
前馈不是白拿的。它需要三个条件,缺一不可:
- 那个扰动必须可测,而且要测得比它生效更早。这一条最常卡住:很多扰动你只有在它已经影响输出之后才知道——那样前馈就毫无意义了。
- 你得有一个模型,知道「这么大的扰动,需要多少补偿」。而这个模型可以很粗糙(见上表)。
- 补偿通道得比扰动通道快,至少不能慢太多。如果扰动 1 秒就影响输出,而你的补偿要 5 秒才生效,那前馈只是把一个坑变成一前一后两个坑。
条件 1 是关键的筛子。一个实用的判断法:问「这件事有没有一个先行指标」。
- 炉子的进料量——可测,而且在它影响炉温之前就知道。做前馈。
- 室外温度对空调负荷的影响——可测,天气预报还能给你几小时的提前量。做前馈。
- 电商的流量——大促时间是你自己定的,这是最强的前馈信号。预扩容就是前馈。
- 某台机器突然坏了——不可预测。只能靠反馈。
目标值前馈:一个几乎白拿的版本
还有一类前馈特别便宜,值得单独说:对「目标」做前馈。
当你把目标从 20 改成 25 时,你知道大致需要多大的控制量(u ≈ r/K)。与其让反馈从零开始一点点顶上去,不如直接把这个值加进去,让反馈只负责修剩下的那点差。
u = Kp·e + Ki·∫e dt + Kd·(de/dt) + r / K
└──┬──┘
目标值前馈(也叫「基准输出」)
# 好处:目标一变,控制量立刻跳到大致正确的位置,
# 反馈只需要修那个「大致」和「精确」之间的差。
# 代价:需要知道 K —— 而这是最容易辨识的一个参数。
★ 这一招在工业上叫「bias」或者「baseline」,
在机器人里叫「重力补偿」(先算出举住这个姿势需要多大力矩,
再让反馈修剩下的),在扩容里叫「按历史曲线预扩容」。
形式不同,是同一件事。
顺带一提:第 2 章那个「开环」,其实就是只有目标值前馈、没有反馈的极端情况。所以这一整章可以看成第 2 章的正面回答:开环和闭环不是二选一,把它们叠起来才是标准答案。
大促预扩容。零点开抢的流量是完全可预测的,所以没有任何理由等 CPU 涨上去再扩容。提前十分钟把机器开好,反馈环只负责应对「比预测多出来的那部分」。这是教科书级的前馈 + 反馈。而只靠自动扩容硬抗零点的团队,等于放弃了免费的信息。
汽车的变速箱降挡。好的自动变速箱会在你踩下油门的那一刻就降挡,而不是等车速掉下来。油门位置是驾驶员意图的先行指标——这是前馈。而更进一步的做法会读导航数据,在上坡前就提前降挡。
Smith 预估器。第 11 章提到过的那个专治延迟的结构,本质上是一种基于模型的前馈:控制器内部跑一个没有延迟的对象仿真,对着它做反馈,再用真实测量修正。它的脾气和本章这张表完全一致——模型准的时候效果惊人,模型错的时候比普通 PID 更糟。
你自己的日程。「等我觉得累了再休息」是纯反馈(而且传感器很慢)。「知道下周有个大项目,这周提前把小事清掉」是前馈。后者不需要你准确预测下周有多忙,只需要方向对。
这个直觉的错误在于它把前馈当成了替代反馈的东西——如果它要替代反馈,那它确实必须很准(因为没人兜底了)。但在「前馈 + 反馈」的组合里,前馈只是先削掉一大块,它出的错会被反馈原样接住。
所以正确的问法不是「我的模型够准吗」,而是:
- 这个扰动我提前知道吗?(这才是真正的门槛)
- 我能不能给出一个方向正确、数量级正确的补偿?(不需要精确,一个查表、一条经验公式、一个线性拟合都够)
两个「是」,就该做前馈。而如果你担心模型错了会闯祸,那张表已经回答了:模型准确度为 0 时,收益也是 0,但不是负数——它退化成纯反馈。(前提是反馈还在。千万别为了做前馈而关掉反馈,那就变成第 2 章那个 68.7% 的故事了。)
C约 0.064——正好压掉一半(精确值 0.0644,比纯反馈的 0.1286 少 49.9%)。
前馈的收益和准确度是线性的:准 80% 就少 79.9%,准 50% 就少 49.9%,准 0% 就少 0.0%。而且注意最后这一条——模型完全没用时,它不会把事情变得更糟,只是退化成纯反馈。
A 「模型错一半等于白做」——这是把前馈当成了「要么全对要么全错」的东西。而它做的是削减,削掉多少算多少。这也是为什么工程上常说「有个粗糙的前馈总比没有强」。 B 「大约 0.09」——方向对,但这个估计把「一半的效果」理解成了「从 0.1286 往 0.0003 走一半」。而实际的线性关系是在削减量上:削减量 = 准确度 × 全部可削减的量。所以准 50% 时剩下的是 0.1286 的一半。 D 「前馈会和反馈打架」——它们不会打架,因为它们在环里的位置不同:前馈是加在控制量上的一项,不进入反馈回路,所以它完全不影响稳定性(这一点值得单独记住)。前馈算多了,反馈就往回收一点;算少了,反馈就多补一点。它们是叠加关系,不是竞争关系。这一章的一句话
反馈必须先挨一下才能还手,而前馈可以先挡一下——它不需要挡得准,因为后面还站着反馈。
下一章处理一个更深的问题:如果你想控制的那个量根本测不到怎么办?比如你想控速度,但只有位置传感器。答案是用模型把它推出来——而更妙的是,同样的思路能让你把「一个不太准的模型」和「一个不太准的测量」合成一个比两者都准的估计。那个合成后的不确定度是 0.8944,而两个输入里更准的那个是 1.0。