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

经典控制论PID-实例-30 - jack

PID 控制模拟:咖啡锅炉温度控制

本仓库是一段经典的 PID(比例-积分-微分)控制 模拟代码,用离散时间仿真演示从「仅 P」到「P+I」再到「完整 PID」的调参过程,以及不同控制策略下的温度曲线现象。


一、PID 基本理论与公式

1.1 什么是 PID

PID 是一种根据设定值(setpoint)当前测量值(measured value)的偏差,计算控制量(如加热功率)的算法,广泛应用于温度、速度、液位等闭环控制。

控制器输出由三部分叠加而成:

环节 英文 作用
P Proportional 与当前误差成正比,误差大则输出大,响应快
I Integral 与误差的积分成正比,消除稳态误差(静差)
D Derivative 与误差的变化率成正比,抑制超调、加快稳定

1.2 连续时间公式

设设定值为 (r(t)),测量值为 (y(t)),误差 (e(t) = r(t) - y(t)),则 PID 输出为:

[
u(t) = K_p, e(t) + K_i \int_0^t e(\tau),d\tau + K_d,\frac{de(t)}{dt}
]

  • (K_p):比例增益
  • (K_i):积分增益
  • (K_d):微分增益

1.3 离散时间公式(本代码采用)

在数字控制中,以采样间隔 (\Delta t) 离散化后,第 (k) 步:

  • 误差:(e_k = r_k - y_k)
  • 积分(累加近似):(\sum e_k \cdot \Delta t)
  • 微分(差分近似):(\frac{e_k - e_{k-1}}{\Delta t}) 或对测量值求导(见下)

离散 PID 输出:

[
u_k = K_p, e_k + K_i \sum_{i=0}^{k} e_i,\Delta t + K_d,\frac{e_k - e_{k-1}}{\Delta t}
]

本代码中微分项采用「对测量值求导」(derivative on measurement),即用 (-\frac{y_k - y_{k-1}}{\Delta t}) 代替对误差的微分,在越过设定值时不会出现微分项突变,有利于减少超调和振荡。


二、模拟代码 tmp_ctrl.py 说明

2.1 项目结构

  • tmp_ctrl.py:主程序,包含 PID 类、一阶惯性+散热的热力学模型、三种调参对比与绘图。
  • pid_simulation.png:运行后生成的温度曲线图。

2.2 核心类:PIDController

def __init__(self, Kp, Ki, Kd, dt):
  • Kp, Ki, Kd:三个增益。
  • dt:采样/仿真步长(如 0.1 s)。
  • 内部维护:integral(误差积分)、prev_errorprev_measured(用于微分对测量值)。

输出计算:

output = Kp * error + Ki * integral + Kd * derivative
  • errorsetpoint - measured_value
  • integral:每步累加 error * dt(可在此基础上做积分限幅、抗饱和,本示例未做)。
  • derivative:采用 derivative on measurement
    • 公式:derivative = -(measured_value - prev_measured) / dt
    • 含义:对「测量值」随时间的变化率取反,温度上升越快,微分项越负,相当于「刹车」,且过设定值时不会因误差反号而产生微分尖峰。

2.3 被控对象:simulate_system

def simulate_system(Kp, Ki, Kd, duration=100, dt=0.1, setpoint=92.0):
  • 物理假设
    • 室温 20°C,目标温度 92°C。
    • 加热:功率 power 线性转化为温升,等效为 power * 0.5 * dt
    • 散热:与环境温差成正比,heat_loss = (current_temp - 20) * 0.05,每步减去 heat_loss * dt
  • 控制量:PID 输出 power 限制在 [0, 100](0%~100% 功率)。
  • 状态更新
    current_temp += (power * 0.5 - heat_loss) * dt
    即一阶惯性 + 线性散热的热力学模型。

因此,被控对象是带滞后的温度系统:加热有惯性,散热与温差有关,仅 P 控制会存在静差。

2.4 三种调参对比(三条曲线)

曲线 参数 说明
蓝线 Kp=5, Ki=0, Kd=0 仅 P 控制
橙线 Kp=5, Ki=2, Kd=0 P + I
绿线 Kp=3.5, Ki=0.8, Kd=2.5 完整 PID,且微分对测量值
  • 仿真时间 100 s,步长 0.1 s。
  • 绘图时红色虚线为目标 92°C。

2.5 运行与出图

  • 运行:python tmp_ctrl.py
  • 会在当前工作目录生成 pid_simulation.png,并在 Windows 下用默认程序打开;若无 GUI 环境则仅保存图片。

三、曲线现象解释

