延迟翻倍,你的力气减半
第 1 章那个洗澡的人有一条经验:水管长一倍,手就得慢一半。第 9 章那张表里也反复出现同一个规律。这一章把它变成一条能验算的等式,并且用四条互相独立、共享零行代码的方法各算一遍——看它们会不会给出同一个数。
那台设备(K = 1,τ = 10 秒)。延迟 L = 2 秒时,临界增益 Ku = 8.5024。
现在把延迟改成 4 秒。新的 Ku 大约是多少?
顺带一个更有意思的问题:Ku 和 L 相乘,会得到什么?
四条路
先把那个数算出来。这本书的做法是:用四种互不相干的数学,写四段没有共享代码的程序,看它们会不会撞到同一个数字上。
路 A · 解析。解第 10 章那个相位方程 ωL + arctan(ωτ) = π,得到 ω,再代进幅值条件。用到的是三角函数和二分法。
路 B · 频域数值。完全不使用上面那个相位公式。直接在复数频率响应上扫描,找出「幅角等于 −π」的那个点,然后取该点幅值的倒数。用到的是复数运算。
路 D · 特征根。既不看相位也不看幅值。直接在复平面上对特征方程 (τs+1) + Kp·K·e^−Ls = 0 用牛顿法找最靠右的那个根,然后二分 Kp 使这个根的实部恰好为零。用到的是复变函数的迭代求根。
路 C · 时域仿真。不用任何理论。真的解一遍微分方程,踢它一脚,看振幅是涨是消,然后对 Kp 做二分。用到的是四阶龙格–库塔。
A、B、D 是三种不同的数学;C 是「不管理论,真跑一遍」。
拖动滑杆,四条路的结果会当场重算:
L = 2 秒时,三条解析/数值路径给出的结果:
# 对象:K·e^−Ls/(τs+1) K=1 τ=10s L=2s
路 A 解析 解 ωL + arctan(ωτ) = π Ku = 8.502424988
路 B 频域数值 在复频响上找相位穿越 −180° Ku = 8.502424988
路 D 特征根 对 (τs+1)+KpK·e^−Ls 用牛顿法 Ku = 8.502424988
└─────┬─────┘
小数点后九位全同
路 C 时域仿真 真解微分方程,二分找临界 Ku = 8.473119
与解析差 0.345%
★ 振荡频率 ω = 0.844341345 rad/s → 周期 Tu = 7.4415 秒
★ 临界时最右的那个特征根,实部 = 2.81e−17
—— 不多不少,正好压在虚轴上(那正是「临界」的定义)
关于路 C 那 0.345% 的偏差,值得说一句:那不是误差,那是诚实。时域仿真用的是有限步长,判据是「后半段的振幅比前半段大还是小」,本身就有分辨率。如果它给出的也是 8.502424988,那反倒说明我在某处偷偷共享了代码。三条精确路径完全一致、一条近似路径差千分之三——这是一个健康的结果。
那个 2.81e−17 也值得多看一眼。它是双精度浮点在这个量级上的噪声水平。换句话说:在计算机能表示的精度内,那个根确实精确地落在虚轴上。
那张表,和藏在里面的守恒律
现在把延迟扫一遍:
| 延迟 L | 临界增益 Ku | 临界周期 Tu | Ku × L | πτ / 2K | 超出 |
|---|---|---|---|---|---|
| 0.25 s | 63.4700 | 0.99 s | 15.8675 | 15.7080 | 1.0% |
| 0.50 s | 32.0555 | 1.96 s | 16.0278 | 15.7080 | 2.0% |
| 1.00 s | 16.3506 | 3.85 s | 16.3506 | 15.7080 | 4.1% |
| 2.00 s | 8.5024 | 7.44 s | 17.0048 | 15.7080 | 8.3% |
| 4.00 s | 4.5868 | 14.04 s | 18.3471 | 15.7080 | 16.8% |
| 8.00 s | 2.6446 | 25.66 s | 21.1566 | 15.7080 | 34.7% |
盯住第四列。Ku 和 L 的乘积,在延迟小的时候几乎是个常数:15.87、16.03、16.35、17.00……而它趋近的那个值,就是第五列的 πτ/2K = 15.7080。
这条守恒律可以推出来,而且推法只有三行。
当延迟远小于惯性(L ≪ τ)时,临界频率会比较高,于是 arctan(ωτ) 已经很接近它的上限 π/2。相位方程就简化成:
ω L + π/2 ≈ π → ω ≈ π / (2L) # 再代进幅值条件。同样因为 ωτ ≫ 1: Ku = √(1 + (ωτ)²) / K ≈ ω τ / K = π τ / (2 L K) ★ 于是: Ku × L ≈ π τ / (2 K) —— 右边完全不含 L # 读法: # 这个乘积只由**对象自己**(惯性 τ、增益 K)决定, # 和你的延迟多长**无关**。 # 所以延迟翻倍,Ku 必须减半,才能维持这个乘积不变。
它为什么只是近似?因为 arctan(ωτ) 并不真的等于 π/2,它总是差一点点。而那「一点点」正是惯性在帮你的忙——延迟越大,临界频率越低,惯性帮的忙越多,所以乘积会往上偏。表里那一列「超出」量化的就是这份帮助:L = 0.25 秒时只帮了 1.0%,L = 8 秒时帮了 34.7%。
但请注意帮助的方向:即使在 L = 8 秒(延迟接近惯性)时,乘积也只涨了三分之一,而 Ku 本身已经掉了 24 倍。惯性的帮助是杯水车薪,那条「减半」的规律基本上就是全部真相。
把它写成一句可以带走的话:
一个反馈环能用的力气,和它的延迟成反比。这个反比关系里的比例常数,由对象自己决定,你改不了。
验算一下「减半」到底有多准:
L 从 …… 翻倍到 …… Ku 从 …… 掉到 …… 还剩 ───────────────────────────────────────────────── 0.25 s → 0.5 s 63.470 → 32.056 50.5% 0.5 s → 1 s 32.056 → 16.351 51.0% 1 s → 2 s 16.351 → 8.502 52.0% 2 s → 4 s 8.502 → 4.587 53.9% 4 s → 8 s 4.587 → 2.645 57.7% # 延迟小的时候,「减半」这条经验准到小数点后两位。 # 延迟大到和惯性一个量级时,稍微好一点(剩 57.7% 而不是 50%), # 但那点好处完全不值得指望。
这条律的三个推论
推论一:延迟是最贵的东西。因为它是唯一一个直接乘在你的力气预算上的量。你可以通过换更好的算法、加微分项、上更复杂的结构去挤出几十个百分点的性能;而把延迟砍半,你的可用力气直接翻倍。没有任何控制器设计能给你这么大的回报。
推论二:缩短延迟是「净收益」,降低增益是「交易」。第 4 章那个错觉栏里说过这句话,现在它有了算术依据。降增益换来稳定,赔上精度和速度;缩短延迟同时买到更高的增益上限和更快的临界频率——两样都变好,不用付任何东西(除了缩短延迟本身的工程成本)。
推论三:Tu 也跟着延迟走。看表的第三列:临界周期 Tu 大致正比于 L(0.99、1.96、3.85、7.44、14.04、25.66,每次翻倍)。而 Tu 决定了整定出来的积分时间和微分时间(第 8 章那张表全是 Tu 的倍数)。所以:延迟不但决定你能用多大力气,还决定了这个环所有的时间尺度。延迟是这个环的时钟。
把第 1 章洗澡那件事再算一遍,用这一章的工具。
那个洗澡的人用的是积分式的手法(一直朝着差的方向拧),所以他的临界增益不是这里的 Ku 而是另一个数,但规律完全一样:
水管 1 秒:临界手速 1.052 /秒 水管 2 秒:临界手速 0.548 /秒 (剩 52.1%) 水管 4 秒:临界手速 0.292 /秒 (剩 53.3%) 水管 8 秒:临界手速 0.158 /秒 (剩 54.1%)
「水管长一倍,手就得慢一半」——第 1 章那句凭直觉写下的话,现在是一条可以验算的算术。而它对任何反馈环都成立:你的监控周期、你的评审周期、你的财报周期,全都在这条律的管辖之下。
为什么高频交易要把机房搬到交易所隔壁。不是为了「快一点点」,是为了在同一条策略上能用更大的仓位(增益)而不失稳。延迟减半,可用杠杆翻倍——这是这条律最直白的商业变现。
为什么 CI 要快。「提交到知道结果」是开发者这个反馈环的延迟。从 30 分钟砍到 3 分钟,不只是「省 27 分钟」,而是让开发者可以用十倍的力气去纠偏——敢改更大的东西、敢更快地迭代。反过来,一个两小时的 CI 会强迫所有人把动作变小变慢,否则就会陷入「一次改一堆、错了不知道是哪个」的振荡。
为什么组织越大越保守。规模上升,信息从一线传到决策者的延迟上升,于是可用的「决策力度」按反比下降。大公司的谨慎常常被解读为文化或激励问题,但至少有一部分是纯粹的算术:在那个延迟下,激进的动作在数学上就是不稳定的。而这也指出了解法:不是号召大家胆子大一点,是缩短那条链路。
Smith 预估器的思路很漂亮:在控制器内部跑一个对象的仿真模型,让控制器对着这个没有延迟的仿真做反馈,同时用真实测量去修正模型。理想情况下,延迟被「移出」了环外,那条 Ku × L 的约束就不适用了。
代价是它对模型误差极其敏感,尤其对延迟值本身的误差。如果你以为延迟是 2 秒而实际是 3 秒,那内部模型和真实系统会持续对不上,而这个偏差本身又会绕回环里。工业界的普遍看法是:Smith 预估器适合延迟大、模型稳、且延迟本身可测的场合(比如带传送带的过程),不适合延迟本身会变的场合(比如网络、人的反应)。
所以这条律真正的地位是:它不是一条无法突破的物理定律,它是一条「不额外提供信息就无法突破」的信息定律。你想突破它,就必须拿模型(也就是关于对象的知识)去换。这跟第 2 章那句「开环的精度上限是你对世界的了解」是同一件事,绕了一圈又回来了。
C延迟从 2 秒变成 4 秒,Ku 从 8.5024 掉到 4.5868——剩下 53.9%,差不多减半。
而那个附加问题:Ku × L 是个(近似的)常数。2 秒时是 17.0048,4 秒时是 18.3471,而它们共同趋近的极限是 πτ/2K = 15.7080——一个只由设备本身决定、与延迟无关的数。
≈π/(2L)(一次反比),而幅值条件里的 ωτ 恰好也线性依赖 ω,两者在 Ku ≈ πτ/(2LK) 里合成了一次反比。幸好是一次的——如果真是平方,几乎所有带延迟的系统都会不可控。
这一章的一句话
「你能用多大力气」和「你多久之后才看得见」,是同一个数的两种说法——它们的乘积由设备决定,你只能在两者之间分配。
下一章是这本书的招牌。同一台设备、同一个目标、四个都「整定过」的控制器,它们的稳态误差全部是 0、闭环直流增益全部是 1——从任何一张稳态报表上你都看不出它们的区别。而把同一个阶跃打进去:0.0% / 0.0% / 44.4% / 回不来了;调节时间 79.9 秒 / 40.2 秒 / 20.9 秒 / 无穷。第四个和第三个之间,只差了「把两个参数各乘以 2」。