增量式PID基础解析与代码实例:温控系统
目录
1. 前言
2. 增量式PID控制的基本原理
2.1 PID控制的基本概念
2.2 增量式PID控制的特点
3. 增量式PID控制的Python实现:温控系统
3.1 构建增量式PID控制器
3.2 使用增量式PID控制器
3.3 运行模拟
3.4 完整代码
4. 参数调整与优化
4.1 参数选择
4.2 参数调整方法
5. 总结
1. 前言
在工业控制和自动化领域,PID控制是一种非常经典的控制算法,广泛应用于温度、压力、速度等参数的调节。传统的PID控制算法直接计算控制量,而增量式PID控制则通过计算增量来调整控制量,具有计算简单、易于实现和适合数字控制等优点。本文将详细介绍增量式PID控制的原理,并通过Python代码实现一个完整的增量式PID控制器,帮助大家理解和应用这一技术。
传统PID可以去看:
《最最最基础常用的控制:PID【基础+代码实例:温控系统】》
2. 增量式PID控制的基本原理
2.1 PID控制的基本概念
PID控制是一种基于比例(Proportional)、积分(Integral)和微分(Derivative)的控制算法。它的基本思想是通过测量系统的当前值与目标值之间的误差,计算出控制量来调整系统,使误差趋近于零。
2.2 增量式PID控制的特点
增量式PID控制的核心在于计算控制量的增量,而不是直接计算控制量。其公式如下:
其实就是对PID公式求了个导,但是这样计算量更小。
其中:
-
Δu(k) 是当前时刻的控制增量
-
e(k) 是当前时刻的误差
-
Kp 是比例系数
-
Ki 是积分系数
-
Kd 是微分系数
增量式PID控制的优点包括:
-
计算简单:只需要当前和前几次的误差值。
-
易于实现:适合数字控制系统。
-
抗积分饱和:通过增量调整,可以避免积分项过大导致的系统不稳定。
3. 增量式PID控制的Python实现:温控系统
还是用我们熟悉的温控系统
3.1 构建增量式PID控制器
下面是增量式PID控制器的Python实现代码:
class IncrementalPID:def __init__(self, kp, ki, kd):"""初始化增量式PID控制器:param kp: 比例系数:param ki: 积分系数:param kd: 微分系数"""self.kp = kpself.ki = kiself.kd = kdself.e_prev = [0, 0, 0] # 保存最近三次的误差值def compute(self, target, current):"""计算控制增量:param target: 目标值:param current: 当前值:return: 控制增量"""# 计算误差e = target - current# 更新误差历史self.e_prev[2] = self.e_prev[1]self.e_prev[1] = self.e_prev[0]self.e_prev[0] = e# 计算增量控制量delta_u = (self.kp * (self.e_prev[0] - self.e_prev[1]) +self.ki * self.e_prev[0] +self.kd * (self.e_prev[0] - 2 * self.e_prev[1] + self.e_prev[2]))return delta_u
3.2 使用增量式PID控制器
为了验证增量式PID控制器的效果,我们构建一个简单的模拟环境,例如温度控制系统:
import matplotlib.pyplot as plt
import numpy as np# 模拟环境:温度控制系统
class TemperatureSystem:def __init__(self, initial_temp=20):self.temperature = initial_temp # 初始温度self.max_temp = 100 # 最大温度限制def update(self, control_signal, dt=1,K=0.1, alpha=0.05):"""更新温度:param control_signal: 控制信号:param dt: 时间步长"""# 模拟温度变化:控制信号越大,温度上升越快self.temperature = self.temperature + K * (control_signal - alpha * self.temperature)# 限制温度不超过最大值self.temperature = min(self.temperature, self.max_temp)def get_temperature(self):return self.temperature
3.3 运行模拟
# 初始化PID控制器和温度系统
pid = IncrementalPID(kp=0.5, ki=0.1, kd=0.05)
system = TemperatureSystem(initial_temp=20)
target_temp = 60 # 目标温度
total_time = 100 # 总时间步长
dt = 1 # 时间步长# 记录温度变化
time_steps = []
temperatures = []
control_signals = []# 模拟控制过程
current_temp = system.get_temperature()
for t in range(total_time):# 计算控制增量delta_u = pid.compute(target_temp, current_temp)# 计算当前控制信号(假设初始控制信号为0)if t == 0:control_signal = delta_uelse:control_signal += delta_u# 更新系统状态system.update(control_signal, dt)current_temp = system.get_temperature()# 记录数据time_steps.append(t)temperatures.append(current_temp)control_signals.append(control_signal)# 绘制结果
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(time_steps, temperatures)
plt.axhline(y=target_temp, color='r', linestyle='--', label='目标温度')
plt.xlabel('时间步长')
plt.ylabel('温度')
plt.title('温度变化')
plt.legend()plt.subplot(2, 1, 2)
plt.plot(time_steps, control_signals)
plt.xlabel('时间步长')
plt.ylabel('控制信号')
plt.title('控制信号变化')
plt.tight_layout()
plt.show()
3.4 完整代码
完整代码如下方便调试:
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rc("font",family='YouYuan')class IncrementalPID:def __init__(self, kp, ki, kd):"""初始化增量式PID控制器:param kp: 比例系数:param ki: 积分系数:param kd: 微分系数"""self.kp = kpself.ki = kiself.kd = kdself.e_prev = [0, 0, 0] # 保存最近三次的误差值def compute(self, target, current):"""计算控制增量:param target: 目标值:param current: 当前值:return: 控制增量"""# 计算误差e = target - current# 更新误差历史self.e_prev[2] = self.e_prev[1]self.e_prev[1] = self.e_prev[0]self.e_prev[0] = e# 计算增量控制量delta_u = (self.kp * (self.e_prev[0] - self.e_prev[1]) +self.ki * self.e_prev[0] +self.kd * (self.e_prev[0] - 2 * self.e_prev[1] + self.e_prev[2]))return delta_u# 模拟环境:温度控制系统
class TemperatureSystem:def __init__(self, initial_temp=20):self.temperature = initial_temp # 初始温度self.max_temp = 100 # 最大温度限制def update(self, control_signal, dt=1,K=0.1, alpha=0.05):"""更新温度:param control_signal: 控制信号:param dt: 时间步长"""# 模拟温度变化:控制信号越大,温度上升越快self.temperature = self.temperature + K * (control_signal - alpha * self.temperature)# 限制温度不超过最大值self.temperature = min(self.temperature, self.max_temp)def get_temperature(self):return self.temperature# 初始化PID控制器和温度系统
pid = IncrementalPID(kp=0.5, ki=0.1, kd=0.05)
system = TemperatureSystem(initial_temp=20)
target_temp = 70 # 目标温度
total_time = 200 # 总时间步长
dt = 1 # 时间步长# 记录温度变化
time_steps = []
temperatures = []
control_signals = []# 模拟控制过程
current_temp = system.get_temperature()
for t in range(total_time):# 计算控制增量delta_u = pid.compute(target_temp, current_temp)# 计算当前控制信号(假设初始控制信号为0)if t == 0:control_signal = delta_uelse:control_signal += delta_u# 更新系统状态system.update(control_signal, dt)current_temp = system.get_temperature()# 记录数据time_steps.append(t)temperatures.append(current_temp)control_signals.append(control_signal)# 绘制结果
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(time_steps, temperatures)
plt.axhline(y=target_temp, color='r', linestyle='--', label='目标温度')
plt.xlabel('时间步长')
plt.ylabel('温度')
plt.title('温度变化')
plt.legend()plt.subplot(2, 1, 2)
plt.plot(time_steps, control_signals)
plt.axhline(y=0, color='r', linestyle='--', label='0值')
plt.xlabel('时间步长')
plt.ylabel('控制信号')
plt.title('控制信号变化')
plt.tight_layout()
plt.legend()
plt.show()
4. 参数调整与优化
4.1 参数选择
-
比例系数 Kp:增大比例系数可以加快系统响应,但过大可能导致振荡。
-
积分系数 Ki:积分系数用于消除稳态误差,但过大可能导致系统不稳定。
-
微分系数 Kd:微分系数用于抑制超调,但过大可能导致系统响应变慢。
4.2 参数调整方法
-
试凑法:通过不断调整参数,观察系统响应,找到合适的参数组合。
-
Ziegler-Nichols法:一种经典的经验公式,用于快速确定PID参数。
-
自适应调整:根据系统运行状态动态调整PID参数。
5. 总结
增量式PID控制是一种简单而有效的控制算法,特别适合数字控制系统。通过本文的介绍和代码实现,大家可以快速理解和应用增量式PID控制来应用这个同等效果计算量小的方法。在实际应用中,根据具体需求调整PID参数,可以实现更好的控制效果。我是橙色小博,关注我,一起在人工智能领域学习进步!