采样周期越短,控制就一定越好吗?

同一控制器下,τ=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 接近或超过 τ 时,延迟开始吃掉相位裕度,性能急剧恶化。

怎么做

要让"周期对比"可信,三条缺一不可:

  1. 参数不许随周期重调。 在连续域整定一次,按 T 离散化;否则你比的是调参,不是周期。
  2. 避免阶跃处的积分踢量。 用梯形积分,或把给定改成有时长的斜坡。
  3. 时间用乘法,不用累加。 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(连续域整定)

采样周期越短,控制就一定越好吗?

作者 JimmyZ,嵌入式 / 确定性控制方向。GitHub · 掘金