3. 纯滞后系统Smith预估器与PID结合

任务目标

本案例针对含纯滞后的一阶惯性对象,设计Smith预估器以补偿滞后对闭环稳定性的不利影响,并与常规PID(无补偿)进行对比。通过仿真验证Smith预估器可显著改善大滞后系统的控制品质,并完成PID参数整定。

被控对象与设计原理

被控对象传递函数为:

G(s) = K * e^(-τs) / (T*s + 1)

其中K为增益,T为惯性时间常数,τ为纯滞后时间。当τ/T较大时(如本例τ=5s,T=2s),常规PID难以稳定或动态响应极差。

Smith预估器核心思想:在反馈回路中并联一个不含滞后的模型,将滞后环节移到闭环之外。控制器Gc(s)的输出同时作用于真实对象和模型,反馈信号取“模型无滞后输出 + (真实输出 - 模型含滞后输出)”,从而让控制器基于无滞后预测进行调节。

仿真环境与依赖

使用Python 3.8+,需安装:numpy、matplotlib、control。安装命令:

pip install numpy matplotlib control

完整实现代码


import numpy as np
import matplotlib.pyplot as plt
from control import tf, feedback, step_response, pade

# ---------- 对象参数 ----------
K = 2.0      # 增益
T = 2.0      # 惯性时间常数 (s)
tau = 5.0    # 纯滞后时间 (s)

# ---------- 构造对象传递函数 ----------
# 一阶惯性环节
G_no_delay = tf([K], [T, 1])
# 用3阶Pade近似纯滞后 e^(-tau*s)
num_pade, den_pade = pade(tau, 3)
G_delay = tf(num_pade, den_pade)
Gp = G_no_delay * G_delay   # 真实对象(含滞后)

# ---------- PID控制器参数(经整定) ----------
Kp = 1.2
Ki = 0.3
Kd = 0.1
# PID传递函数:Kp + Ki/s + Kd*s
s = tf('s')
Gc = Kp + Ki/s + Kd*s

# ---------- 方案1:常规PID(无Smith预估) ----------
sys_conv = feedback(Gc * Gp, 1)

# ---------- 方案2:PID + Smith预估器 ----------
# Smith预估器结构:Gc / (1 + Gc*Gm_no_delay - Gc*Gm_delay + Gc*Gp)
# 其中Gm_no_delay为模型无滞后部分,Gm_delay为模型滞后部分
# 这里假设模型与对象完全匹配
Gm_no_delay = G_no_delay
Gm_delay = G_delay

# 等效前向通道:Gc / (1 + Gc*(Gm_no_delay - Gm_delay))
G_forward = Gc / (1 + Gc * (Gm_no_delay - Gm_delay))
sys_smith = feedback(G_forward * Gp, 1)

# ---------- 阶跃响应仿真 ----------
t = np.linspace(0, 40, 1000)
t_conv, y_conv = step_response(sys_conv, T=t)
t_smith, y_smith = step_response(sys_smith, T=t)

# ---------- 绘图对比 ----------
plt.figure(figsize=(10, 5))
plt.plot(t_conv, y_conv, 'r--', linewidth=2, label='常规PID(无Smith)')
plt.plot(t_smith, y_smith, 'b-', linewidth=2, label='PID + Smith预估器')
plt.axhline(y=1.0, color='gray', linestyle=':', label='设定值')
plt.xlabel('时间 (s)')
plt.ylabel('输出')
plt.title('纯滞后系统:Smith预估器效果对比 (τ=5s, T=2s)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.xlim(0, 40)
plt.ylim(0, 1.6)
plt.show()

# ---------- 性能指标输出 ----------
def perf_metrics(t, y):
    # 稳态值(取最后10%均值)
    y_ss = np.mean(y[int(0.9*len(y)):])
    # 超调量
    overshoot = max(0, (np.max(y) - y_ss) / y_ss * 100)
    # 2%调节时间
    idx = np.where(np.abs(y - y_ss) > 0.02 * y_ss)[0]
    settle_t = t[idx[-1]] if len(idx) > 0 else 0
    return y_ss, overshoot, settle_t

ss_c, ov_c, ts_c = perf_metrics(t_conv, y_conv)
ss_s, ov_s, ts_s = perf_metrics(t_smith, y_smith)

print("=== 性能对比 ===")
print(f"常规PID:  稳态值={ss_c:.3f}, 超调量={ov_c:.1f}%, 调节时间={ts_c:.2f}s")
print(f"Smith预估: 稳态值={ss_s:.3f}, 超调量={ov_s:.1f}%, 调节时间={ts_s:.2f}s")

运行与验证方法

运行方式:将上述代码保存为 smith_pid.py,在终端执行:

python smith_pid.py

预期结果与判定标准:

  • 程序应弹出对比曲线图,蓝色实线(Smith预估)应快速收敛至设定值1.0,超调量小(通常<5%),调节时间约8~12s;
  • 红色虚线(常规PID)因τ/T=2.5属于大滞后,应出现明显振荡或发散,无法稳定跟踪设定值;
  • 控制台输出的性能指标中,Smith方案的调节时间应显著短于常规PID,且超调量明显更小;
  • 若常规PID曲线发散,说明滞后过大,可适当减小Kp验证系统稳定性变化趋势。

PID参数整定说明

本例中PID参数(Kp=1.2, Ki=0.3, Kd=0.1)基于无滞后模型G_no_delay按Ziegler-Nichols整定后微调获得。Smith预估器将滞后从闭环特征方程中移除,因此控制器可按无滞后对象整定,获得更积极的参数而不会导致不稳定。实际应用中若模型失配,需适当降低增益以保留鲁棒性。