一、江口三十里,报错一尺就要翻船

沧浪江出海的地方,横着一道叫"铁砂梁"的暗沙。

潮满的时候,梁顶盖着一丈二尺水,千石的粮船昂着头就过去了。潮落的时候,梁顶只剩三尺,连舢板都要蹭底。

所以江口立着一座望江楼,楼里养着报潮人。

报潮人的活儿只有一件:每隔一刻钟,敲一次锣,报出此刻铁砂梁上的水深。船老大在下游十里的湾子里等锣声,听见"一丈以上"就起锚,听见"八尺以下"就抛锚。

这活儿听着简单,其实凶险。

报高了,船撞沙梁;报低了,船白等一天,货就烂在舱里。楼里的老规矩是:报错一尺,赔一船;连错三次,摘牌走人。

望江楼的当家报潮人姓周,叫周敬亭,做了三十一年。楼上跟着两个得力的:

一个是水漏匠陈九,管着楼里那台铜壶滴漏和一本《潮汐历》。

一个是瞭望的伙计阿贵,眼睛毒,能在三里外看清江心那根石柱上的刻痕。

还有一个新来的小徒弟,叫阿沅,十七岁,什么都不会,就会问。

那年七月,陈九和阿贵吵了一架。

起因是初九那天,午时三刻该报潮。

陈九扒着他那本历书算:初九、上弦、午时,按往年的账,此刻梁上该是九尺四寸。

阿贵趴在窗口看石柱:水线卡在"八尺七"那道刻痕上,一动不动。

差了七寸。

"你那破历书是三十年前修的。"阿贵说,"江床年年淤,水位年年变,你算的是三十年前的江。"

"你那眼睛才靠不住。"陈九不服,"今天东南风六级,浪头一涌一尺高,你看见的是浪尖还是浪谷?你自己说得清吗?"

阿沅在旁边听傻了。他跑去问周敬亭:

"师父,到底该听谁的?"

周敬亭正在擦锣,头也不抬:"他俩说的都对。"

"那不成了都不能信?"

"是啊。"老人把锣擦亮了,"都不能信。"

那天午时三刻,周敬亭最后报了"九尺整"。

没人知道这个数是怎么来的。陈九说九尺四,阿贵说八尺七,师父报了个九尺整——不高不低,卡在中间。

当天下午,三条粮船顺顺当当过了梁。

阿沅追着问了三天,周敬亭都不说。直到第四天夜里,老人把他叫到楼顶,指着黑黢黢的江面问:

"你说,报潮报的是什么?"

"报水深啊。"

"错。"周敬亭摇头,"报的是你觉得水有多深,以及你有多相信自己这个觉得。"

阿沅没听懂。

二、老周说,先给"心里没底"记上一笔账

第二天,周敬亭把陈九和阿贵一起叫到桌前,摊开一张空白的账页。

"从今天起,楼里改规矩。"他说,"报潮的时候,不光报尺寸,还要报一个数——心里有多少底。"

"啥叫心里有多少底?"阿贵问。

老人在纸上写下两行字:

今日午时,估水深 九尺整
心里的谱:上下不超过 三寸

"意思是,我认为水是九尺,但我知道我可能错,错也错不过三寸。这个'三寸',就叫。"

陈九皱眉:"报个虚数有什么用?船老大要的是实数。"

"用处大了。"周敬亭把毛笔搁下,"你们俩为什么吵?因为你俩都只报数,不报谱。你说九尺四,他说八尺七,听着像两个人打架。可要是——"

他在纸上又添两行:

陈九:九尺四寸,谱是 上下八寸
阿贵:八尺七寸,谱是 上下三寸

"这就不是打架了,这是两份深浅不同的把握。"

阿沅眼睛亮了一下:"师父的意思是,谁的谱紧,就多听谁的?"

"往下说。"

"陈师傅的谱是八寸,阿贵哥的谱是三寸,阿贵哥更有把握,所以……所以该往阿贵哥那边靠?"

"靠多少?"

阿沅卡住了。

周敬亭在纸上画了一杆秤。

"不是挑一个,是。掺的比例,就按谱来定——谁的谱松,谁的分量就轻。"

他写出楼里第一条新规矩:

两个数掺一块儿,各占几成,看各自的谱有多紧。
陈九谱松(八寸),占三成;阿贵谱紧(三寸),占七成。
九尺四 × 三成 + 八尺七 × 七成 = 八尺九寸一分。

