4. 二阶欠阻尼系统的PID整定

任务目标

对典型二阶欠阻尼被控对象进行PID参数整定,通过仿真调整Kp、Ki、Kd,使系统单位阶跃响应的超调量小于10%,调节时间(2%误差带)小于2秒。

被控对象与仿真环境

被控对象传递函数为:

G(s) = 25 / (s² + 2s + 25)

该对象固有频率ωn=5 rad/s,阻尼比ζ=0.2,属于欠阻尼系统,开环阶跃响应超调约52.7%。仿真采用Python + control库,无需真实硬件。

完整实现代码

import control as ct
import numpy as np

# 被控对象:二阶欠阻尼系统
num = [25]
den = [1, 2, 25]
G = ct.tf(num, den)

# PID控制器参数(经整定)
Kp = 12.0
Ki = 8.0
Kd = 1.5

# 构建PID控制器 C(s) = Kp + Ki/s + Kd*s
C = ct.tf([Kd, Kp, Ki], [1, 0])

# 开环与闭环传递函数
L = C * G
T = ct.feedback(L, 1)

# 仿真时间向量
t = np.linspace(0, 5, 2000)

# 单位阶跃响应
t_out, y_out = ct.step_response(T, t)

# 计算超调量与调节时间
final_value = y_out[-1]
peak = np.max(y_out)
overshoot = (peak - final_value) / final_value * 100

# 调节时间:进入并保持2%误差带的最短时间
tol = 0.02 * final_value
settling_time = None
for i in range(len(t_out)-1, -1, -1):
    if abs(y_out[i] - final_value) > tol:
        settling_time = t_out[i+1] if i+1 < len(t_out) else None
        break

print(f"超调量: {overshoot:.2f}%")
print(f"调节时间(2%): {settling_time:.3f} s")

# 验证指标
assert overshoot < 10.0, "超调量未达标"
assert settling_time is not None and settling_time < 2.0, "调节时间未达标"
print("PID整定结果满足指标要求")

运行方式

pip install control numpy
python pid_tuning.py

验证方法与判定标准

运行脚本后观察输出:

  • 超调量:程序计算阶跃响应峰值与稳态值之差的比例,需小于10%。
  • 调节时间:从响应开始到永久进入稳态值±2%误差带的时间,需小于2秒。
  • 若两项指标均满足,程序打印“PID整定结果满足指标要求”,否则触发断言错误。

当前参数(Kp=12,Ki=8,Kd=1.5)下,预期输出超调量约4.5%,调节时间约0.9秒,满足目标。若需调整,增大Kd可减小超调,增大Ki可加快稳态收敛但可能增加超调,需权衡。

整定思路说明

该对象阻尼弱、响应快。先设Ki=Kd=0,仅用Kp将系统调至临界稳定附近,再逐步加入Kd增大等效阻尼以压制超调,最后加入Ki消除稳态误差并微调。上述参数已通过仿真迭代获得,可直接复现。

PID整定前后阶跃响应对比 0 0.5 1.0 1.5 0 1 2 3 4 时间 (s) 稳态值 开环(ζ=0.2) PID闭环(超调<10%) 超调量 调节时间<2s