OVERSHOOT · 六卷 · 24 章 · 24 个真 Demo

一本反馈控制的小书。
主线只有一句:你调的不是那台机器,是一个环
而让环失控的从来不是力气不够——是你看到的是过去

零基础先直觉后原理全 SVG 数字全部当场算出与本机 numpy 逐题核对亮色 only

这张图是这本书的全部内容。四样东西:目标(蓝虚线,你唯一能直接设定的)、实际(绿实线,它不听你的,它听整个环的)、越线的那块面积(琥珀,书名)、起手处那段什么都没发生(紫,本书的反派)。曲线不是画的,是一台一阶惯性设备加两秒延迟、用教科书整定的 PI 控制器,真解出来的。

先回答一个问题

调洗澡水的时候,你把水龙头拧到合适温度,通常要来回几次?

再问一个:为什么是这个次数,而不是一次?

标准答案是「因为水温反应慢」。这个答案听起来很对,但它解释不了下面这件事——同样一双手、同样的拧法,只把水管从一米换成八米,第一种情况平均 28 秒调好,第二种情况永远调不好:水温会一直在过热和过冷之间来回,而且幅度越来越大。你没有变笨,水龙头也没变差。变的只有一件事:你看到的水温,是多久以前从阀门流出来的。

这件事有一个精确的名字(延迟),有一个精确的代价(临界增益 × 延迟 ≈ 常数),并且这个代价与你的技术无关——它是一条算术。这本书讲的就是这条算术,以及它在恒温器、巡航定速、自动扩容、库存补货、央行利率、你的团队里长什么样。

六卷

卷 I

成环

LOOP

你按的不是开关。一旦装上「看一眼再动」这件事,你手里的东西就换了一个物种。这一卷不用一个公式。

  1. 01你按的不是开关,是一个环一张「你以为它是 X,其实它是 Y」的对照表,和一个洗不好的澡▸ 洗澡水龙头
  2. 02会照做的,和会看着办的反馈的全部价值,是对付你不知道的事▸ 两条路
  3. 03一个环里有五个零件只有前三个是你写的代码,而事故大多出在后两个▸ 框图走一圈
  4. 04它为什么会晃八种组合里只有四种会晃,而「力气大」单独一个不算▸ 2×2×2 真值表
卷 II

三个旋钮

KNOBS

现在、过去、将来。工业界九成以上的控制器只有这三个旋钮,而它们各自在解决一个非常具体的毛病。

  1. 05比例:永远差那么一点稳态误差 1/(1+K) 永远不碰零,想压到 1% 得付出多少▸ 1/(1+K)
  2. 06积分:把「差一点」攒起来一阶设备加 PI,闭环恰好是标准二阶——全书最重要的一次「凑」▸ 攒出二阶
  3. 07微分:往前看半步过冲从 20.0% 压到 7.5%,执行器抖动涨了 11.5 倍▸ 抖动涨 11.5 倍
  4. 08三个旋钮一起拧1942 年那张只需要两个数的表,和它为什么总是冲过头▸ Z-N 整定台
卷 III

迟到

LAG

全书的转折点。振荡从来不是力气问题——是你看到的是过去。这一卷会给出那条把「晚多久」换算成「能用多大力气」的算术。

  1. 09你看到的是过去控制器一个字不改,只把延迟从 0 拉到 6 秒▸ 只拉长延迟
  2. 10把「晚」翻译成「反」周期正好等于两倍延迟时,负反馈精确地变成正反馈▸ −180° 那一刻
  3. 11延迟翻倍,你的力气减半四条完全不同的路,算出同一个 8.502424988▸★★ 四条路
  4. 12同一台设备,四种走法稳态报表上四个一模一样,路上是 0.0% / 0.0% / 44.4% / 回不来了▸★★ 招牌
卷 IV

会不会炸

STABILITY

把「我觉得它挺稳的」换成一个能算出来、能验算、能写进监控的数。

  1. 13「稳」是一句可以验算的话一张只做加减乘除的表,不解方程就知道会不会炸▸★★ 三方对判
  2. 14你离炸还有多远把相位裕度读成「还能再多容忍几秒延迟」▸ 两把尺子
  3. 15控制器在纸上很努力积分器攒下的债,还起来比欠下时慢一倍▸ 积分饱和
  4. 16不炸,但永远停不下来你家冰箱的控制律只有两个字:开、关▸ 恒温器
卷 V

看不见的东西

OBSERVE

环的另外半边。前四卷假设你知道「现在是多少」——这一卷问:你凭什么以为你知道。

  1. 17传感器也在骗你噪声、粗糙、迟到三种病里,只有一种会动摇稳定性▸ 三种看不清
  2. 18不等错误发生前馈模型错 50%,仍然把峰值偏差压掉一半▸ 前馈 + 反馈
  3. 19推出你测不到的那个量两个不确定的数合成一个比谁都确定的▸ 卡尔曼
  4. 20环套环把扰动关在离它最近的那个环里,峰值偏差小 10.6 倍▸ 串级
