推出你测不到的那个量
上一章解决的是「反馈太慢」,这一章解决更根本的:你想控制的那个量根本没有传感器。办法是让模型去推——而这条思路顺手会给出一个漂亮到有点反直觉的结论:两个都不太准的说法,合起来可以比其中任何一个都准。
关于同一个量,你有两个说法:
说法一:10.0,不确定度 ±2.0(我按模型推的)
说法二:12.0,不确定度 ±1.0(我刚测到的)
两个说法的误差互相独立。把它们合成一个最好的估计,这个估计的不确定度是多少?
如果 C 让你觉得违反常识,那正好——它是这一章的支点。
先解决「测不到」
一个具体的场景:你要控制一个二阶系统(比如一根柔性臂、一个电机),你想同时用位置和速度做反馈(因为速度反馈就是第 7 章那个微分项,能提供阻尼)。但你只有一个位置编码器,没有测速传感器。
最朴素的办法是对位置求差分。而第 7 章已经告诉过你后果:差分会把噪声放大到不能用。
控制论的答案是观测器(observer),思路只有两句:
第一句:你有一个对象的模型。那就在计算机里跑一份这个模型——喂给它和真设备一样的控制量,让它自己算出「位置和速度现在应该是多少」。
第二句:模型一定会漂。所以拿模型算出的位置和真实测到的位置比一比,用这个差去纠正整个模型的状态——包括那个你测不到的速度。
关键在第二句:位置的误差携带着速度的信息。如果模型的位置一直比实际低,那多半是模型的速度估小了。所以「用位置的误差去修速度」不是猜,是模型结构告诉你的。
这就是一个反馈环——只不过它反馈的对象不是设备,是那个模型。所以前面十八章的全部工具在这里原样适用:它有自己的特征方程、自己的极点、自己的收敛速度。
# 观测器的误差动态(推导略,结论很干净): # 估计误差 = 真实状态 − 估计状态,它满足自己的微分方程, # 而这个方程的特征根**由你选的观测器增益决定**。 # 我们把它的两个极点放在 −4 和 −5,解出增益: l₁ = 8.6000 l₂ = 15.5600 误差特征多项式 = s² + 9 s + 20 = (s+4)(s+5) ✓ # 于是估计误差按 e^(−4t) 的速度衰减。验算一下: t = 0.5 s 速度真值 −0.43454 估计 +0.44826 误差 8.83e−1 t = 1.0 s 速度真值 −0.69388 估计 −0.50148 误差 1.92e−1 t = 2.0 s 速度真值 −0.63308 估计 −0.62921 误差 3.87e−3 t = 3.0 s 速度真值 −0.11249 估计 −0.11379 误差 1.30e−3 ★ 两秒之内,速度估计的误差压到了千分之四 —— 而这个量从头到尾**没有任何传感器测过它**。
观测器极点怎么选?一条通用的经验:比被控系统的极点快 2 到 5 倍。太慢,估计跟不上,反馈拿到的是过期信息(又回到第 17 章那个「晚」);太快,它对测量噪声的敏感度会急剧上升(又回到第 7 章那个求导放大噪声)。观测器的整定和控制器的整定是同一类权衡,同一套直觉。
然后是那个「比两个都准」
观测器有一个问题没回答:那个增益到底该多大?上面是我硬选了两个极点。有没有「最优」的选法?
有,前提是你愿意说清楚「模型有多不准」和「测量有多不准」。这就是卡尔曼滤波,而它的全部秘密只有三行。
你有两个关于同一件事的、误差互相独立的说法,各自带着自己的方差。最优的合成方式是:
1/σ² = 1/σ₁² + 1/σ₂² ← 精度(方差的倒数)直接相加 合成值 = ( m₁/σ₁² + m₂/σ₂² ) / (1/σ²) ← 按精度加权平均 # 代进本章开头那道题: 说法一:10.0 ± 2.0 (方差 4) 说法二:12.0 ± 1.0 (方差 1) 1/σ² = 1/4 + 1/1 = 1.25 → σ = 0.8944 合成 = (10/4 + 12/1) / 1.25 = 11.6000 权重 = 20.0% / 80.0% (谁更确定,谁说了算) ★ 合成后的 0.8944 比两个输入里更准的那个(1.0)**还小**。
为什么可以更准?因为你用上了两份独立的信息。测量说 12,模型说 10——模型虽然粗糙,但它确实排除了一些可能性(比如「真值是 20」)。把这份排除加进去,剩下的可能性就更窄了。
那个「1/σ² 直接相加」的形式值得记住,它就是信息可加的数学表达:方差的倒数在统计里正经叫「精度」(precision),而独立的信息,精度直接相加。
这条也说明了这个魔法的前提:两个误差必须独立。如果你的「模型」其实是拿同一个测量算出来的,那它没带来任何新信息,相加就是自欺欺人。「合成比单个更准」的现金价值,全部来自那个独立性假设。
卡尔曼滤波做的事,就是每一步都做一次这个合成:先用模型往前推一步(不确定度增大),再和新的测量合成一次(不确定度减小),如此往复。
| 估计方法 | RMSE | 说明 |
|---|---|---|
| 直接用原始读数 | 0.9778 | 就是测量噪声本身 |
| 卡尔曼滤波 | 0.2869 | 好了 3.41 倍 |
| 一路取平均 | 1.2917 | 比原始读数还差 |
那个「稳态卡尔曼增益」也有闭式解,可以验算:K∞ = 0.095125,而仿真跑 300 步之后收敛到的值是 0.095125——完全一致。这说明卡尔曼滤波最终会稳定在一个固定的增益上(如果模型和噪声统计不变的话)。这一点很实用:很多工程实现干脆直接用这个稳态增益,省掉每步更新协方差的计算,效果几乎一样。
那一行「比原始读数还差」
表格最后一行是这一章第二个重点,也是最容易被忽略的。
「一路取平均」是一个非常自然的降噪想法:读数有噪声,那就多读几次取平均嘛。而它在这里的表现比不做任何处理还糟(1.2917 vs 0.9778)。
原因很简单:真值一直在变,而平均值假设它不变。你把三十步前的读数和现在的读数一视同仁地平均,得到的是「过去三十步的平均真值」,而那不是你要的。
「滤波」这个词在工程语境里被约等于「平滑」——去掉毛刺、让曲线好看。而卡尔曼滤波的「滤波」是统计意义上的:给定所有历史观测,求当前状态的最优估计。
两者的差别就是上面那张表:平滑只需要知道「我想让曲线多平」,估计需要知道「这个量自己会变多快」。
那个「变多快」就是卡尔曼滤波里的过程噪声 q。它是这套东西里唯一需要你动脑子的参数,而它的含义非常具体:「在我下次测量之前,这个真值自己能漂多远?」
q设得太小 = 你告诉滤波器「这东西几乎不动」→ 它会过度相信历史,跟不上变化(就变成上面那个「一路取平均」)。q设得太大 = 你告诉滤波器「这东西乱蹦」→ 它会过度相信当前测量,等于没滤波。
整个卡尔曼滤波的调参,本质上就是回答一个问题:我的模型和我的传感器,哪个更值得信?而 q/r 这个比值就是你的答案。
手机的定位。GPS 精度几米、每秒一次,加速度计精度差但每秒几百次。单靠 GPS,你的位置会一跳一跳;单靠加速度计,误差会随时间累积到离谱。融合之后既平滑又不漂——这就是本章那个「1/σ² 相加」在你口袋里跑着。进隧道时 GPS 丢失,滤波器会完全依赖模型继续推算,出隧道时再被拉回来。
无传感器电机控制。便宜的电机不装编码器,靠测电流和电压、结合电机模型反推转子位置——这是一个观测器。省下的编码器成本乘以产量,是实打实的钱。
你对一件事的判断。「我原本以为要三天(±2 天),同事说他做过类似的,两天(±1 天)」——按本章的算法,你应该给出 2.2 天左右,而且你的不确定度比同事那个 ±1 天还小。前提是你俩的判断依据真的独立;如果你俩看的是同一份文档,那就没有这份收益。
「多个指标互相印证」。这句管理常识的数学版本就是本章。而它的前提同样是独立性:如果三个指标都是从同一份日志算出来的,那「互相印证」是幻觉——它们会一起错。
这一条和第 2 章那句「开环的精度上限是你对世界的了解」是同一件事,绕了十七章又回来了。观测器本质上是一个局部的开环:那些没有被测量修正的状态分量,全靠模型撑着。
所以正确的判断顺序是:
- 这个量是「可观测」的吗?——有一个严格的数学判据(可观测性,本书不展开)。直觉版本:如果两种不同的内部状态会产生完全相同的测量序列,那你永远分不出它们,任何观测器都无能为力。
- 我的模型误差有多大?模型错的那部分,会变成估计的系统性偏差,而滤波器不会报警——它会给你一个自信满满的错误答案。这是观测器最危险的失效模式:它不会说「我不知道」。
- 装一个传感器要多少钱?如果不贵,就装。一份真实的测量胜过一个漂亮的模型——而且它还能反过来验证你的模型对不对。
C±0.8944,比两个输入里更准的那个(±1.0)还小。合成值是 11.6000,两个说法的权重是 20.0% 和 80.0%。
算法只有一行:方差的倒数直接相加。1/4 + 1/1 = 1.25,开方取倒数就是 0.8944。而这条「信息可加」的性质,是整个卡尔曼滤波、整个传感器融合、乃至整个贝叶斯推断的地基。
这一章的一句话
模型能补上传感器测不到的部分,而两份独立的、都不太准的信息合起来,可以比其中任何一份都准——代价是你必须诚实地说出各自有多不准。
下一章是卷 V 的收尾,也是这本书里性价比最高的一个结构改动:在环里再套一个环。把扰动关在离它最近的那个内环里,同一个扰动造成的峰值偏差从 0.18337 变成 0.01736——小了 10.6 倍,累计误差小了 22.6 倍。而外环的控制器一个参数都没改。