3.1 蓝线:Only P(Kp=5)

  • 现象:温度较快上升,但稳定在目标以下(约 90°C),与 92°C 存在约 2°C 的稳态误差(静差)
  • 原因
    • 仅比例控制时,输出 (u = K_p \cdot e)。
    • 要维持一定加热功率以抵消散热,必须保持 (e > 0),即温度必然低于设定值。
    • 因此纯 P 无法在带恒定负载(散热)的系统中消除静差

3.2 橙线:P + I(Ki=2)

  • 现象:温度会超过 92°C,出现明显超调(例如冲到约 107°C),然后经振荡逐渐稳定到 92°C。
  • 原因
    • 积分项会累积历史误差,把静差消除,最终能稳定在设定值。
    • 但积分具有「惯性」:接近目标时误差已变小,积分却已经累积得很大,导致控制量一时过大,温度冲过目标。
    • 没有微分「刹车」,超调与振荡较明显。

3.3 绿线:P + I + D(derivative on measurement)

  • 现象:升温较快,超调明显减小,较快平稳到 92°C,曲线更平滑。
  • 原因
    • 微分项对「测量值变化率」响应:升温越快,微分越负,输出被压低,相当于提前刹车。
    • 使用 derivative on measurement 后,在越过 92°C 的瞬间不会出现误差反号导致的微分尖峰,因此更稳定。
    • 同时 Kp、Ki 取适中值(3.5、0.8),配合 Kd=2.5,在抑制超调和保持响应速度之间取得平衡。

四、小结

  • PID 公式:离散形式为 P(误差)+ I(误差积分)+ D(误差或测量值的变化率);本代码采用对测量值的微分以减轻超调。
  • tmp_ctrl.py:实现了离散 PID 与一个简单的咖啡锅炉温度模型(加热+线性散热),并对比了 P、PI、PID 三条曲线。
  • 现象:P 有静差;P+I 消静差但易超调;P+I+D(含 derivative on measurement)在相同仿真下超调更小、收敛更平滑。

运行 python tmp_ctrl.py 即可复现上述三条温度曲线并得到 pid_simulation.png

import os
import sys
import numpy as np
import matplotlib.pyplot as pltclass PIDController:def __init__(self, Kp, Ki, Kd, dt):self.Kp = Kpself.Ki = Kiself.Kd = Kdself.dt = dtself.integral = 0self.prev_error = 0self.prev_measured = None  # for derivative-on-measurement, avoids spike when crossing setpointdef compute(self, setpoint, measured_value):error = setpoint - measured_valueself.integral += error * self.dt# derivative on measurement: dampens rate of temp rise, no spike when error flips at setpointif self.prev_measured is None:self.prev_measured = measured_valuederivative = -(measured_value - self.prev_measured) / self.dtself.prev_measured = measured_valueoutput = self.Kp * error + self.Ki * self.integral + self.Kd * derivativeself.prev_error = errorreturn outputdef simulate_system(Kp, Ki, Kd, duration=100, dt=0.1, setpoint=92.0):pid = PIDController(Kp, Ki, Kd, dt)time = np.arange(0, duration, dt)values = []current_temp = 20.0  # 初始室温for t in time:# 模拟物理环境:锅炉在散热,散失速度与温差成正比heat_loss = (current_temp - 20.0) * 0.05# PID 计算控制功率power = pid.compute(setpoint, current_temp)# 限制功率范围 (0% - 100%)power = max(0, min(100, power))# 温度更新 (功率增加温度,散热降低温度)current_temp += (power * 0.5 - heat_loss) * dtvalues.append(current_temp)return time, values# --- 模拟三个调试阶段 ---
# 1. 只调 P (存在静差)
t1, v1 = simulate_system(Kp=5.0, Ki=0.0, Kd=0.0)
# 2. 加入 I (消除静差但产生超调)
t2, v2 = simulate_system(Kp=5.0, Ki=2.0, Kd=0.0)
# 3. Full PID + derivative on measurement: moderate Kd to avoid discrete-time noise
t3, v3 = simulate_system(Kp=3.5, Ki=0.8, Kd=2.5)# --- 绘图 ---
plt.figure(figsize=(12, 6))
plt.axhline(y=92, color='r', linestyle='--', label='Target (92°C)')
plt.plot(t1, v1, label='Only P (Kp=5): Steady-state Error', alpha=0.8)
plt.plot(t2, v2, label='P + I (Ki=2): Overshoot occurs', alpha=0.8)plt.plot(t3, v3, label='P + I + D (Kp=3.5, Ki=0.8, Kd=2.5, deriv on meas)', linewidth=2)plt.title('PID Tuning Simulation: Coffee Boiler Temperature Control')
plt.xlabel('Time (s)')
plt.ylabel('Temperature (°C)')
plt.legend()
plt.grid(True)
# 先保存到当前工作目录(保证有写权限),再尝试打开
fig_path = os.path.join(os.getcwd(), "pid_simulation.png")
fig = plt.gcf()
fig.savefig(fig_path, dpi=150)
plt.close()
if os.path.exists(fig_path):if sys.platform == "win32":os.startfile(os.path.normpath(fig_path))else:os.system(f'{"open" if sys.platform == "darwin" else "xdg-open"} "{fig_path}"')
else:print("图片保存失败,请检查当前目录写权限:", os.getcwd())
http://www.jsqmd.com/news/413723/

