2. 二阶欠阻尼系统PID参数整定
任务目标
针对典型二阶欠阻尼被控对象,采用Ziegler-Nichols临界比例度法(临界振荡法)整定PID参数,并通过阶跃响应验证系统的稳定性与动态性能指标。
被控对象与整定原理
设被控对象传递函数为:
G(s) = 1 / (s² + 0.6s + 1)
该对象阻尼比ζ=0.3,为欠阻尼二阶系统。Ziegler-Nichols临界比例度法步骤如下:
- 令PID控制器中Ti=∞,Td=0,仅保留比例增益Kp;
- 逐步增大Kp,直至系统输出出现等幅持续振荡,记录此时临界增益Ku与振荡周期Tu;
- 按经验公式计算PID参数:Kp=0.6Ku,Ti=0.5Tu,Td=0.125Tu。
关键完整代码
以下Python代码完成临界增益搜索、PID参数计算及阶跃响应仿真验证:
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# 被控对象
num = [1.0]
den = [1.0, 0.6, 1.0]
sys = signal.TransferFunction(num, den)
# 1. 搜索临界增益Ku(使闭环系统等幅振荡)
def closed_loop_poles(Kp):
# 单位反馈闭环特征多项式: den + Kp*num
closed_den = np.polyadd(den, [Kp*x for x in num])
return np.roots(closed_den)
# 通过根轨迹穿越虚轴确定Ku
Ku = None
Tu = None
for Kp in np.linspace(0.1, 5.0, 5000):
poles = closed_loop_poles(Kp)
for p in poles:
if abs(p.real) < 1e-6 and abs(p.imag) > 1e-6:
Ku = Kp
wu = abs(p.imag)
Tu = 2*np.pi/wu
break
if Ku is not None:
break
print(f"临界增益 Ku = {Ku:.4f}")
print(f"临界振荡周期 Tu = {Tu:.4f} s")
# 2. Ziegler-Nichols整定公式
Kp_zn = 0.6 * Ku
Ti_zn = 0.5 * Tu
Td_zn = 0.125 * Tu
Ki_zn = Kp_zn / Ti_zn
Kd_zn = Kp_zn * Td_zn
print(f"ZN整定: Kp={Kp_zn:.4f}, Ki={Ki_zn:.4f}, Kd={Kd_zn:.4f}")
# 3. 构建PID控制器并仿真阶跃响应
# PID传递函数: C(s) = Kp + Ki/s + Kd*s
pid_num = [Kd_zn, Kp_zn, Ki_zn]
pid_den = [1.0, 0.0] # 纯积分项1/s
ctrl = signal.TransferFunction(pid_num, pid_den)
# 开环传递函数
open_loop = signal.series(ctrl, sys)
# 闭环传递函数
closed_loop = signal.feedback(open_loop, 1)
# 阶跃响应
t = np.linspace(0, 30, 3000)
t, y = signal.step(closed_loop, T=t)
# 4. 动态性能指标计算
final_value = y[-1]
# 超调量
overshoot = (np.max(y) - final_value) / final_value * 100
# 峰值时间
peak_idx = np.argmax(y)
peak_time = t[peak_idx]
# 调节时间(±2%误差带)
error_band = 0.02 * final_value
settle_idx = np.where(np.abs(y - final_value) > error_band)[0]
settle_time = t[settle_idx[-1]] if len(settle_idx) > 0 else 0
print(f"稳态值 = {final_value:.4f}")
print(f"超调量 = {overshoot:.2f}%")
print(f"峰值时间 = {peak_time:.2f} s")
print(f"调节时间(±2%) = {settle_time:.2f} s")
# 5. 绘制阶跃响应曲线
plt.figure(figsize=(8, 5))
plt.plot(t, y, 'b-', linewidth=2, label='ZN整定PID阶跃响应')
plt.axhline(y=final_value, color='gray', linestyle='--', alpha=0.7)
plt.axhline(y=1.02*final_value, color='r', linestyle=':', alpha=0.5, label='±2%误差带')
plt.axhline(y=0.98*final_value, color='r', linestyle=':', alpha=0.5)
plt.xlabel('时间 (s)')
plt.ylabel('输出 y(t)')
plt.title('二阶欠阻尼系统ZN法整定后阶跃响应')
plt.legend()
plt.grid(True, alpha=0.3)
plt.xlim([0, 30])
plt.ylim([0, 1.6])
plt.show()
运行方式与依赖
需要安装Python环境及NumPy、SciPy、Matplotlib库:
pip install numpy scipy matplotlib
将上述代码保存为zn_pid_tuning.py,在终端执行:
python zn_pid_tuning.py
验证方法与判定标准
运行代码后,控制台应输出临界增益Ku、临界周期Tu及整定后的PID参数。判定整定成功的标准为:
- 稳定性:阶跃响应曲线最终收敛至稳态值1.0,无发散振荡;
- 动态性能:超调量约在30%~50%范围内(ZN法典型特征),调节时间有限且曲线在±2%误差带内稳定;
- 参数合理性:Ku约为1.0(该对象理论临界增益为1.0),Tu约为6.28s(对应无阻尼自然频率ωn=1 rad/s)。
若输出曲线出现持续等幅振荡或发散,说明整定参数计算有误,需检查临界增益搜索逻辑。