ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

大滞后温度回路控制:Smith预估器+RBF在线辨识+模糊控制的Simulink实现

大滞后温度回路控制:Smith预估器+RBF在线辨识+模糊控制的Simulink实现 接手大滞后温度回路的仿真课题时我最初的想法很简单PID加Smith预估器这是自动控制教材里对付纯滞后的标准答案。可真把Smith在Simulink里跑起来问题立刻暴露——模型精度稍有偏差Smith的补偿效果就明显变差甚至比不用Smith还糟糕。于是我把RBF神经网络和模糊控制逐步引入这套Smith框架让RBF在线辨识对象模型来修正Smith的内部模型让模糊控制负责主控制器的参数自适应整定最终在Simulink里搭出一套能应对模型漂移的大滞后控制系统。这篇文章就是这次探索的完整记录原理、架构、Simulink搭建步骤、参数设计和踩坑过程给计划做类似仿真的朋友一条可参考的路径。1. 大滞后系统为什么难控制先看对象再谈控制器1.1 纯滞后在频域里做了什么手脚大滞后系统的难本质上不是增益不够而是相位滞后把稳定裕度吃掉了。考虑一个典型的一阶惯性加纯滞后对象G(s) K / (T·s 1) · e^(-τ·s)在频域里一阶惯性环节在穿越频率附近贡献约-90°相位而纯滞后环节 e^(-τ·s) 贡献的相位是 -ωτ。如果τ比较大比如接近甚至超过对象时间常数T穿越频率附近的总相位很容易低于-180°相位裕度变成负值闭环就会振荡甚至发散。这个结论引出一个重要直觉如果想让闭环响应快就必须提高穿越频率但穿越频率一提滞后带来的相位惩罚就更大于是陷入调快了发散、调慢了蜗牛的两难。温度、化工反应、管道流量、长距离传输这类过程对象几乎都有这个通病。我做仿真时用了一组典型参数K5、T20s、τ5sτ/T0.25还不算特别极端就已经能明显感受到PID的局限。1.2 Smith预估器把滞后从闭环内踢出去Smith预估器的高明之处在于它不去和滞后硬碰硬而是利用模型把滞后挪到闭环外。如果已知对象可以分解为无延迟部分 G0(s) 和纯延迟 e^(-τ·s)就可在反馈通道中构造一个辅助信号用内部模型 G0m(s) 算出无延迟输出再让实际输出与延迟后的模型输出做差把这个差值叠加到反馈信号上。控制器看到的反馈量近似等于无延迟输出控制器就可以按一个不带滞后的对象去设计闭环特征方程中只剩下 1 C(s)·G0(s)稳定性不再受滞后影响。理想情况下闭环传递函数是Y(s)/R(s) C(s)·G0(s)·e^(-τ·s) / (1 C(s)·G0(s))也就是说滞后部分变成了一个单纯的输出延迟闭环动态特性完全由无延迟模型决定。响应速度可以从被滞后拖死变成只被延迟拖慢这是质的改善。1.3 内部模型精度一切补偿的前提这里必须说清楚一个容易被忽略的点Smith预估器所有美妙的性质都建立在G0(s)和τ是准确的这个前提上。一旦内部模型和实际对象有偏差控制器看到的反馈量就不再等于无延迟输出补偿就会失效更麻烦的是失配还会引入额外的闭环极点严重时闭环比不用Smith还差。在我做的温度对象上用固定参数模型做Smith仿真时效果非常好阶跃响应几乎完美。但把对象时间常数人为调大15%后系统开始出现周期振荡超调量一下子到了30%以上。这个实验促使我去寻找让内部模型自我修正的办法也直接引出了后面的RBF方案。2. Smith控制器的命门模型失配与在线辨识需求2.1 模型失配是如何让补偿失效的从传递函数层面看Smith预估器的补偿信号是 y_hat·(1 - e^(-τ·s))其中 y_hat 是内部模型输出。如果内部模型 G0m(s) 与真实 G0(s) 不一致那么这个补偿信号就不等于真实对象中延迟前与延迟后的差值反馈到控制器端的信号里就会混入模型误差项误差项 [G0(s) - G0m(s)]·(1 - e^(-τ·s))·u这个误差项在闭环中相当于一个额外的扰动通道更关键的是它会在特征方程中引入与模型失配相关的极点。失配越大这些极点越靠近虚轴系统就越容易从稳定但偏差滑向振荡甚至发散。我实测的一个典型现象是增益失配时闭环出现稳态偏差时间常数失配时出现低频振荡。前者还容易用积分消除后者就麻烦得多因为振荡频率往往落在控制器带宽附近PID很难在不牺牲响应速度的前提下把它压下去。2.2 对象参数漂移是常态离线标定不够用实际过程对象几乎没有参数恒定的时候。温度回路会随着工况、环境温度和换热介质流量变化其增益和时间常数都在漂移管道滞后也会随流量变化。如果Smith内部模型靠一次离线辨识定死运行一段时间后模型误差就会重新累积起来。这让我意识到Smith要真正落地内部模型必须在线更新。问题变成用什么算法在线辨识对象并且这个算法要能在Simulink里方便实现还要有较好的实时性。2.3 在线辨识选型为什么是RBF而不是BP或递推最小二乘在线辨识有几种常见选择我简单对比一下递推最小二乘RLS线性参数模型下效果很好收敛也快。但对非线性对象、模型阶次不确定的场景很吃力而且需要事先确定模型结构。BP神经网络理论上能逼近任意非线性但训练收敛慢在线环境下还容易陷入局部极小梯度计算也复杂。RBF神经网络隐含层是径向基函数具有局部逼近特性输出层只是线性加权和。它的在线学习速度比BP快一个数量级结构简单非常适合在线辨识、实时修正这个场景。我最终选了RBF。它在Simulink里的实现也干净一个MATLAB Function块就能搞定不用额外装工具箱后面生成C代码也方便。3. RBF在线辨识如何给Smith配一个会学习的内部模型3.1 RBF网络结构与在线学习算法RBF网络的结构很直观输入层接收状态向量隐含层每个节点对应一个高斯径向基函数输出层把隐含层输出做线性加权。假设输入向量 x [u(k), u(k-1), y(k), y(k-1)]^T隐含层第 j 个节点的输出为h_j exp(-||x - c_j||² / (2·b_j²))其中 c_j 是第 j 个节点的中心向量b_j 是基宽。网络输出为y_hat Σ w_j · h_j权值更新用梯度下降w_j ← w_j η · e_model · h_j其中 e_model 是模型误差η 是学习率。由于输出层是线性的这个误差对权值的梯度计算非常直接不需要BP那样逐层反传这也是RBF在线收敛快的重要原因。3.2 辨识对象与Smith补偿的衔接方式这里有个关键设计问题RBF到底辨识什么我采用的做法是让RBF辨识无延迟对象模型的输出 y_hat也就是原对象去掉纯滞后部分 G0(s) 的输出。然后在Simulink里把 y_hat 再经过一个同样的 Transport Delayτ得到 y_hat_delay用它和对象实际输出 y 比较e_model y - y_hat_delay这个 e_model 有两个用途一是作为Smith补偿信号的一部分二是作为RBF权值更新的监督误差。这样做的好处是目标自洽——RBF学习的方向就是让Smith的模型误差最小化模型越准补偿效果越好。3.3 Simulink中RBF模块的代码实现我用MATLAB Function块写RBF辨识器代码如下function y_hat rbf_online(u, y, y_hat_delay) % RBF在线辨识无延迟对象模型用于Smith预估器内部模型自适应 % 输入u 控制量y 对象实际输出含延迟y_hat_delay RBF输出延迟tau后的值 % 输出y_hat 无延迟模型输出 persistent W c sigma u_pre y_pre if isempty(W) % 6个隐含节点4维输入 W 0.05 * randn(6, 1); c [-1.2 -1.2 -1.2 -1.2; -0.6 -0.6 -0.6 -0.6; 0.0 0.0 0.0 0.0; 0.6 0.6 0.6 0.6; 1.2 1.2 1.2 1.2; 1.8 1.8 1.8 1.8]; sigma 0.6 * ones(6, 1); u_pre 0; y_pre 0; end % 输入向量u(k), u(k-1), y(k), y(k-1) x [u; u_pre; y; y_pre]; % 隐含层输出 h exp(-sum((x - c).^2, 2) ./ (2 * sigma.^2)); % 网络输出 y_hat W * h; % 权值更新用 y - y_hat_delay 作为监督误差 error y - y_hat_delay; lr 0.05; W W lr * error * h; % 刷新历史值 u_pre u; y_pre y; end这段代码有几个要注意的点persistent变量在Simulink里是允许的但每个仿真步都会执行一次所以初始化逻辑要放在isempty判断里输入向量的范围最好归一化到[-1, 1]附近否则高斯函数容易饱和学习率不能贪大我试过0.1以上前期容易震荡。4. 模糊控制器负责参数自适应的那块拼图4.1 模糊控制器在整体架构中的角色分工RBF解决的是Smith内部模型的准确性问题但主控制器的参数整定是另一件事。即使模型准确了被控对象增益漂移时固定参数的PID依然会出现超调变大或响应变慢的问题。我给主控制器设计了一个模糊增益修正环节模糊控制器根据当前误差 e 和误差变化率 ec实时输出 PID 比例增益 Kp 的修正量 ΔKp。这个设计让主控制器不依赖精确的对象模型而是依据系统的宏观行为来调整自己的激进程度正好和Smith/RBF形成互补。4.2 模糊控制器设计变量、隶属度与规则表模糊控制器采用两输入单输出结构输入1误差 e论域[-3, 3]归一化输入2误差变化率 ec论域[-1, 1]输出ΔKp论域[-0.5, 0.5]每个变量划分5个模糊子集NB负大、NS负小、ZO零、PS正小、PB正大隶属度函数用三角形函数简单实用。规则表设计如下ΔKpeNBeNSeZOePSePBecNBPBPMPSPMPBecNSPMPSPSPSPMecZOPSZOZOZOPSecPSPMPSNSNSNMecPBPBPMNMNMNB这里的设计逻辑是误差大且误差还在朝背离方向变化ec与e同号且都大时需要大幅增加Kp把系统拉回来误差小且变化率也小时说明系统趋于稳定Kp适当回落到基准值避免超调误差变化率与误差方向相反时系统正在回归则克制Kp防止过冲。最终生效的Kp Kp_base ΔKpKi保持基准值Kd在一阶惯性对象上设为0即可。实际项目中如果对象是二阶或更高阶Kd也可以用相同方式做模糊修正。4.3 三个模块协同工作的时序逻辑整个控制周期内三个模块的配合关系是这样的每个采样时刻模糊控制器根据误差和误差变化率先给出ΔKpPID控制器用修正后的Kp计算控制量uu作用到对象的同时也进入RBF辨识器RBF根据u和对象输出更新内部模型输出y_haty_hat延迟τ后与对象实际输出比较生成Smith补偿信号叠加到反馈通道。换句说模糊管当前怎么控RBF管模型怎么修正Smith管延迟怎么补偿三者各司其职。5. Simulink仿真模型搭建要点与关键参数5.1 模型整体结构与模块清单我的Simulink模型顶层结构如下Step阶跃信号源在t0时刻从0阶跃到1Sum1参考输入与反馈信号求差得到误差eFuzzy Controller模糊推理模块输出ΔKpPID Controller主控制器Kp由基准值加模糊修正得到RBF_IdentifierMATLAB Function块在线辨识无延迟模型输出y_hatTransport Delay1对y_hat施加τ延迟得到y_hat_delayG0Transfer Fcn无延迟对象模型 K/(T·s1)Transport Delay2对G0输出施加τ延迟得到对象实际输出ySum2计算 y - y_hat_delay作为模型误差Sum3实际输出y减去模型误差后作为反馈量与参考输入求差ScopeTo Workspace记录输出数据接线逻辑要特别注意Sum3的反馈量 y - (y - y_hat_delay) y_hat_delay在模型绝对准确时它等于延迟前的对象输出控制器看到的是没有延迟的反馈这就是Smith补偿的精髓。5.2 被控对象、延迟模块与采样时间设置被控对象我用了固定参数版本和失配版本两组基准对象G(s) 5 / (20·s 1)τ 5s失配对象G(s) 5.8 / (23·s 1)τ 5.5sTransport Delay模块在Simulink里直接填延迟时间即可但要注意仿真步长对延迟精度的影响。如果用变步长求解器Transport Delay内部会做插值延迟时间不是采样周期的整数倍时也能处理但如果追求和实际代码一致建议用固定步长并让τ是步长的整数倍。5.3 关键参数配置表我把整套模型的关键参数汇总如下方便直接复现参数数值说明对象增益K5无延迟部分对象时间常数T20s无延迟部分纯滞后τ5sTransport Delay时间基准Kp2.0模糊修正叠加到该值上基准Ki0.1固定基准Kd0.0一阶对象不需要RBF隐含节点数6高斯径向基节点RBF学习率η0.05权值更新步长RBF基宽b0.6高斯函数宽度模糊输入e论域[-3, 3]归一化误差模糊输入ec论域[-1, 1]误差变化率模糊输出ΔKp论域[-0.5, 0.5]Kp修正量仿真时间100s阶跃响应观察求解器固定步长0.01s离散化后与代码行为一致6. 仿真结果对比与整定心得6.1 三种方案的阶跃响应对比我在同一组失配对象K5.8, T23s, τ5.5s下分别跑了三种方案记录关键指标方案超调量调节时间5%稳态误差稳定性固定模型Smith31%48s0.8%低频振荡SmithRBF18%35s0.2%稳定但前期有波动SmithRBF模糊9%22s0.1%稳定响应干脆单独Smith在模型失配时暴露出的问题是内部模型时间常数偏小导致补偿信号相位超前不足闭环出现约30%的超调和明显的低频振荡。叠加RBF后因为内部模型能在线修正振荡大幅减弱但由于RBF需要一段时间收敛阶跃初期仍有小幅波动。再加上模糊控制器动态调整Kp超调被明显压住调节时间也缩短了近一半。6.2 参数整定的几个实操要点RBF的学习率是最敏感的参数。η0.05时收敛平稳升到0.15前期辨识误差明显增大系统输出会出现高频抖动降到0.01则收敛太慢前20秒几乎看不到自适应效果。基宽b影响高斯函数的覆盖范围b偏小会让节点响应区域过窄输入稍微偏移就输出接近0b偏大则所有节点都在响应近似退化成线性网络。我的经验是从b0.6起步观察辨识误差曲线再做微调。模糊规则表的整定顺序也有讲究先把eZO那一行调好对应稳态附近的小扰动行为再调eNB/PB的大误差行为最后修正交叉区域。原因在于稳态附近的行为决定了稳态精度和微小超调大误差区间的行为决定了响应速度和初始上升率两者冲突时优先保证稳态行为。7. 仿真踩坑记录7.1 仿真发散不一定是算法错先查模型时序我在第一次把RBF接入Smith框架时模型一启动就发散输出直接飞掉。第一反应是学习率太大调到很小依然发散。后来逐段排查发现是反馈接线错误RBF输出y_hat没有经过Transport Delay就直接和y做差导致Smith补偿信号里少了一拍延迟相当于在反馈通道里引入了正反馈。这个问题提醒我凡是涉及延迟补偿的结构每一路信号都要核对它到底是延迟前还是延迟后。7.2 RBF预测与监督信号的时序对齐问题RBF权值更新的监督误差 e_model y - y_hat_delay这里有一个隐含的时序要求y是当前时刻的对象实际输出y_hat_delay是模型输出经过τ延迟后的当前值两者在时间轴上是对齐的。如果延迟模块设置不一致比如用了单位延迟Delay块代替Transport Delay就会出现信号错位RBF学到的关系是错乱的。用固定步长仿真时尤其容易混建议把τ设为步长的整数倍并在Scope里同时观察y和y_hat_delay确认它们重合后再让RBF投入学习。7.3 步长与离散化对Smith补偿精度的影响Smith预估器对延迟精度敏感。变步长求解器在系统快速变化时会自动缩小步长但Transport Delay模块的插值误差会在每个步长切换点引入微小扰动累积后表现为输出上的细碎毛刺。我最终改用固定步长0.01s所有延迟正好是500个步长信号时序完全确定仿真结果干净很多。另外这套模型如果后续要走Simulink Coder生成C代码也必须用固定步长离散化后的延迟用计数器实现行为才能和仿真一致。整套模型跑通之后我再回到最开始那个问题大滞后系统到底难在哪难在延迟信息无法直接消除只能靠模型去补偿而模型又不可能永远准确。RBF负责让模型跟上对象模糊控制负责让主控制器适应工况两者结合算是给Smith预估器补上了自校正和参数自适应两块短板。如果你也在做类似的时滞控制仿真我的建议是先老老实实把基础Smith跑通再逐步叠加RBF和模糊每一步都在同一组仿真条件下对比效果这样出了问题也知道是谁的锅——这是我整套仿真做下来最实在的体会。
返回列表