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脚本即可。
整定步骤:
- 先将Ki和Kd设为0,仅用比例控制Kp。从Kp=0.5开始逐步增大,观察稳态误差变化(一阶系统纯比例控制存在稳态误差,这是正常现象);
- 加入积分作用Ki,消除稳态误差。从Ki=0.05开始缓慢增加,观察是否出现振荡;
- 若超调过大,加入微分作用Kd抑制超调。从Kd=0.1开始尝试;
- 反复微调三个参数,直到满足性能要求。
通过条件:
- 超调量≤5%(无超调更佳);
- 调节时间尽量短(当前参数下目标≤10s);
- 稳态误差为0(积分作用生效)。
预期输出(使用上述初始参数):稳态值约为1.0,超调量约8%~15%,调节时间约8~12s。该参数组合超调偏大,需要增大Kd或减小Kp来改善。
参数整定参考
一组满足无超调要求的参数示例:Kp=1.0,Ki=0.15,Kd=1.2。修改代码中PID参数后重新运行,预期输出超调量接近0%,调节时间约6~8s。可通过观察响应曲线和打印的性能指标确认是否达标。
常见问题
- 系统发散:Kp过大或Ki过大导致。立即减小Kp和Ki,先恢复稳定再逐步增加。
- 稳态误差无法消除:Ki过小或未生效。检查Ki是否为正数,并逐步增大Ki。
- 微分作用引起振荡:Kd过大或系统噪声敏感。减小Kd,或增大仿真步长dt。