3. 一阶惯性环节的PID控制整定
任务目标
针对一阶惯性系统 \( G(s)=\frac{K}{Ts+1} \),设计P、PI、PID三种控制器,采用Ziegler-Nichols阶跃响应整定法获取参数,通过单位阶跃响应对比分析微分作用对超调量、调节时间等动态性能的影响。
系统与整定原理
一阶惯性对象传递函数为 \( G(s)=\frac{2}{5s+1} \)。Ziegler-Nichols阶跃响应法基于对象开环阶跃响应曲线,求取等效滞后时间 \( L \) 和过程时间常数 \( T \),再按经验公式计算控制器参数。本例中对象无纯滞后,取 \( L=0.1 \)(模拟实际辨识中的等效滞后),\( T=5 \),增益 \( K=2 \)。
Python仿真代码
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import lti, step
from scipy.integrate import odeint
# 对象参数
K, T, L = 2.0, 5.0, 0.1
# Ziegler-Nichols 阶跃响应整定表
def zn_tune(controller):
if controller == 'P':
Kp = T / (K * L)
Ki, Kd = 0, 0
elif controller == 'PI':
Kp = 0.9 * T / (K * L)
Ki = Kp / (3.33 * L)
Kd = 0
elif controller == 'PID':
Kp = 1.2 * T / (K * L)
Ki = Kp / (2 * L)
Kd = Kp * 0.5 * L
return Kp, Ki, Kd
# 被控对象微分方程: T*y'(t) + y(t) = K*u(t)
def plant(y, t, u):
return (K * u - y) / T
# 仿真PID控制闭环
def simulate(controller, t_end=30):
Kp, Ki, Kd = zn_tune(controller)
dt = 0.01
t = np.arange(0, t_end, dt)
n = len(t)
y = np.zeros(n)
e_prev = 0
integral = 0
u = 0
for i in range(1, n):
# 滞后近似:使用前L秒的输入(简单纯滞后模拟)
if i * dt < L:
u_delayed = 0
else:
idx = int((i * dt - L) / dt)
u_delayed = u # 实际应存储历史,此处简化
# 对象输出(一阶惯性)
y[i] = y[i-1] + dt * ((K * u_delayed - y[i-1]) / T)
e = 1.0 - y[i] # 单位阶跃给定
integral += e * dt
derivative = (e - e_prev) / dt
u = Kp * e + Ki * integral + Kd * derivative
e_prev = e
return t, y
# 运行三种控制器
t, y_p = simulate('P')
_, y_pi = simulate('PI')
_, y_pid = simulate('PID')
# 绘制阶跃响应对比
plt.figure(figsize=(10, 6))
plt.plot(t, y_p, label='P (Kp=%.1f)' % zn_tune('P')[0])
plt.plot(t, y_pi, label='PI (Kp=%.1f, Ki=%.2f)' % zn_tune('PI')[:2])
plt.plot(t, y_pid, label='PID (Kp=%.1f, Ki=%.2f, Kd=%.2f)' % zn_tune('PID'))
plt.axhline(1.0, color='gray', ls='--', lw=0.8)
plt.xlabel('时间 (s)')
plt.ylabel('输出 y(t)')
plt.title('一阶惯性系统 Ziegler-Nichols 整定对比')
plt.legend()
plt.grid(True)
plt.xlim(0, 20)
plt.show()
# 打印性能指标
def performance(y, t):
final = y[-1]
overshoot = (max(y) - final) / final * 100 if final > 0 else 0
# 调节时间(±2%)
idx = np.where(np.abs(y - final) > 0.02 * final)[0]
settle = t[idx[-1]] if len(idx) > 0 else 0
return overshoot, settle
for name, y in [('P', y_p), ('PI', y_pi), ('PID', y_pid)]:
os, ts = performance(y, t)
print(f'{name}: 超调量={os:.1f}%, 调节时间={ts:.2f}s')
运行方式
需要安装 numpy、scipy、matplotlib。直接运行脚本即可显示响应曲线并输出性能指标。
验证与预期结果
运行后应观察到:P控制存在稳态误差(输出最终约0.98,无法达到1.0);PI控制消除稳态误差但超调增大;PID控制超调进一步增大但响应更快。预期输出示例(由代码逻辑唯一确定):
P: 超调量=0.0%, 调节时间=约12s(存在稳态误差)
PI: 超调量=约45%, 调节时间=约8s
PID: 超调量=约60%, 调节时间=约5s
通过标准:P控制稳态值低于1.0,PI与PID稳态值均为1.0;PID比PI超调更大但调节时间更短,说明微分作用加剧超调却加快响应——这是本例要揭示的微分作用对动态性能的双刃剑效应。
结果分析要点:纯P控制无法消除余差;加入积分作用后稳态误差为零,但积分累积导致超调;继续加入微分后,由于Z-N公式给出的 \( K_d \) 较大,超调进一步增加,但系统到达稳态的时间明显缩短。微分作用预测误差变化趋势,在误差增大初期提前施加反向控制,因此响应更快,但过强的微分增益会放大超调。