自动控制:微分先行PID控制算法

自动控制:微分先行PID控制算法

微分先行PID控制算法是一种改进型的PID控制策略,其特点是只对被控量 y ( k ) y(k) y(k) 进行微分,而不对偏差 e ( k ) e(k) e(k) 进行微分,即给定值 r ( k ) r(k) r(k) 无微分作用。这种控制策略适用于给定值频繁升降的场合,可以避免给定值升降所引起的系统振荡,明显改善系统的动态特性。

微分先行PID控制算法理论

传统PID控制器的控制律为:

u ( t ) = K p e ( t ) + K i ∫ e ( t )   d t + K d d e ( t ) d t u(t) = K_p e(t) + K_i \int e(t) \, dt + K_d \frac{d e(t)}{dt} u(t)=Kpe(t)+Kie(t)dt+Kddtde(t)

其中:

  • u ( t ) u(t) u(t) 是控制输入
  • e ( t ) = r ( t ) − y ( t ) e(t) = r(t) - y(t) e(t)=r(t)y(t) 是误差信号
  • K p K_p Kp 是比例增益
  • K i K_i Ki 是积分增益
  • K d K_d Kd 是微分增益

在传统PID控制器中,微分项对误差信号 e ( t ) e(t) e(t) 进行微分。当给定值 r ( t ) r(t) r(t) 频繁变化时,误差信号 e ( t ) e(t) e(t) 的微分会引起较大的控制输入波动,导致系统振荡。

微分先行PID控制器

微分先行PID控制器通过对被控量 y ( k ) y(k) y(k) 进行微分,避免了给定值频繁变化对系统的影响。其控制律为:

u ( t ) = K p e ( t ) + K i ∫ e ( t )   d t − K d d y ( t ) d t u(t) = K_p e(t) + K_i \int e(t) \, dt - K_d \frac{d y(t)}{dt} u(t)=Kpe(t)+Kie(t)dtKddtdy(t)

其中:

  • d y ( t ) d t \frac{d y(t)}{dt} dtdy(t) 是被控量 y ( t ) y(t) y(t) 的微分

公式推导

微分先行PID控制器的控制律可以通过以下步骤推导得到:

  1. 定义误差信号:

e ( t ) = r ( t ) − y ( t ) e(t) = r(t) - y(t) e(t)=r(t)y(t)

其中, r ( t ) r(t) r(t) 是期望输出, y ( t ) y(t) y(t) 是实际输出。

  1. 计算比例项:

P ( t ) = K p e ( t ) P(t) = K_p e(t) P(t)=Kpe(t)

  1. 计算积分项:

I ( t ) = K i ∫ e ( t )   d t I(t) = K_i \int e(t) \, dt I(t)=Kie(t)dt

  1. 计算被控量的微分项:

D ( t ) = − K d d y ( t ) d t D(t) = -K_d \frac{d y(t)}{dt} D(t)=Kddtdy(t)

  1. 综合控制律:

u ( t ) = P ( t ) + I ( t ) + D ( t ) u(t) = P(t) + I(t) + D(t) u(t)=P(t)+I(t)+D(t)

Python代码示例

下面是一个实现微分先行PID控制器的Python代码示例。假设我们有一个简单的温度控制系统,通过微分先行PID控制器保持系统温度在期望值。

import numpy as np
import matplotlib.pyplot as plt

# 定义系统参数
dt = 0.1  # 时间步长
t = np.arange(0, 20, dt)  # 时间数组
n = len(t)

# 初始化状态变量
temperature = np.zeros(n)  # 系统温度
desired_temperature = np.zeros(n)  # 期望温度
desired_temperature[100:] = 50  # 期望温度从时间t=10s开始为50
external_disturbance = np.sin(t) * 5  # 外界扰动

# 控制器参数
Kp = 2.0  # 比例增益
Ki = 1.0  # 积分增益
Kd = 0.5  # 微分增益

# 初始化误差变量
e_prev = 0  # 上一时刻的误差
integral = 0  # 误差积分
y_prev = 0  # 上一时刻的输出

# 模拟系统
for i in range(1, n):
    # 计算误差
    e = desired_temperature[i] - temperature[i-1]
    
    # 误差积分
    integral += e * dt
    
    # 被控量的微分项
    derivative = (temperature[i-1] - y_prev) / dt
    
    # 微分先行PID控制器
    u = Kp * e + Ki * integral - Kd * derivative
    
    # 更新系统温度
    temperature[i] = temperature[i-1] + (u + external_disturbance[i]) * dt
    
    # 更新上一时刻的误差和输出
    e_prev = e
    y_prev = temperature[i-1]

# 绘制结果
plt.figure(figsize=(10, 4))
plt.plot(t, desired_temperature, label='Desired Temperature')
plt.plot(t, temperature, label='Actual Temperature')
plt.plot(t, external_disturbance, label='External Disturbance')
plt.xlabel('Time [s]')
plt.ylabel('Temperature')
plt.legend()
plt.title('Derivative Leading PID Control for Temperature System')
plt.grid(True)
plt.show()

在这里插入图片描述

代码解释

  1. 系统参数和时间数组:定义了时间步长 dt 和时间数组 t,用来模拟系统在一段时间内的行为。
  2. 状态变量初始化:初始化了系统温度 temperature、期望温度 desired_temperature 和外界扰动 external_disturbance
  3. 控制器参数:定义了微分先行PID控制器的比例增益 Kp、积分增益 Ki 和微分增益 Kd
  4. 误差变量初始化:初始化了上一时刻的误差 e_prev、误差积分 integral 和上一时刻的输出 y_prev
  5. 系统模拟:通过迭代计算,在每个时间步长内根据微分先行PID控制律计算控制输入,并更新系统温度。
  6. 结果绘制:使用 matplotlib 绘制系统温度、期望温度和外界扰动的变化曲线。

结论

微分先行PID控制器通过对被控量进行微分,避免了给定值频繁变化对系统的影响,从而减少了控制输入的波动,提高了系统的稳定性和响应速度。在实际应用中,微分先行PID控制器适用于给定值频繁升降的场合,能够显著改善系统的动态特性。结合Python代码示例,可以更直观地理解微分先行PID控制器的基本原理和实现方法。