望江楼的报潮人
一、江口三十里,报错一尺就要翻船
沧浪江出海的地方,横着一道叫"铁砂梁"的暗沙。
潮满的时候,梁顶盖着一丈二尺水,千石的粮船昂着头就过去了。潮落的时候,梁顶只剩三尺,连舢板都要蹭底。
所以江口立着一座望江楼,楼里养着报潮人。
报潮人的活儿只有一件:每隔一刻钟,敲一次锣,报出此刻铁砂梁上的水深。船老大在下游十里的湾子里等锣声,听见"一丈以上"就起锚,听见"八尺以下"就抛锚。
这活儿听着简单,其实凶险。
报高了,船撞沙梁;报低了,船白等一天,货就烂在舱里。楼里的老规矩是:报错一尺,赔一船;连错三次,摘牌走人。
望江楼的当家报潮人姓周,叫周敬亭,做了三十一年。楼上跟着两个得力的:
一个是水漏匠陈九,管着楼里那台铜壶滴漏和一本《潮汐历》。
一个是瞭望的伙计阿贵,眼睛毒,能在三里外看清江心那根石柱上的刻痕。
还有一个新来的小徒弟,叫阿沅,十七岁,什么都不会,就会问。
那年七月,陈九和阿贵吵了一架。
起因是初九那天,午时三刻该报潮。
陈九扒着他那本历书算:初九、上弦、午时,按往年的账,此刻梁上该是九尺四寸。
阿贵趴在窗口看石柱:水线卡在"八尺七"那道刻痕上,一动不动。
差了七寸。
"你那破历书是三十年前修的。"阿贵说,"江床年年淤,水位年年变,你算的是三十年前的江。"
"你那眼睛才靠不住。"陈九不服,"今天东南风六级,浪头一涌一尺高,你看见的是浪尖还是浪谷?你自己说得清吗?"
阿沅在旁边听傻了。他跑去问周敬亭:
"师父,到底该听谁的?"
周敬亭正在擦锣,头也不抬:"他俩说的都对。"
"那不成了都不能信?"
"是啊。"老人把锣擦亮了,"都不能信。"
那天午时三刻,周敬亭最后报了"九尺整"。
没人知道这个数是怎么来的。陈九说九尺四,阿贵说八尺七,师父报了个九尺整——不高不低,卡在中间。
当天下午,三条粮船顺顺当当过了梁。
阿沅追着问了三天,周敬亭都不说。直到第四天夜里,老人把他叫到楼顶,指着黑黢黢的江面问:
"你说,报潮报的是什么?"
"报水深啊。"
"错。"周敬亭摇头,"报的是你觉得水有多深,以及你有多相信自己这个觉得。"
阿沅没听懂。
二、老周说,先给"心里没底"记上一笔账
第二天,周敬亭把陈九和阿贵一起叫到桌前,摊开一张空白的账页。
"从今天起,楼里改规矩。"他说,"报潮的时候,不光报尺寸,还要报一个数——心里有多少底。"
"啥叫心里有多少底?"阿贵问。
老人在纸上写下两行字:
今日午时,估水深 九尺整
心里的谱:上下不超过 三寸
"意思是,我认为水是九尺,但我知道我可能错,错也错不过三寸。这个'三寸',就叫谱。"
陈九皱眉:"报个虚数有什么用?船老大要的是实数。"
"用处大了。"周敬亭把毛笔搁下,"你们俩为什么吵?因为你俩都只报数,不报谱。你说九尺四,他说八尺七,听着像两个人打架。可要是——"
他在纸上又添两行:
陈九:九尺四寸,谱是 上下八寸
阿贵:八尺七寸,谱是 上下三寸
"这就不是打架了,这是两份深浅不同的把握。"
阿沅眼睛亮了一下:"师父的意思是,谁的谱紧,就多听谁的?"
"往下说。"
"陈师傅的谱是八寸,阿贵哥的谱是三寸,阿贵哥更有把握,所以……所以该往阿贵哥那边靠?"
"靠多少?"
阿沅卡住了。
周敬亭在纸上画了一杆秤。
"不是挑一个,是掺。掺的比例,就按谱来定——谁的谱松,谁的分量就轻。"
他写出楼里第一条新规矩:
两个数掺一块儿,各占几成,看各自的谱有多紧。
陈九谱松(八寸),占三成;阿贵谱紧(三寸),占七成。
九尺四 × 三成 + 八尺七 × 七成 = 八尺九寸一分。
陈九盯着这个数看了半天:"那……那天你报九尺整,是这么来的?"
"差不多。"周敬亭说,"我心里估的,跟这个数只差九分。"
三、推的账会越推越虚,看的眼却看不穿雾
新规矩推行了半个月,出了岔子。
七月廿三,江上起大雾。三里外的石柱,阿贵一点也看不见了。
"看不见就报不了。"阿贵急得直搓手。
"看不见就不报了?"周敬亭反问,"船在下游等着呢。"
"那只能听陈师傅的推算了。"
"对,只能推。"老人点头,"但推有推的毛病,你们得先明白毛病在哪儿。"
他让陈九把这半个月的账翻出来,摊了一桌子。
"陈九,你告诉阿沅,你是怎么推的?"
陈九说:"我看上一刻报的是多少,再按历书上这个时辰该涨该落多少,加减一下,就是这一刻的数。"
"那要是上一刻你就报偏了三寸呢?"
"那这一刻还是偏三寸。"
"要是这一刻的历书本身也不准,又添了两寸偏差呢?"
陈九脸色变了:"那……那就偏五寸了。"
"再推一刻呢?"
"七寸……八寸……"陈九声音越来越低,"越推越离谱。"
周敬亭在账页上重重画了一笔:
只靠推,谱会一刻比一刻松。每推一次,就往谱上添一份新的虚。
"这就是雾天最怕的事。"老人说,"不是推不出数,是推得出数,却越来越不敢信。"
阿沅忽然问:"那雾散了呢?"
"雾散了,阿贵一眼看过去——"周敬亭笑了,"石柱明明白白摆在那儿。他那一眼的谱是三寸,我们推了三天,谱已经松到两尺开外。这时候按规矩掺,阿贵占九成九,我们那三天的推算,只占一丝丝。"
"那不等于我们白推了三天?"
"不白推。"老人摇头,"雾里的三天,船老大手里有数可用。虽然虚,但比什么都没有强。要紧的是我们自己知道它虚——所以雾一散,我们二话不说就认阿贵的。要是我们不记谱,推了三天还觉得自己算得挺准,那才是要出人命的。"
也是在那天,周敬亭补了第二条规矩:
一、只推不看的时候,往谱上加一份虚。推得越久,谱越松。
二、看一眼之后,把新看到的和推出来的掺一掺,掺完,谱要收紧。
阿沅一边抄一边嘀咕:"看一眼,谱就紧一点……"
"对。"老人说,"每看一眼,你就赚回来一点底气。"
四、石柱被撞歪的那七天
七月末,来了真正的考验。
一条运石料的驳船在夜里失控,撞上了江心那根量水石柱。柱子没断,但歪了——整根往下沉了一尺一寸。
没人知道。
第二天一早,阿贵照常瞭望,报:"水深一丈零一寸。"
周敬亭愣了一下。按推算,此刻应该是九尺左右。差了一尺。
按规矩,阿贵的谱紧,该多听他的。掺完是九尺八。
老人报了九尺八。
下午,一条船撞了梁。
楼里炸了锅。
"是我看错了!"阿贵脸都白了。
"你没看错。"周敬亭把他按回椅子上,"你看得清清楚楚。是柱子错了。"
陈九急道:"那怎么办?规矩里没写柱子会歪啊!"
老人沉默了很久,才说:
"规矩里有。只是你们没读到底。"
他翻开账本最后一页:
掺完之后,还要记一笔:你估的,和你看到的,差了多少。
"这一笔叫差账。"周敬亭说,"平时它应该忽大忽小、时正时负,像风一样没定准。可从昨天早上起——"
他把这两天的差账摊开:
卯时:差 一尺整(看到的比估的高)
辰时:差 九寸八(高)
巳时:差 一尺零二(高)
午时:差 九寸九(高)
"看出门道了吗?"
阿沅倒吸一口气:"全是高的!一次都没往低了差!"
"对。"老人一字一句,"风是没定准的,可这不是风。这是有人在秤上做了手脚。"
"差账要是一直往一边倒,那说明错的不是你估的,也不是你看的,是你量东西的那把尺。"
当天下午,周敬亭派人划船去江心,发现了那根歪柱。
后来那七天,楼里是这么过的:
石柱重新立正之前,阿贵每报一个数,先减去一尺一寸,再交给周敬亭掺。同时,阿贵的谱从三寸放宽到八寸——因为谁也不敢保证柱子只歪了一尺一寸,说不定还在慢慢沉。
"谱一放宽,"陈九琢磨过来了,"我的推算就占分量了。"
"对。"周敬亭点头,"眼睛靠不住的时候,就多信推算;推算靠不住的时候,就多信眼睛。谁都靠不住的时候,就把谱放松,让下游的船宁可多等一刻。"
七天后柱子扶正,一切照旧。
那年入冬,周敬亭把牌子交给了阿沅。
交接那天,老人只讲了三句话:
"一,别指望有一个法子是准的。推的会漂,看的会花,两个都不干净。"
"二,把'我有多不准'当成正经事记下来,它比那个数本身还金贵。"
"三,两个不准的东西掺在一起,会比任何一个单独用都准——前提是你老老实实知道各自不准在哪儿。"
阿沅问了最后一个问题:"师父,做这行三十一年,最要紧的是什么?"
周敬亭望着江面,江上起了薄雾,石柱若隐若现。
"报得准的,从来不是眼睛最尖的那个,而是最清楚自己哪儿不准的那个。"
技术解读
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 | 传感器可信度下降时降低其权重 |
| "宁可让船多等一刻" | 保守估计与安全裕度 | 不确定度大时输出更宽的置信区间 |
为什么这个故事对应卡尔曼滤波?
两个信息源都不可靠,却都不能丢。 陈九的推算会累积漂移(模型误差),阿贵的目测会被风浪扰动(观测噪声)。经典卡尔曼滤波的前提正是:既有一个不完美的动力学模型,又有一个带噪的观测通道,二者信息互补——模型给出连续性,观测给出真值锚定。
融合权重由不确定度决定,而不是由人拍脑袋。 卡尔曼增益 K = P⁻/(P⁻+R) 是从"最小化后验方差"推导出的最优解。故事里"谱松的占三成、谱紧的占七成",就是这条公式的白话版本——它不是经验比例,是数学上唯一最优的比例。
不确定度必须被显式追踪,它是算法的第二个状态量。 周敬亭改的规矩里最关键的一条,是"报数的同时报谱"。卡尔曼滤波真正区别于简单加权平均的地方,就在于它同时递推 x̂ 和 P:P 在预测步膨胀(+Q),在更新步收缩(×(1−K)),构成一个自我调节的闭环。
预测与更新的交替,正是滤波的心跳。 大雾三天只走预测、P 单调增大;雾散后一次观测就把 P 拉回来——这就是 Predict-Update 循环的完整写照。传感器采样率低、偶发丢帧时,滤波器依然能输出估计,正是它在导航、雷达跟踪、机器人定位中不可替代的原因。
新息序列是滤波器的体检报告。 石柱歪掉后,差账连续四次同号——这在统计上属于新息不再白化。工程实践中,新息一致性检验(NIS/NEES)是判断滤波器是否失配的标准手段:随机误差应当正负交替、零均值,一旦持续偏向一侧,问题必然出在模型或传感器标定,而不在融合算法本身。
系统性偏差不是滤波能自动消化的东西。 标准卡尔曼滤波假设噪声零均值,石柱下沉这类恒定偏差会直接把估计带偏。工程上的两条路,故事里都给了:一是离线标定后补偿(每次读数减一尺一寸),二是状态增广(把 bias 本身作为待估状态一起递推)。同时调大 R,则是自适应滤波的降权策略。
它是最优的,但只在自己的假设里最优。 在线性系统 + 高斯白噪声的前提下,卡尔曼滤波是方差最小的线性无偏估计,没有更好的线性方案。可一旦假设被打破——非线性(要用 EKF/UKF)、非高斯(要用粒子滤波)、有偏(要标定)——它就会安静地给出一个错误答案。这也是为什么"知道自己哪儿不准",比"算得多准"更重要。
后记:卡尔曼滤波被称为二十世纪最重要的算法之一,从阿波罗飞船到手机里的计步器,从雷达跟踪到自动驾驶的多传感器融合,它无处不在。它的深刻之处,不在于那几行矩阵递推,而在于它对"知识"的态度——任何一个数,如果不附带它的不确定度,就是一个危险的数。它教会工程系统一件人类常常做不到的事:诚实地承认自己有多不确定,并且让这份诚实参与决策。
江上的雾总会起,石柱也总会歪。望江楼的锣照旧一刻钟敲一次。变的是,敲锣的人心里多了一本账——那本账上记的不是水有多深,是他自己有多信得过自己。

