积分:把「差一点」攒起来
第二个旋钮只做一件事:把误差一直加起来。就这么一个动作,能把上一章那个「永远差一点」精确地干成零。但它同时给这个环装上了记忆——而有记忆的东西会记仇,会惯性行事,会在事情已经解决之后还接着做。这一章讲它换来了什么,也讲它的账单。
还是上一章那台设备(K = 1,惯性 10 秒,无延迟)。现在给控制器加上积分项:控制量 = Kp·e + Ki·∫e dt。
把 Ki 设成一个非常小的数,比如 0.01——小到几乎可以忽略。
C 和 D 只差半句话,但那半句话是这一章的重点。
一个不肯罢休的装置
积分(integral,I)的控制律:
u = Ki × ∫ e dt (把误差从头到现在累加起来) # 离散实现(你实际会写的代码): I += Ki * e * dt u = I
它和比例项的区别,可以用一句话概括:
比例项问的是「现在差多少」,积分项问的是「一共差了多久」。
这个区别带来一个关键性质。回忆上一章那个死结:比例控制器要有输出就必须有误差。而积分器不受这个约束——它的输出来自历史,所以即使此刻误差为零,它照样可以保持一个非零的输出。
换句话说,积分器把「维持现状所需要的那份输出」记了下来,从此不再需要用误差去养活它。
于是稳态误差被干掉了。而且干得非常干净:
只要 Ki > 0,不管它多小,稳态误差都精确等于零。
道理是一句反证:假设最后稳定下来时误差不为零,那积分器就还在往上(或往下)累加,输出就还在变,那就不叫稳定。所以稳定的唯一可能是误差恰好为零。
Ki 的大小不影响这个结论,只影响到达零所需要的时间。这就是本章开头那题 C 和 D 的区别:不只是「和 Ki 无关」,而是和 Kp 也无关——积分项的这个性质是结构性的,不是参数调出来的。
代价:这个环长了一岁
天下没有白拿的东西。加上积分项之后,这个闭环发生了一件大事:它的阶数从一阶变成了二阶。
「阶数」听起来抽象,但它的物理含义很具体:系统里有几个能储存东西的地方。原来只有一个(设备的热惯性),现在多了一个——积分器本身。积分器里存的是「历史欠账」,它和热惯性一样,是一个有记忆、需要时间排空的东西。
而两个储能元件凑在一起,就满足了第 4 章那张真值表里的振荡条件。所以:
# 纯比例(一阶闭环) 加了积分(二阶闭环)
1 │ ╭────── 1 │ ╱╲
│ ╱ ← 停在 0.9 目标 ═╪════╱══╲═╱╲═══════
│ ╱ │ ╱ ╲╱
0 │╱ 0 │ ╱
└───────────→ t └───────────→ t
永不越线,但永远差一点 能到位,但会冲过头
# 这不是巧合,这是一笔交易:
# 你用「可能冲过头」换来了「一定能到位」。
全书最漂亮的一次凑巧
现在来看看这个二阶闭环长什么样。把 PI 控制器接到一阶设备上,整理特征方程,会得到:
# 设备:τ (dy/dt) = −y + K u # 控制器:u = Kp e + Ki ∫e dt, e = r − y # 对整个式子再求一次导(把积分号消掉),整理后得到闭环特征方程: τ s² + (1 + Kp K) s + Ki K = 0 # 而标准二阶系统长这样(第 4 章那张表就是给它用的): s² + 2 ζ ωn s + ωn² = 0 # 对照系数,两边一一对上: ωn = √( Ki K / τ ) ← 固有频率:它晃得多快 ζ = (1 + Kp K) / ( 2 √(Ki K τ) ) ← 阻尼比:刹车有多狠
这两行是卷 II 的核心。它们把两个抽象的旋钮翻译成了两个有画面的量:
- Ki 只出现在 ωn 里(还有 ζ 的分母)——加大积分,系统晃得更快,刹车更弱。
- Kp 只出现在 ζ 的分子里——加大比例,刹车更狠,但不改变晃动的频率。
所以「PI 怎么调」有了一个具体得多的说法:用 Ki 决定这件事有多快,用 Kp 决定它冲不冲过头。这比「凭感觉试」强太多了。
拖动下面两个滑杆,同时盯着 ζ 那一格:
几组具体的数(都是这台设备,K = 1,τ = 10):
| Kp | Ki | ζ | ωn | 二阶公式说 | 真跑出来 |
|---|---|---|---|---|---|
| 1 | 0.05 | 1.4142 | 0.0707 | 0.0% | 0.0% |
| 2 | 0.2 | 1.0607 | 0.1414 | 0.0% | 0.0% |
| 3 | 0.9 | 0.6667 | 0.3000 | 6.0% | 13.8% |
| 1 | 0.4 | 0.5000 | 0.2000 | 16.3% | 19.1% |
| 5 | 2.5 | 0.6000 | 0.5000 | 9.5% | 19.5% |
看最后两列。前两行完全对上,后三行对不上,而且差得不小——第三行是 6.0% 对 13.8%,差了一倍多。
这不是仿真的误差,也不是我算错了。这是一件真实发生、值得单独讲清的事。
教科书公式为什么会失手
第 4 章那张阻尼比对照表,是给标准二阶系统用的:
标准二阶: ωn² / (s² + 2ζωn s + ωn²) ← 分子是个常数
而 PI 闭环: (Kp s + Ki) K / (τ s² + (1+KpK) s + KiK)
└────┬────┘
分子里有一个 s !
分子里那个 s 意味着闭环有一个零点,位置在 s = −Ki/Kp。而零点会做一件事:把响应的前半段加速,于是曲线冲得更猛,过冲比纯粹的二阶公式预测的更大。
第三行那组参数(Kp = 3,Ki = 0.9),零点在 −0.3,而 ωn 恰好也是 0.3——零点和系统本身的速度一样快,影响就非常明显:预测 6.0%,实际 13.8%。而第一、二行的零点相对很远(−0.05、−0.1,而 ζωn 更大),影响就可以忽略,两者完全吻合。
控制论里有一对总被一起提到的词:极点(poles)和零点(zeros)。它们是传递函数分母和分子的根。
极点是这本书的主角:它们决定系统的脾气——晃不晃、多快衰减、会不会炸。第 13 章讲的全是极点。
零点常常被初学者忽略,因为它们不影响稳定性。但它们影响形状:一个靠近原点的零点会让响应更冲,一个在右半平面的零点会让系统先往反方向走一下(叫非最小相位,比如水位控制、飞机抬头时先掉高度)。
本书不深入零点,但至少你现在知道了:当仿真和教科书公式对不上时,先去看看分子。——顺便,很多真实的 PID 实现会用「目标值加权」(把比例项写成 Kp(βr − y),β < 1)来削弱这个零点,这是工业界的常规做法。
我把这一段完整写出来,是因为它是一个诚实的样本:公式是从模型来的,而模型和真东西之间总有一道缝。这本书里的每一个数字都真跑过一遍,正是为了让这种缝暴露出来,而不是被公式盖住。
巡航定速上长坡。纯比例的巡航定速在长上坡会稳定地慢几公里;有积分项的会慢慢补上来,最后精确到位。而下坡时你会感到它「一开始收油收得不够,过一会儿才收够」——那是积分器在排掉上坡时攒的账。
自动扩容的目标利用率。纯比例规则会稳在 60% 以外的某个值;加上积分项(很多云厂商的实现里有)能精确落在 60%。但同时你会看到扩容器在流量下降后还多开了一会儿机器——积分器在排账。
人的「补偿心理」。「这周落后了,下周多做点补上」就是积分行为——你在对累积的偏差做反应,而不是对当前的偏差。它保证你长期不掉队(稳态误差为零),代价是节奏会晃:欠账多了猛冲,冲过头了又歇几天。典型的 ζ 偏小的二阶系统。
看那两个公式就明白了:ωn = √(KiK/τ),ζ = (1+KpK)/(2√(KiKτ))。Ki 出现在 ωn 的分子和 ζ 的分母上——它把两件事往相反方向推。
这带来一条实用的整定纪律:Ki 和 Kp 要一起动。只加大 Ki 不加大 Kp,ζ 会掉,过冲会涨;想更快又不想更晃,两个得按比例一起加。(第 8 章那些整定公式全都同时给出 Kp 和 Ti,正是因为这个。)
另外一个更实际的教训:积分项的记忆是会闯祸的。它记住的是「历史欠账」,而如果那笔账是因为设备根本做不到(阀门已经全开),它会一直记下去,越记越多,直到目标变了也放不下——第 15 章会给你看这笔账要还多久:同一个环,有抗饱和 41.1 秒回到目标,没有的话 340.9 秒。
D稳态误差精确变成 0,而且这个结论和 Ki 无关,也和 Kp 无关。哪怕 Ki 是 0.0001,最后也是精确的零——只是它要花很久很久。
Ki 只决定多快到零,不决定能不能到零。这是一个结构性质,不是参数性质:只要控制器里有一个积分器,稳态误差就活不下来。
A 「从 10% 降到 9%」——把积分项当成了比例项的小补丁。它不是补丁,它是另一种机制。 B 「降低幅度正比于 Ki」——这个直觉来自「参数越大效果越强」这条几乎放之四海皆准的经验。而在这里它彻底失效:效果是阶跃式的,Ki 从 0 变成任何正数,稳态误差就从1/(1+K) 变成 0。这是一条不连续的边界。
C 「精确变成 0,只是要等很久」——这个答案基本正确,只差了后半句。之所以把 D 列出来,是想强调那个更强的结论:它和你之前调的 Kp 完全无关。这意味着你可以放心地为了「不振荡」把 Kp 调小,而不必担心精度——精度由积分项独立保证。这个分工,是 PI 控制器统治工业界的根本原因。
这一章的一句话
积分项用「记住历史」换来了「一定到位」,而记忆的账单是:这个环从此会冲过头,也从此会记仇。
下一章是第三个旋钮,它管的是将来。它能把过冲从 20.0% 压到 7.5%,听起来白拿——直到你看见执行器那一栏:抖动涨了 11.5 倍。而且这个代价在无噪声的仿真里完全看不见,这也是为什么现实中一大半的 PID 控制器最后都把 D 关掉了。