采样周期越短,控制就一定越好吗?
同一控制器下,τ=0.5 s 时周期从 1 ms 拉到 100 ms,IAE 只差 0.3%(0.4091–0.4104);而 τ=20 ms 时,100 ms 的周期让 IAE 直接变成 2.83。决定成败的是 T/τ 比值,不是绝对快慢。
把周期从 100 ms 缩到 1 ms,是 100 倍的努力。在 τ=0.5 s 的对象上,IAE 只从 0.4095 变到 0.4102——差别 0.3%,还不如噪声的波动大。但把对象时间常数换成 20 ms,同样是 100 ms 的周期,IAE 会从 0.4095 跳到 2.83。分界线不在"快慢",在 T/τ。
现象
我按同一套对象与控制器做了三次周期扫描,得到三个互相矛盾的结论:
| 对比方法 | 1 ms | 100 ms | 得出的结论 |
|---|---|---|---|
| 阶跃给定 + 矩形积分 + 时间累加计时 | 0.4104 | 0.4585 | 越慢越差(差 11.7%) |
| 阶跃给定 + 矩形积分 + 乘法计时 | 0.4095 | 0.3590 | 越慢越好(差 12.3%) |
| 斜坡给定 + 梯形积分 + 乘法计时 | 0.4102 | 0.4095 | 几乎无差别(差 0.3%) |
同一份植物、同一组 PI 参数、同一个指标。结论的差异全部来自对比方法,不来自控制系统。
原因
两个陷阱,都藏在实现细节里。
① 时间用累加,会在边界处漂移一整个周期。
t = 0.0
for _ in range(5000):
t += 1e-4 # 累加
# 结果:0.499999999999961,比 0.5 少 3.9e-14 秒
t >= 0.5 因此判为假,阶跃被推迟到下一个控制节拍——误差 3.9e-14 秒,后果是整整一个周期(100 ms)。IAE 多算了这一段,慢节拍因此"看起来更差"。改用 t = k * h 就消失了。
② 矩形积分在阶跃瞬间给慢节拍"踢一脚"。
integ += Ki · e · T
阶跃出现的第一个采样点,误差 e=1,积分项一次就增加了 Ki·T。T 越大,这一脚越重,慢节拍因此拿到更大的初始输出——于是又"看起来更好"。用梯形积分((e_prev+e)/2·T)并把给定改成斜坡,这一脚就被摊平了。
③ 排除这两个偏差后,真正的变量是 T 与对象时间常数之比。
采样保持相当于给环路加了约 T/2 的等效延迟。当 T ≪ τ 时,这点延迟相对对象动态可以忽略,继续缩短周期几乎没有收益;当 T 接近或超过 τ 时,延迟开始吃掉相位裕度,性能急剧恶化。
怎么做
要让"周期对比"可信,三条缺一不可:
- 参数不许随周期重调。 在连续域整定一次,按 T 离散化;否则你比的是调参,不是周期。
- 避免阶跃处的积分踢量。 用梯形积分,或把给定改成有时长的斜坡。
- 时间用乘法,不用累加。
t = k * h,并且让植物积分步长与 T 解耦(否则延迟会随 T 被"取整")。
import math, random
def sim(T, tau, L=0.01, kp=1.22, ki=2.44, noise=0.002, q=0.01,
ramp=0.1, horizon=8.0, h=1e-4, seed=3):
rnd = random.Random(seed)
buf = [0.0] * int(round(L / h)) # 固定物理延迟,与 T 无关
n_sub = max(1, int(round(T / h))) # 每周期植物步数
a, b = math.exp(-h / tau), 1 - math.exp(-h / tau)
x = integ = u = iae = 0.0
e_prev = 0.0
t0, t1 = 1.0, 1.0 + ramp # 斜坡给定,避免阶跃踢量
for k in range(int(horizon / h)):
t = k * h # 乘法计时,避免漂移
sp = 0.0 if t < t0 else (1.0 if t >= t1 else (t - t0) / ramp)
if k % n_sub == 0:
e = sp - (x + rnd.gauss(0, noise))
integ += ki * (e_prev + e) / 2 * T # 梯形积分
e_prev = e
u = min(1.5, max(-0.5, round((kp * e + integ) / q) * q))
x = a * x + b * buf.pop(0)
buf.append(u)
if t >= t0:
iae += abs(sp - x) * h
return iae
验证
同一控制器、同一整定,只改对象时间常数,扫描 7 个周期点:
| 周期 | τ = 0.5 s | τ = 20 ms |
|---|---|---|
| 1 ms | 0.4102 | 0.4095 |
| 2 ms | 0.4102 | 0.4095 |
| 5 ms | 0.4102 | 0.4094 |
| 10 ms | 0.4104 | 0.4088 |
| 20 ms | 0.4094 | 0.4100 |
| 50 ms | 0.4091 | 0.4039 |
| 100 ms | 0.4095 | 2.8337 |
- τ=0.5 s 这一列:从 1 ms 到 100 ms,IAE 在 0.4091–0.4104 之间摆动,相对差 0.3%——缩 100 倍周期换不到任何实质改善。
- τ=20 ms 这一列:T 到 50 ms 时仍只有 0.4039,但 T=100 ms(T/τ=5)跳到 2.8337,是其余各点的 7 倍。

改前用累加计时 → 改后改用乘法计时:同一实验、同一组数据,IAE 从 0.4585 变成 0.3590。先修测量方法,再谈控制结论。
边界
- 结论依赖对象模型:一阶惯性 + 10 ms 纯延迟 + PI。延迟占比更大时(如 L 与 τ 同量级),滞后期主导,可用的 T 会更小。
- "T/τ 在 0.2 以下几乎没有收益"是本文数据给出的经验边界,不是普遍定理;换指标(如超调、相位裕度)或换控制器(PID、前馈),分界点会移动。
- PI 没有微分项。加上 D 之后,噪声会被放大,过小周期的代价会明显增加。
- 本文全部数值是数值实验(模型与代码在文中),不是硬件实测;真实系统的噪声谱、量化台阶与执行器非线性会改变曲线形状。
- 指标只用了 IAE。若把执行器磨损、输出纹波、算力占用一起计入目标,最优点会向更长周期移动。
最后验证于 2026-10-29 · 数值实验(Python 3.13,植物步长 0.1 ms,7 个周期点 × 2 组时间常数)· 一阶对象 + 10 ms 纯延迟 + PI(连续域整定)