微分:往前看半步
第三个旋钮看的不是「差多少」,也不是「差了多久」,而是「正在往哪个方向、以多快的速度变」。它是三个旋钮里唯一能提前刹车的,也是唯一一个能被噪声轻松击穿的。这一章讲它的收益,更讲它那张在无噪声仿真里完全看不见的账单。
一个两级惯性的对象,用 PI 控制,过冲 20.0%。现在加上微分项,Kd 从 0 一路加到 20。
问:过冲会怎么变?
再问一个更重要的:加微分项,你付的是什么钱?
唯一一个看未来的旋钮
三个旋钮,三个时态:
| 旋钮 | 它看的是 | 时态 | 它解决的毛病 |
|---|---|---|---|
| P 比例 | 现在差多少 | 现在 | 基本的纠偏能力 |
| I 积分 | 一共差了多久 | 过去 | 永远差一点(稳态误差) |
| D 微分 | 正在以多快的速度变化 | 将来 | 冲过头(过冲、振荡) |
微分(derivative,D)的控制律:
u = Kd × de/dt (误差的变化率)
为什么说它「看未来」?因为变化率就是最朴素的外推:如果误差正在快速缩小,那么照这个势头下去马上就要过线了,现在就该收力。
这正是一个熟练的人开车靠近红灯时做的事。新手看的是「离停止线还有多远」(比例);熟手看的是「按这个速度,还有几秒到线」(微分)。所以新手的刹车总是要么早了要么晚了猛点一脚,而熟手能一脚下去平顺停住。
微分项就是那个熟手。它在误差还很大、但正在飞快缩小的时候,就提前把油门收了。
微分项提供的是阻尼——就是第 4 章那个 ζ。它不改变系统去哪,只改变它怎么去。
而它拿到这个能力的方式,是对信号做求导。求导这个动作有一个数学上无法回避的性质:它放大高频。而噪声,恰恰全是高频。
所以微分项的账单不是「效果差」,而是:它会把传感器上那点微不足道的抖动,翻译成执行器上剧烈的动作。
它的收益,和它的账单
下面这个 demo 里,同一个对象、同一组 P 和 I,只改 Kd。请特别注意「执行器抖动」那一格——那是这一章的重点。
| Kd | 过冲 | 上升时间 | 执行器抖动 | 相对不用微分 |
|---|---|---|---|---|
| 0 | 20.0% | 3.72 s | 0.0567 | 1.0× |
| 2 | 14.3% | 4.11 s | 0.6527 | 11.5× |
| 5 | 8.9% | 4.80 s | 0.6351 | 11.2× |
| 10 | 7.5% | 6.26 s | 0.6294 | 11.1× |
| 20 | 11.7% | 9.08 s | 0.6265 | 11.1× |
三件事同时发生:
① 过冲确实被压下去了——从 20.0% 到 7.5%,效果显著,这是微分项该拿的功劳。
② 上升时间同时变长了——从 3.72 秒到 6.26 秒。这不奇怪:微分项做的就是「提前收力」,提前收力当然会慢。你买的是「不冲过头」,付的是「到得更慢」,这是一笔明码标价的交易。
③ 执行器抖动从 0.0567 涨到 0.65,涨了 11.5 倍。而且注意:只要 Kd 一离开 0,这笔钱就一次性付掉了——Kd = 2 和 Kd = 20 的抖动几乎一样。它不是「用多少付多少」,它是一开门就收的入场费。
把 demo 里那个「传感器有噪声」的开关关掉,你会看到抖动那一栏几乎变成零——在无噪声的仿真里,微分项看起来是白拿的。这就是为什么它在纸面上永远很美,在现场经常被关掉。
为什么求导会放大噪声
这件事有一个一行的解释,值得记住。
假设传感器读数上有一个幅度很小、但频率很高的抖动:0.01·sin(100t)。幅度只有 0.01,看起来无关紧要。
求一次导:
d/dt [ 0.01 · sin(100 t) ] = 0.01 × 100 × cos(100 t) = 1.0 · cos(100 t) # 幅度从 0.01 变成 1.0 —— 放大了 100 倍。 # 而这个 100 正是那个噪声的频率。 ★ 求导对一个频率为 ω 的信号,增益恰好是 ω。 频率越高,放大越狠,而且没有上限。
这就是全部秘密。噪声之所以叫噪声,正是因为它变化快;而微分项是一个「变化越快、反应越大」的装置。它们是天生一对。
现实中的应对办法有三个,都值得知道:
① 给微分项加低通滤波(几乎所有工业 PID 都这么做)
不对原始信号求导,先把它平滑一下再求导。数学上等价于把纯微分 Kd·s 换成 Kd·s/(1 + Tf·s)——高频处的增益不再无限增长,而是停在 Kd/Tf。
代价是这个滤波器本身又是一个惯性环节,会给环增加相位滞后。所以你在拿掉一个麻烦的同时又请回来半个。工业上常用的经验是把滤波时间常数取成微分时间的 1/8 到 1/20(本书 demo 里用的是 Tf = Kd/(10·Kp))。
② 对「测量值」求导,而不是对「误差」求导
这一招叫避免微分踢(derivative kick),几乎是白拿的好处。
# 目标从 20 跳到 25 的那一瞬间:
对误差求导: e 瞬间从 0 跳到 5
de/dt = 无穷大 → 控制量瞬间打满 → 执行器被踢一脚
对测量值求导: y 没有跳变(真实世界不会瞬移)
dy/dt 正常 → 什么都没发生
# 因为 e = r − y,而 r 是阶跃的时候:
# de/dt = dr/dt − dy/dt,那个 dr/dt 就是那一脚。
# 稳态时 dr/dt = 0,两种写法完全等价 —— 所以这一招纯赚不赔。
这是工程实践和教科书公式之间一个非常典型的缝隙:教科书写 Kd·de/dt,而任何一个能用的实现都写 −Kd·dy/dt。
③ 干脆不用
这是最常见的选择,而且往往是对的。在过程工业里,据业界的经验统计,实际投运的回路中相当大一部分把 D 项设成了零——因为流量、压力这类信号噪声大,而它们的对象又快,微分带来的麻烦超过好处。D 项主要活跃在温度控制这类信号干净、惯性大的场合。
那个转折点
回头看表格最后一行:Kd 从 10 加到 20,过冲反而从 7.5% 涨回 11.7%。
这是本章开头那题的答案:C,先降后升。
为什么?因为微分项虽然提供阻尼,但它自己也是环里的一个环节。Kd 大到一定程度后,微分项在高频段的巨大增益会把环路的穿越频率推得很高,而在那个频率上,对象积累的相位滞后已经很大——于是它开始制造新的振荡,而不是抑制。
这是一条贯穿全书的模式:每一个用来救火的手段,加到足够多的时候都会变成火本身。第 15 章的积分饱和、第 22 章的重试,都是同一个故事。
相机的自动对焦。连续对焦要预测被摄物的移动速度(微分),否则永远慢半拍。而在弱光下噪声变大,很多相机会明显变得「犹豫」——那是它在降低微分权重,用响应速度换稳定。
限流器的斜率检测。「如果 QPS 上升速度超过阈值就提前限流」是一个微分动作。它比等 QPS 真的超标再限流快得多,代价是毛刺会误触发——你必须先平滑,而平滑又让它变慢。这是一模一样的权衡。
止损单。「跌破 X 就卖」是比例式的;「跌得太快就卖」是微分式的。后者能躲过急跌,也会被闪崩的假信号打掉——微分项换来速度、赔上抗噪,一分不差。
你自己的驾驶。前面提到的「熟手看还有几秒到线」就是微分。而在雨雾天你会本能地不用它——能见度差(传感器噪声大)的时候,人会自动退回到纯比例的保守模式。人在这件事上的直觉是对的。
道理不难:微分项靠「看当前的变化趋势」来外推。而在纯延迟的环里,你看到的趋势本身就是过期的——你在用几秒钟前的斜率预测现在,那个预测在延迟大的时候基本没有信息量,只剩下噪声。
更糟的是,微分项会把环路的穿越频率往高频推,而纯延迟的相位滞后正比于频率(第 10 章):频率越高,延迟造成的相位越可怕。所以在延迟主导的环上加微分,等于主动跑到延迟最要命的地方去。
一条能用的判据(第 24 章的自查表里就有它):先算 L/τ。
L/τ小(延迟远小于惯性)——微分项值得一试,它专治这个。L/τ接近或超过 1——别加微分,去缩短延迟。这时候连 PI 都得整定得很保守(第 12 章那台设备就是 L/τ = 0.2 的典型)。
C先降后升。过冲从 20.0%(Kd = 0)降到 7.5%(Kd = 10),然后回升到 11.7%(Kd = 20)。存在一个最优点,越过它微分项就从灭火变成放火。
而那个更重要的问题——你付的是什么钱?——答案是执行器的抖动涨了 11.5 倍(0.0567 → 0.6527),外加上升时间从 3.72 秒拉长到 6.26 秒。前者在无噪声的仿真里完全看不见,所以它经常要到设备装上去、阀门开始咯咯响的时候才被发现。
A 「单调下降,趋近 0」——这个直觉来自「阻尼越大越不晃」,而阻尼比 ζ 确实越大越不晃。问题是 Kd 和 ζ 不是同一个东西:Kd 大到一定程度后,它给环带来的新问题超过了它提供的阻尼。 B 「有下限,压不到 0」——比 A 近了一步,但仍然假设了单调。真实曲线是 U 形的。 D 「微分影响的是稳态精度」——这是把三个旋钮的分工记反了。稳态精度归积分管(第 6 章)。而微分项在稳态时的贡献精确等于零:稳态意味着不再变化,不再变化意味着导数为零。微分项只在事情正在发生的时候说话。这一章的一句话
微分项是三个旋钮里唯一会提前刹车的,也是唯一一个能被一点点噪声击穿的——它的账单不写在响应曲线上,写在执行器上。
下一章把三个旋钮放到一起,回答那个所有人都想问的问题:到底该怎么调?答案比你以为的确定得多——1942 年就有一张表,只需要量两个数就能算出全部参数。而这张表给出的答案会冲过头 44.4%,这件事本身也是可以预先算出来的。