陈九盯着这个数看了半天:"那……那天你报九尺整,是这么来的?"

"差不多。"周敬亭说,"我心里估的,跟这个数只差九分。"

三、推的账会越推越虚,看的眼却看不穿雾

新规矩推行了半个月,出了岔子。

七月廿三,江上起大雾。三里外的石柱,阿贵一点也看不见了。

"看不见就报不了。"阿贵急得直搓手。

"看不见就不报了?"周敬亭反问,"船在下游等着呢。"

"那只能听陈师傅的推算了。"

"对,只能推。"老人点头,"但推有推的毛病,你们得先明白毛病在哪儿。"

他让陈九把这半个月的账翻出来,摊了一桌子。

"陈九,你告诉阿沅,你是怎么推的?"

陈九说:"我看上一刻报的是多少,再按历书上这个时辰该涨该落多少,加减一下,就是这一刻的数。"

"那要是上一刻你就报偏了三寸呢?"

"那这一刻还是偏三寸。"

"要是这一刻的历书本身也不准,又添了两寸偏差呢?"

陈九脸色变了:"那……那就偏五寸了。"

"再推一刻呢?"

"七寸……八寸……"陈九声音越来越低,"越推越离谱。"

周敬亭在账页上重重画了一笔:

只靠推,谱会一刻比一刻松。每推一次,就往谱上添一份新的虚。

"这就是雾天最怕的事。"老人说,"不是推不出数,是推得出数,却越来越不敢信。"

阿沅忽然问:"那雾散了呢?"

"雾散了,阿贵一眼看过去——"周敬亭笑了,"石柱明明白白摆在那儿。他那一眼的谱是三寸,我们推了三天,谱已经松到两尺开外。这时候按规矩掺,阿贵占九成九,我们那三天的推算,只占一丝丝。"

"那不等于我们白推了三天?"

"不白推。"老人摇头,"雾里的三天,船老大手里有数可用。虽然虚,但比什么都没有强。要紧的是我们自己知道它虚——所以雾一散,我们二话不说就认阿贵的。要是我们不记谱,推了三天还觉得自己算得挺准,那才是要出人命的。"

也是在那天,周敬亭补了第二条规矩:

一、只推不看的时候,往谱上加一份虚。推得越久,谱越松。
二、看一眼之后,把新看到的和推出来的掺一掺,掺完,谱要收紧。

阿沅一边抄一边嘀咕:"看一眼,谱就紧一点……"

"对。"老人说,"每看一眼,你就赚回来一点底气。"

四、石柱被撞歪的那七天

七月末,来了真正的考验。

一条运石料的驳船在夜里失控,撞上了江心那根量水石柱。柱子没断,但歪了——整根往下沉了一尺一寸。

没人知道。

第二天一早,阿贵照常瞭望,报:"水深一丈零一寸。"

周敬亭愣了一下。按推算,此刻应该是九尺左右。差了一尺。

按规矩,阿贵的谱紧,该多听他的。掺完是九尺八。

老人报了九尺八。

下午,一条船撞了梁。

楼里炸了锅。

"是我看错了!"阿贵脸都白了。

"你没看错。"周敬亭把他按回椅子上,"你看得清清楚楚。是柱子错了。"

陈九急道:"那怎么办?规矩里没写柱子会歪啊!"

老人沉默了很久,才说:

"规矩里有。只是你们没读到底。"

他翻开账本最后一页:

掺完之后,还要记一笔:你估的,和你看到的,差了多少。

"这一笔叫差账。"周敬亭说,"平时它应该忽大忽小、时正时负,像风一样没定准。可从昨天早上起——"

他把这两天的差账摊开:

卯时:差 一尺整(看到的比估的高)
辰时:差 九寸八(高)
巳时:差 一尺零二(高)
午时:差 九寸九(高)

"看出门道了吗?"

阿沅倒吸一口气:"全是高的!一次都没往低了差!"

"对。"老人一字一句,"风是没定准的,可这不是风。这是有人在秤上做了手脚。"

"差账要是一直往一边倒,那说明错的不是你估的,也不是你看的,是你量东西的那把尺。"

当天下午,周敬亭派人划船去江心,发现了那根歪柱。

后来那七天,楼里是这么过的:

