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消除稳态误差并微调。上述参数已通过仿真迭代获得,可直接复现。