当前位置: 首页 > news >正文

增量式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控制的优点包括:

  1. 计算简单:只需要当前和前几次的误差值。

  2. 易于实现:适合数字控制系统。

  3. 抗积分饱和:通过增量调整,可以避免积分项过大导致的系统不稳定。

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 参数调整方法

  1. 试凑法:通过不断调整参数,观察系统响应,找到合适的参数组合。

  2. Ziegler-Nichols法:一种经典的经验公式,用于快速确定PID参数。

  3. 自适应调整:根据系统运行状态动态调整PID参数。

5. 总结

增量式PID控制是一种简单而有效的控制算法,特别适合数字控制系统。通过本文的介绍和代码实现,大家可以快速理解和应用增量式PID控制来应用这个同等效果计算量小的方法。在实际应用中,根据具体需求调整PID参数,可以实现更好的控制效果。我是橙色小博,关注我,一起在人工智能领域学习进步!

相关文章:

  • 有效的完全平方数--LeetCode
  • HFSS3(limy)——建模学习记录
  • 工业级MIFI解决方案:打造低时延、高可靠性的Wi-Fi网络快速部署体系!
  • 【专刷】滑动窗口(一)
  • 字符串系列一>二进制求和
  • HTML5+CSS3小实例:CSS立方体
  • 在RK3588上使用哪个流媒体服务器合适
  • 性能比拼: Elixir vs Go(第二轮)
  • JAVA的泛型
  • C++项目 —— 基于多设计模式下的同步异步日志系统(3)(日志器类)
  • 前端面试中高频手撕[待补充]
  • BR_频谱20dB 带宽(RF/TRM/CA/BV-05-C [TX Output Spectrum – 20 dB Bandwidth])
  • RAG工程-基于LangChain 实现 Naive RAG
  • 从GET到POST:HTTP请求的攻防实战与CTF挑战解析
  • 嵌入式linux系统中内存管理的方法与实现
  • 筑基挑战 | 第14期
  • UI文件上传
  • AI与IT的共生
  • 小测验——已经能利用数据集里面的相机外参调整后看到渲染图像
  • 网页聊天系统项目
  • 生命与大海相连:他在300多米的深海行走,在沉船一线打捞救援
  • 迎接八方来客:全国多地“五一”假期党政机关大院停车场免费开放
  • 陕西省副省长窦敬丽已任宁夏回族自治区党委常委、统战部部长
  • 浙商银行外部监事高强无法履职:已被查,曾任建行浙江省分行行长
  • 北大深圳研究生院成立科学智能学院:培养交叉复合型人才
  • 癌症来临前,可能伪装成这几种常见病,千万别大意