石柱重新立正之前,阿贵每报一个数,先减去一尺一寸,再交给周敬亭掺。同时,阿贵的谱从三寸放宽到八寸——因为谁也不敢保证柱子只歪了一尺一寸,说不定还在慢慢沉。

"谱一放宽,"陈九琢磨过来了,"我的推算就占分量了。"

"对。"周敬亭点头,"眼睛靠不住的时候,就多信推算;推算靠不住的时候,就多信眼睛。谁都靠不住的时候,就把谱放松,让下游的船宁可多等一刻。"

七天后柱子扶正,一切照旧。

那年入冬,周敬亭把牌子交给了阿沅。

交接那天,老人只讲了三句话:

"一,别指望有一个法子是准的。推的会漂,看的会花,两个都不干净。"

"二,把'我有多不准'当成正经事记下来,它比那个数本身还金贵。"

"三,两个不准的东西掺在一起,会比任何一个单独用都准——前提是你老老实实知道各自不准在哪儿。"

阿沅问了最后一个问题:"师父,做这行三十一年,最要紧的是什么?"

周敬亭望着江面,江上起了薄雾,石柱若隐若现。

"报得准的,从来不是眼睛最尖的那个,而是最清楚自己哪儿不准的那个。"

技术解读

1960 年,匈牙利裔美国工程师 Rudolf E. Kálmán 在《Journal of Basic Engineering》上发表了《A New Approach to Linear Filtering and Prediction Problems》。这篇论文提出的递推算法,后来被命名为卡尔曼滤波(Kalman Filter),并在 1960 年代被 NASA 艾姆斯研究中心采用,成为阿波罗登月飞船导航计算机的核心——那台只有 4KB 内存的计算机,靠它把惯性测量单元的推算和星敏感器的观测融合起来,把飞船送上了月球。

卡尔曼滤波要解决的问题,正是望江楼的问题:你想知道一个看不见的真实状态,手上却只有两样都不可靠的东西——一个会漂移的物理模型,和一个带噪声的传感器。

它的答案不是"选一个更好的",而是按各自的不确定度加权融合,并把不确定度本身也一起递推下去

核心概念回顾

概念 通俗解释
状态(State) 你真正想知道但看不见的量,比如水深、位置、速度
状态估计 x̂ 你对状态的当前最佳猜测——报出去的那个数
误差协方差 P 你对这个猜测的"不确定度",即故事里的"谱"。P 越小越有把握
预测步(Predict) 用运动模型从上一时刻推到这一时刻,不看传感器
更新步(Update) 拿到新观测后,修正预测值,也修正不确定度
过程噪声 Q 模型本身不完美带来的误差,每预测一次就往 P 上加一份
观测噪声 R 传感器本身的误差水平,风浪大就调大
卡尔曼增益 K 融合时观测占的权重,K = P / (P + R)
新息(Innovation) 实测值减去预测值的差,即故事里的"差账"
新息白化检验 新息应当零均值、无偏;若持续同号,说明模型或传感器有系统偏差
滤波器发散 长期无观测或 Q/R 设错,导致 P 失真、估计彻底跑偏
最优线性无偏估计 在线性高斯假设下,卡尔曼滤波是方差最小的估计,没有更好的线性方案

故事中的隐喻对照

故事元素 映射的技术概念 解释
铁砂梁上的真实水深 真实状态 x 永远无法直接得知,只能估计
报出去的那个尺寸 状态估计 x̂ 系统对外输出的最佳猜测
"心里有多少底"(谱) 误差协方差 P 对自身估计精度的量化,是滤波的另一半输出
陈九的铜壶滴漏 + 潮汐历 状态转移模型 F 用先验规律从上一时刻外推
陈九"上一刻偏三寸,这一刻还偏三寸" 误差随预测传播 P⁻ = FPFᵀ + Q,误差被模型带到下一步
"历书本身也不准,又添两寸" 过程噪声 Q 模型不完美,每步注入新的不确定度
阿贵瞭望石柱刻度 观测 z 带噪声的直接测量
"东南风六级,看的是浪尖还是浪谷" 观测噪声 R 传感器读数的随机误差
谱松的占三成、谱紧的占七成 卡尔曼增益 K = P⁻/(P⁻+R) 权重由双方不确定度之比决定
掺出来的八尺九寸一分 后验估计 x̂ = x̂⁻ + K(z − x̂⁻) 预测值 + 增益 × 新息
"掺完,谱要收紧" P = (1 − K)P⁻ 每次观测都降低不确定度
大雾三天只能推算 纯预测阶段(观测缺失) 只走 Predict,P 单调增大
"推了三天,谱松到两尺开外" P 随时间累积膨胀 无观测时不确定度无界增长
雾散后阿贵占九成九 P ≫ R 时 K → 1 不确定度极大时,几乎完全采信观测
"虽然虚,但比什么都没有强" 预测的工程价值 传感器失效期间仍能输出可用估计
石柱被撞沉一尺一寸 传感器系统性偏差(bias) 违反零均值假设,超出标准 KF 处理范围
差账连续四次全为正 新息序列非白 新息检验是诊断滤波器失配的标准手段
"风是没定准的,可这不是风" 随机误差 vs 系统误差 前者可被融合抵消,后者只能建模或标定
观测值统一减一尺一寸 偏差补偿 / 状态增广 把 bias 标定掉,或将其扩为待估状态
把阿贵的谱从三寸放宽到八寸 自适应调大 R 传感器可信度下降时降低其权重
"宁可让船多等一刻" 保守估计与安全裕度 不确定度大时输出更宽的置信区间