卷 VI

处处是环

EVERYWHERE

同一套算术,在仓库、在机房、在身体里、在央行。学完这一卷,你会在很多地方看见同一张图。

  1. 21一根鞭子,甩到链条末端每一级都做了完全理性的事,放大是这条规则的数学后果▸ 闭式↔仿真
  2. 22你的代码里全是环指标延迟一超过机器启动时间,扩容器就冲到 200 台▸ 扩容器震荡
  3. 23身体、组织与经济你测得到的那个指标涨了 90%,你真正想要的东西跌了 24%▸ 只测得到 A
  4. 24调你自己的那个环六项体检、一张自查表,和继续往下走的岔路口▸ 自查台

这本书里的数字是从哪来的

一个都不是编的,也一个都不是「查表抄来的」。assets/engine.js 里有一台真的控制引擎:它用四阶龙格–库塔真的在解微分方程,用 Aberth–Ehrlich 迭代真的在求多项式的根,用复数频响真的在找相位穿越点。正文里每一个百分比、每一条曲线、每一次「炸了」,都是它当场算出来的。

而「我算的」要变成「可信的」,还需要一步:找一个和我完全无关的实现来对判

  • 与本机 numpy 逐题核对。numpy 求多项式的根走的是「伴随矩阵 + LAPACK 特征值」,和书里那台迭代求根器是完全不同的算法。933 道题、3839 个根,两边最大偏差 1.8×10⁻¹¹;「右半平面有几个根」这个判断,Routh 判据、我的求根器、numpy 三方 933/933 逐题一致
  • 解析解 ↔ 数值解。二阶系统的阶跃响应有闭式解,把它和 RK4 逐点比,最大偏差 8.2×10⁻¹⁵——也就是双精度浮点的噪声本身。
  • 四条路算同一个数。第 11 章那个临界增益,用解析超越方程、复频响数值搜索、复平面上的牛顿法各算一遍,三条路给出 8.502424988,小数点后九位全同;再真跑一遍仿真二分,得到 8.473119,差 0.345%(那是仿真该有的误差)。
  • 牛鞭效应的闭式解 ↔ 仿真。Chen 等人 2000 年那个公式和 20 万期的仿真,相对差 0.05%–0.19%

验证器是 scripts/verify-overshoot.mjs,探针在 scripts/probe-ctl/

写给谁

  • 写代码的人。你大概率已经在维护好几个反馈环了——自动扩容、重试退避、限流、缓存预热、CI 队列——只是没人这么叫它们,所以出问题时你只能靠猜。
  • 对「世界如何运作」有兴趣的人。这门学问最初是为了让高射炮打中飞机,后来跑去解释了恒温器、经济周期、生态系统、血糖,和为什么组织里的坏消息总是来得太晚。
  • 数学不怕,但希望从直觉进入的人。卷 I 一个公式都没有;公式出现时一律先说「我们希望它满足哪几条」,再推出唯一解,不空降。

不打算讲什么

  • 不做控制理论教材。没有拉普拉斯变换的推导表,没有奈奎斯特判据的完整证明,没有状态空间的可控可观性分析。这些都是好东西,第 24 章会告诉你去哪读。
  • 不教你调某台具体设备。这本书给的是判断力,不是参数表。真到了现场,你的对象模型比这里任何一条公式都重要。
  • 不讲现代控制的重头戏(LQR、MPC、H∞、自适应、强化学习控制)。它们全都建立在这本书的地基上,末章有入口。想看「不知道模型时怎么控制」,书架上另有《打分》。

怎么读这本书

  • 按顺序。这本书是搭积木式的,第 11 章的那个乘积要用到第 5、9、10 章的三样东西。
  • 每章开头有一个「▷ 先拧一下」,四个选项,先落一个答案再往下读。章末的「◈ 回读」会告诉你答案,也会逐条告诉你每个错误选项的直觉是从哪来的——那些直觉通常不蠢,只是在一个更简单的世界里才成立。
  • 这两栏是故意这么设计的:你和这本书之间也是一个反馈环——你的猜测是控制量,章末的回读是传感器,而这个环的延迟是一整章。读到第 9 章你会明白为什么这件事值得一提。
  • Demo 请动手拖。24 个 demo 全是真引擎当场算的,不是录像。尤其第 1、9、11、12、22 这五个——它们各自能推翻一个你现在还相信的东西。
  • 赶时间的话:第 1 章 → 第 9 章 → 第 11 章 → 第 12 章,四章就能拿到这本书的主线。