相关文章:

  • 2026年安保服务与培训推荐:河南省鼎盛保安服务有限公司,校园/物业/海外多场景安保全覆盖 - 品牌推荐官
  • 自搭建 Tailscale DERP 服务器并使用客户端验证
  • 2026年彩印/手提/瓦楞/展示/定制箱子厂家推荐:崇州承文印刷厂全系产品供应 - 品牌推荐官
  • 2026年墨盒硒鼓回收厂家推荐:鑫赢耗材回收,原装/新旧/高价回收全品类服务 - 品牌推荐官
  • 2026年墙面/局部/老房/卫生间/二手房/厨卫翻新推荐:靓滔装饰专业焕新服务 - 品牌推荐官
  • 2026年水泵/大棚卷帘机智能控制器推荐:郑州海控电子科技,全系产品助力农业工业智能化升级 - 品牌推荐官
  • 2026年管链输送设备厂家推荐:山东意德粉体科技,粉体/链管/自动管链输送机全系解决方案 - 品牌推荐官
  • 每天学透1个知识点—Oracle性能调优之数据库的CPU突然飙升到100%
  • 2026通风排烟天窗推荐:靖江市坦贝尔环境科技,圆拱/薄型/电动采光等全系通风天窗专业供应 - 品牌推荐官
  • 【技术实践】JMG复牌场景下实时行情API的核心应用与问题解决
  • 2026年牧草/水稻/麦草/秸秆优质打捆网推荐:沈阳祥瑞塑业全系产品助力农业高效作业 - 品牌推荐官
  • 8周速成!从零到大模型开发,春招收割大厂Offer_2个月冲刺!S4-1春招冲刺营助你零基础拿下大厂Offer
  • 2026年 磁悬浮离心机厂家推荐排行榜:高效节能与静音运行技术领先品牌深度解析 - 品牌企业推荐师(官方)
  • 2026年HDPE给水管厂家推荐:贵州狮诚管业科技,多场景适配的优质管道解决方案 - 品牌推荐官
  • 手机短信误删别慌张!从系统功能到专业工具,全方位恢复指南
  • 2026年西安高铁货运快递哪家靠谱?适配各类运输需求 口碑优良更具保障 - 深度智识库
  • 2026矿物铸件厂家推荐:山东克莱蒙特新材料科技,无机/聚合物/机架/立柱全系产品供应 - 品牌推荐官
  • 2026年工业除尘器领域推荐:张家港市鑫圣威机械有限公司,除尘器配件及多类型除尘器专业供应 - 品牌推荐官
  • 2026年制冷配件厂家推荐排行榜,压缩机配件,中央空调配件,冷水机配件,高效节能与耐用性深度解析 - 品牌企业推荐师(官方)
  • 2026 厂房环保工程怎么选?专业设计施工一体化承包商推荐 - 品牌2025
  • 2026建筑保温玻璃纤维优质制造厂推荐榜:玻璃纤维企业、玻璃纤维优质厂家、玻璃纤维供应厂家、玻璃纤维供货商、玻璃纤维制造企业选择指南 - 优质品牌商家
  • 2026肥料挤压造粒机厂家推荐:郑州市天宇机械,硫酸铵/复合肥/有机肥等全系设备供应 - 品牌推荐官
  • 导师推荐!碾压级的AI论文网站 —— 千笔·专业论文写作工具
  • 2026成都代理记账优质服务商推荐榜 - 优质品牌商家
  • compose中 align使用小结
  • 2026年Q1滕州EFB启停蓄电池服务商深度测评与推荐 - 2026年企业推荐榜
  • 2026年汗蒸房设备厂家推荐:温泉度假村/高端酒店/洗浴中心/商用汗蒸房设备生产厂家实力解析 - 品牌推荐官
  • 2026年Q1优质花岗岩石材供应商盘点 - 2026年企业推荐榜
  • 女性益生菌排行榜更新!温和长效,解锁女性舒适养护新方式 - 速递信息
  • 2026年高考志愿填报指导服务推荐:金教育专业提供高考志愿填报、报志愿全流程支持 - 品牌推荐官