为什么这个故事对应卡尔曼滤波?

  1. 两个信息源都不可靠,却都不能丢。 陈九的推算会累积漂移(模型误差),阿贵的目测会被风浪扰动(观测噪声)。经典卡尔曼滤波的前提正是:既有一个不完美的动力学模型,又有一个带噪的观测通道,二者信息互补——模型给出连续性,观测给出真值锚定。

  2. 融合权重由不确定度决定,而不是由人拍脑袋。 卡尔曼增益 K = P⁻/(P⁻+R) 是从"最小化后验方差"推导出的最优解。故事里"谱松的占三成、谱紧的占七成",就是这条公式的白话版本——它不是经验比例,是数学上唯一最优的比例。

  3. 不确定度必须被显式追踪,它是算法的第二个状态量。 周敬亭改的规矩里最关键的一条,是"报数的同时报谱"。卡尔曼滤波真正区别于简单加权平均的地方,就在于它同时递推 x̂ 和 P:P 在预测步膨胀(+Q),在更新步收缩(×(1−K)),构成一个自我调节的闭环。

  4. 预测与更新的交替,正是滤波的心跳。 大雾三天只走预测、P 单调增大;雾散后一次观测就把 P 拉回来——这就是 Predict-Update 循环的完整写照。传感器采样率低、偶发丢帧时,滤波器依然能输出估计,正是它在导航、雷达跟踪、机器人定位中不可替代的原因。

  5. 新息序列是滤波器的体检报告。 石柱歪掉后,差账连续四次同号——这在统计上属于新息不再白化。工程实践中,新息一致性检验(NIS/NEES)是判断滤波器是否失配的标准手段:随机误差应当正负交替、零均值,一旦持续偏向一侧,问题必然出在模型或传感器标定,而不在融合算法本身。

  6. 系统性偏差不是滤波能自动消化的东西。 标准卡尔曼滤波假设噪声零均值,石柱下沉这类恒定偏差会直接把估计带偏。工程上的两条路,故事里都给了:一是离线标定后补偿(每次读数减一尺一寸),二是状态增广(把 bias 本身作为待估状态一起递推)。同时调大 R,则是自适应滤波的降权策略。

  7. 它是最优的,但只在自己的假设里最优。 在线性系统 + 高斯白噪声的前提下,卡尔曼滤波是方差最小的线性无偏估计,没有更好的线性方案。可一旦假设被打破——非线性(要用 EKF/UKF)、非高斯(要用粒子滤波)、有偏(要标定)——它就会安静地给出一个错误答案。这也是为什么"知道自己哪儿不准",比"算得多准"更重要。

后记:卡尔曼滤波被称为二十世纪最重要的算法之一,从阿波罗飞船到手机里的计步器,从雷达跟踪到自动驾驶的多传感器融合,它无处不在。它的深刻之处,不在于那几行矩阵递推,而在于它对"知识"的态度——任何一个数,如果不附带它的不确定度,就是一个危险的数。它教会工程系统一件人类常常做不到的事:诚实地承认自己有多不确定,并且让这份诚实参与决策。

江上的雾总会起,石柱也总会歪。望江楼的锣照旧一刻钟敲一次。变的是,敲锣的人心里多了一本账——那本账上记的不是水有多深,是他自己有多信得过自己。