1. 一阶惯性系统PID阶跃响应整定

任务目标

构建一阶惯性系统(含纯滞后可选)的仿真模型,通过阶跃响应实验观察PID控制效果。调整Kp、Ki、Kd三个参数,使系统输出在无超调或超调量≤5%的前提下,尽可能缩短调节时间(进入±2%误差带)。

被控对象模型

一阶惯性系统传递函数:

G(s) = K / (T·s + 1)

本案例取增益K=2,时间常数T=5s。采用增量式PID控制算法,仿真步长0.1s,总时长30s,阶跃输入幅值1.0。

完整实现代码

import numpy as np
import matplotlib.pyplot as plt

# 被控对象参数
K = 2.0      # 系统增益
T = 5.0      # 时间常数(s)

# PID参数(初始值,需手动调整)
Kp = 2.0
Ki = 0.3
Kd = 0.5

# 仿真参数
dt = 0.1          # 采样周期(s)
t_end = 30.0      # 仿真时长(s)
t = np.arange(0, t_end, dt)
n = len(t)

# 阶跃输入
r = np.ones(n) * 1.0

# 初始化
y = np.zeros(n)   # 系统输出
e = np.zeros(n)   # 误差
u = np.zeros(n)   # 控制量
y_prev = 0.0      # 上一时刻输出(用于一阶惯性离散化)
e_prev = 0.0      # 上一时刻误差
e_sum = 0.0       # 误差积分项

# 一阶惯性系统离散化:y(k) = y(k-1) + dt/T * (K*u(k-1) - y(k-1))
for i in range(1, n):
    # 计算当前误差
    e[i] = r[i] - y_prev
    
    # 增量式PID
    delta_u = Kp * (e[i] - e_prev) + Ki * dt * e[i] + Kd * (e[i] - 2*e_prev + 0) / dt
    u[i] = u[i-1] + delta_u
    
    # 更新被控对象(一阶惯性)
    y[i] = y_prev + dt / T * (K * u[i] - y_prev)
    
    # 更新状态
    y_prev = y[i]
    e_prev = e[i]

# 计算性能指标
final_value = y[-1]
overshoot = 0.0
if np.max(y) > final_value:
    overshoot = (np.max(y) - final_value) / final_value * 100

# 调节时间(进入±2%误差带后不再超出)
settle_time = t_end
for i in range(n):
    if abs(y[i] - final_value) / final_value < 0.02:
        if np.all(abs(y[i:]) - final_value < 0.02 * final_value):
            settle_time = t[i]
            break

print(f"稳态值: {final_value:.3f}")
print(f"超调量: {overshoot:.2f}%")
print(f"调节时间: {settle_time:.1f}s")

# 绘制响应曲线
plt.figure(figsize=(10, 5))
plt.plot(t, r, 'k--', label='设定值', linewidth=1.5)
plt.plot(t, y, 'b-', label='系统输出', linewidth=2)
plt.axhline(y=final_value*1.02, color='r', linestyle=':', alpha=0.5)
plt.axhline(y=final_value*0.98, color='r', linestyle=':', alpha=0.5)
plt.xlabel('时间 (s)')
plt.ylabel('输出值')
plt.title('一阶惯性系统PID阶跃响应')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

运行与验证

运行方式:需要安装numpy和matplotlib,直接运行上述Python脚本即可。

整定步骤:

  1. 先将Ki和Kd设为0,仅用比例控制Kp。从Kp=0.5开始逐步增大,观察稳态误差变化(一阶系统纯比例控制存在稳态误差,这是正常现象);
  2. 加入积分作用Ki,消除稳态误差。从Ki=0.05开始缓慢增加,观察是否出现振荡;
  3. 若超调过大,加入微分作用Kd抑制超调。从Kd=0.1开始尝试;
  4. 反复微调三个参数,直到满足性能要求。

通过条件:

  • 超调量≤5%(无超调更佳);
  • 调节时间尽量短(当前参数下目标≤10s);
  • 稳态误差为0(积分作用生效)。

预期输出(使用上述初始参数):稳态值约为1.0,超调量约8%~15%,调节时间约8~12s。该参数组合超调偏大,需要增大Kd或减小Kp来改善。

参数整定参考

一组满足无超调要求的参数示例:Kp=1.0,Ki=0.15,Kd=1.2。修改代码中PID参数后重新运行,预期输出超调量接近0%,调节时间约6~8s。可通过观察响应曲线和打印的性能指标确认是否达标。

PID参数整定效果对比示意 时间 (s) 输出值 设定值=1.0 0 10 20 30 0 0.5 1.0 超调较大 (Kp=2.0, Ki=0.3, Kd=0.5) 无超调 (Kp=1.0, Ki=0.15, Kd=1.2) +2% -2% 约20s 约8s 红色曲线:超调约10%,调节慢 蓝色曲线:无超调,调节快 目标:蓝线优于红线

常见问题

  • 系统发散:Kp过大或Ki过大导致。立即减小Kp和Ki,先恢复稳定再逐步增加。
  • 稳态误差无法消除:Ki过小或未生效。检查Ki是否为正数,并逐步增大Ki。
  • 微分作用引起振荡:Kd过大或系统噪声敏感。减小Kd,或增大仿真步长dt。