白盒.org 把每个原理拆到不能再拆
首页横切原理 › 反馈与稳定

反馈:为什么淋浴的水温永远调不准

L2 · 标准版 反馈与稳定 2026年9月18日

你调不准淋浴水温,不是因为手笨,是因为管道里那几秒的死时间。负反馈回路一旦带上延迟,修正就会变成过冲——同一个你,如果热水是瞬时的,一把就能调对。

一句话结论

你调不准淋浴的水温,不是因为你手笨,是因为管道里那几秒的死时间

负反馈回路一旦带上延迟,修正就会变成过冲,过冲引发反向修正,反向修正再过冲 —— 振荡就是这么来的。同样一双手,如果热水是瞬间到达的,你一把就能调对。

这不是你一个人的毛病。它是同一条原理,在热水器、方向盘、供应链、股票市场和整个互联网拥塞控制里反复出现的那个东西。

直觉铺垫:你在和延迟搏斗,不是和水温搏斗

把那个场景重演一遍:

  1. 你拧大热水,站着等;
  2. 两秒过去了,水还是凉的 —— 于是你再拧大一点;
  3. 热水终于到了,而且是按你”拧了两把”的量到的,烫得你跳起来;
  4. 你赶紧往回拧,又是两秒没反应,于是往回拧更多;
  5. 冷水到了,冻得你跳起来。

来回几次,你最后往往停在一个”凑合”的位置,而不是你真正想要的温度。

关键在于:你的每一个动作,都要等热水从热水器走过整根管子才能生效。在这几秒里,你手里握着的是过时的信息。

所以真正的对手不是水温,是延迟。你在第 1 秒做的决定,在第 4 秒才产生后果;而你在第 4 秒看到的,是第 1 秒的世界。你永远在对着过去的误差未来的修正,这两件事错开的那几秒,就是全部麻烦的来源。

同一个身影还出现在别处:

  • 新手司机画龙:打了方向,车隔一会儿才响应,于是不停地加打、回打,车头就画起龙来;
  • 麦克风啸叫:这是反馈 —— 声音进去又被放大出来再进去,一轮比一轮响;
  • 空调:你把温度调到 20 度想让它快点冷,结果半夜冻醒 —— 空调不知道你的”快点”,只知道现在的温度离 20 度还很远。

推导过程

反馈回路的四个零件

任何一个反馈回路都由这几样东西首尾相接:

传感器(你的皮肤)→ 比较器(和目标温度比一比)→ 控制器(你的大脑决定拧多少)→ 执行器(你的手)→ 被控对象(水管)→ 回到传感器。

淋浴是负反馈:偏离越大,你的修正方向越是往回拉。负反馈的天职是稳定 —— 前提是它跑得比延迟快。

把它写成式子

设你想要的温度是 T=40T^* = 40,实际出水温度是 TT,旋钮位置是 ss。一步一步写:

第一,水管有惯性,实际水温不是瞬间跳到旋钮值,而是慢慢追上去:

Tn+1=Tn+α(snTn)T_{n+1} = T_n + \alpha\,(s_n - T_n)

α\alpha 越小,管道越”迟钝”,水越是一点一点地变温。

第二,你的感知晚 dd:你此刻感觉到的不是 TnT_n,而是 TndT_{n-d}

第三,你按感觉到的误差拧旋钮gg 是你的手劲:

sn+1=sn+g(TTnd)s_{n+1} = s_n + g\,(T^* - T_{n-d})

全部的关键,就在于那个 d-d你修正的,是几秒钟之前的世界。

为什么这一定会振荡

想象水温已经升到 38 度,正在奔向 40。可你晚了三步才知道,等你察觉”差不多了”的时候,实际水温早就冲过 40 了 —— 你于是往回拧,而同样的延迟又让你往回拧过头。

每一次修正都比实际需要的多走一截,因为你看到的误差永远是旧的,而且它还在继续变大。于是:

