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超调更大但调节时间更短,说明微分作用加剧超调却加快响应——这是本例要揭示的微分作用对动态性能的双刃剑效应。

时间 (s) y(t) 1.0 P PI PID 0 10 20

结果分析要点:纯P控制无法消除余差;加入积分作用后稳态误差为零,但积分累积导致超调;继续加入微分后,由于Z-N公式给出的 \( K_d \) 较大,超调进一步增加,但系统到达稳态的时间明显缩短。微分作用预测误差变化趋势,在误差增大初期提前施加反向控制,因此响应更快,但过强的微分增益会放大超调。