延迟把”修正”变成了”过冲”,而过冲的大小大约正比于 延迟 × 修正力度

这句话直接推出三条反直觉的结论:

  • 手劲越大,死得越惨
  • 反应越快、每时每刻都在拧,死得越惨
  • 等一会儿再动一次手,反而最快稳定。

第三条最违反直觉,但它是真的。控制理论里管这个叫增益裕度:环路增益和延迟的乘积一旦超过临界值,系统就不再收敛,而是自激振荡。淋浴只是这条定理的日常版本。

工程师怎么解决它

对应上面的三个旋钮,只有四条路:

  1. 减小延迟 —— 把热水器装在淋浴间边上,或者用恒温阀。这是最有效的一条,但常常做不到:管子已经埋在墙里了。
  2. 减小增益 —— 小口小口地拧。有效,代价是慢。
  3. 引入预判 —— 也就是 PID 控制器里的 D 项:不看误差本身,而看误差变化的趋势,提前松手。工业上极常用。但在纯延迟系统里它的帮助有限,因为连”变化趋势”也是过时的:你连斜率都看的是三秒前的斜率。
  4. 耐心 —— 拧一下,数三秒,再看。别小看它:在数学上它等价于”降低你的采样频率”,而且是这四条里唯一零成本的。

下面可以亲手试。

交互演示

演示 · 淋浴水温模拟器
管道延迟3 步
手劲0.80
耐心每 1 步
管道反应0.25
20°40°60°80°目标 40°
峰值 76.7°超调 36.7°持续振荡灰虚线 = 你的旋钮位置
试试这个对照:把手劲固定在大大的 0.8,然后只把「耐心」从 1 拖到 4。 同一双手、同一根管子,超调会从三十几度掉到六度 —— 你什么都没改,只是愿意等一等。

请一定要做这一组对照,它是整篇文章的精华:

把手劲固定在大大的 0.8 不动,只把「耐心」从 1 拖到 4。 同一双手、同一根管子、同样的目标温度 —— 峰值超调会从 36.7° 掉到 6.1°,从剧烈振荡变成平滑到位。你什么都没改,只是愿意等一等。

再试另一组:手劲还是 0.8,把「管道延迟」从 3 拖到 1。 振荡几乎消失了。这证明元凶确实是延迟,而不是你的手。

常见误解

  1. “反馈一定是稳定的” —— 只有反馈、且延迟足够小的时候才稳定。带大延迟的负反馈会持续振荡,正反馈则直接发散(想想麦克风啸叫)。
  2. “问题是我反应太慢” —— 恰恰相反。问题是你反应太快、拧得太勤。真正慢下来(少拧、多等),系统反而更快稳住。
  3. “延迟只是让结果晚一点到,不改变结果” —— 延迟改变的是性质,不是时间。它把一个收敛的过程变成了一个永不衰减的振荡。
  4. “PID 是工程师的事,和我无关” —— 你每一次调水温、调音量、调空调温度,都在手动实现一个 PID 控制器,只不过你通常只用了 P(看偏差),把 D(看趋势)忘了。
  5. “多调几次总能调准” —— 在这个模型里不能。只要”手劲 × 延迟”超过临界值,振幅不会自己衰减,你会一直荡下去,直到某一次你厌烦了、随便找了个位置站好。

延伸引用

  • 计算 · 拥塞控制:为什么 TCP 一丢包就把速度砍一半 —— 这是延迟反馈最壮观的工程案例,也是同一条原理在毫秒尺度上的版本
  • 横切原理 · 涌现与层级 —— 当很多个这样的回路互相嵌套时会发生什么
  • 外部:牛鞭效应 —— 供应链里的同一条原理:从零售商到工厂,每一级的延迟把振幅放大一级,终端一个小小的需求波动,传到上游就成了滔天巨浪

本文是「白盒」横切原理系列的第一篇。发现错误、或者觉得哪一段没讲清楚,欢迎在 GitHub 上提 PR。