ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

基于DRNN神经网络的自适应PID控制算法:原理、实现与工程落地

基于DRNN神经网络的自适应PID控制算法:原理、实现与工程落地 简介这份PDF文档面向自动化、控制工程与人工智能方向的学习者和研究人员聚焦非线性系统难以用线性模型精确描述这一核心难题提出将DRNN神经网络与自适应控制相结合的算法思路。文档系统梳理了非线性系统控制面临的挑战、DRNN神经网络在信息处理与非线性辨识上的优势并给出其输入层、隐含层、输出层三层回归结构及权值更新推导进而阐述基于该网络的自适应PID控制算法如何完成系统辨识与参数整定仿真结果显示其过渡过程短、鲁棒性强、泛化能力良好可应用于机器人控制、过程控制、自动驾驶与智能家居等场景。资源包为1个PDF文件大小约1.14MB内容完整、公式与结构图齐全便于直接阅读与引用。目前已有129人学习下载适合希望深入理解神经网络自适应控制建模与仿真细节的读者参考。1. 被控对象一非线性普通 PID 就开始“玄学抖动”了做过程控制或者运动控制的同行大概率都遇到过这种场景被控对象里带点死区、饱和、摩擦或者时变参数用一组固定 PID 参数调得挺好工况一变超调直接飙上去稳态误差怎么都压不下来。这时候很多人第一反应是重新整定 PID但整定完发现只是把震荡点从一个工况挪到了另一个工况。根本原因在于线性 PID 的增益是定值而非线性系统的动态特性随工作点漂移一套固定参数不可能在全工况下都最优。这份《一种基于 DRNN 神经网络的自适应控制算法》给出的思路就是用对角回归神经网络DRNN在线辨识被控对象的非线性动态再让网络输出实时修正 PID 的三个增益。它解决的不是“PID 怎么调”的问题而是“PID 参数能不能自己跟着工况走”的问题。适合已经懂 PID 基本结构、想往自适应控制方向落地的工程师也适合做机器人关节控制、电机调速、温度过程控制这类非线性明显场景的从业者。下面我按“网络结构怎么理解 → 辨识器怎么搭 → 控制器怎么整定 → 仿真怎么复现 → 坑在哪”的顺序拆一遍。2. DRNN 网络结构与系统辨识回归层到底回归了什么2.1 为什么选 DRNN 而不是 BP 或普通 RNN普通 BP 网络是静态映射输入到输出没有记忆处理带惯性的非线性系统时辨识器本身就需要额外引入延迟输入来构造动态。而 DRNN 在隐含层加了回归支路隐含层第 j 个神经元在当前时刻的输入总和里包含了自己上一时刻的输出乘以一个回归权值。这个结构让网络天然具备对动态系统的记忆能力不需要在外层手动堆一堆延迟线。和标准 Elman 网络相比DRNN 的“对角”体现在回归权值矩阵是对角阵也就是每个回归神经元只把自己的上一时刻输出回馈给自己不交叉回馈。这样做的好处是参数量少、在线计算量小适合放在采样周期比较短的控制回路里跑。常见做法是隐含层取 5 到 9 个回归神经元输入层取被控对象的当前输入和当前输出输出层就是辨识出的系统输出。2.2 辨识器的前向计算与权值更新辨识器的输入是系统实际输入 u(k) 和实际输出 y(k)输出是网络预测的 ym(k)。误差 em(k) y(k) - ym(k)指标函数取二分之一误差平方。权值更新用梯度下降回归层、输入层、输出层三组权值分别沿各自偏导方向修正。下面这段 Python 把前向和更新写清楚可以直接对照论文里的公式复现。import numpy as np class DRNNIdentifier: def __init__(self, n_input2, n_hidden7, lr0.05): # 输入层权值 W1: (n_hidden, n_input) self.W1 np.random.randn(n_hidden, n_input) * 0.1 # 回归层权值 Wr: (n_hidden,) 对角回归每个神经元只回馈自己 self.Wr np.random.randn(n_hidden) * 0.1 # 输出层权值 Wo: (1, n_hidden) self.Wo np.random.randn(1, n_hidden) * 0.1 self.lr lr self.X np.zeros(n_hidden) # 隐含层当前输出 self.X_prev np.zeros(n_hidden) # 隐含层上一时刻输出 def forward(self, u): # u: 当前时刻输入向量 [u(k), y(k)] S self.W1 u self.Wr * self.X_prev # 隐含层输入总和 self.X np.tanh(S) # S 函数激活 ym self.Wo self.X # 网络输出 return ym def update(self, u, y, ym): em y - ym # 输出层权值更新 dWo em * self.X # 隐含层误差反传tanh 导数 1 - X^2 dS (em * self.Wo) * (1 - self.X ** 2) dW1 np.outer(dS, u) dWr dS * self.X_prev # 梯度下降更新 self.Wo self.lr * dWo self.W1 self.lr * dW1 self.Wr self.lr * dWr self.X_prev self.X.copy() return em逻辑说明forward里S W1 u Wr * X_prev对应论文中隐含层输入总和公式回归项只乘自己上一时刻输出这就是对角回归的含义。update里先算输出层梯度再把误差按Wo反传到隐含层乘 tanh 导数得到dS最后分别更新三组权值。参数方面lr是学习率辨识阶段一般取 0.02 到 0.1太大权值震荡太小收敛慢n_hidden取 5 到 9神经元太少辨识精度不够太多在线计算吃紧。X_prev必须在每次更新后同步否则回归支路就断了。2.3 辨识器的输入输出配对与采样周期辨识器要能工作输入向量必须同时包含被控对象的控制量和输出量。常见做法是u [u(k), y(k)]网络输出ym(k)逼近y(k)。采样周期 T 要和被控对象的主导时间常数匹配一般取主导时间常数的十分之一到二十分之一。T 太大回归支路记忆的信息跨了好几个动态过程辨识发散T 太小相邻采样点差异微弱梯度信号被噪声淹没。仿真里如果被控对象是连续模型记得先用零阶保持器离散化再喂给辨识器。3. 自适应 PID 控制器三个增益怎么被网络在线整定3.1 控制器结构与误差构造论文里的控制器用两个神经网络 NN1 和 NN2 分别整定两路 PID 参数单路控制器的输出是三个增益乘以三个误差分量之和。三个误差分量分别是当前误差 e(k)、误差累积、误差差分。这里有个容易翻车的点误差差分项要除以采样时间 T如果 T 取得很小差分项会放大噪声实际工程里通常再加一个一阶低通滤波。class AdaptivePID: def __init__(self, kp01.0, ki00.1, kd00.05, lr0.02, T0.01): self.kp, self.ki, self.kd kp0, ki0, kd0 self.lr lr self.T T self.e_prev 0.0 self.e_sum 0.0 def control(self, r, y): e r - y self.e_sum e * self.T de (e - self.e_prev) / self.T # 三个误差分量 x1, x2, x3 e, self.e_sum, de u self.kp * x1 self.ki * x2 self.kd * x3 # 增益在线修正梯度方向为误差对增益的敏感度 self.kp self.lr * e * x1 self.ki self.lr * e * x2 self.kd self.lr * e * x3 self.e_prev e return u, (x1, x2, x3)逻辑说明control里先算三个误差分量再合成控制量 u。增益修正项lr * e * x对应论文中增益沿误差平方负梯度方向调整的思路误差为正且分量也为正时增益增大加快响应。参数上lr是增益学习率一般比辨识器学习率小一个量级取 0.005 到 0.02太大增益会来回跳。T必须和辨识器采样周期一致否则误差差分和累积都对不上。初始增益可以先用一组手动整定的 PID 参数让网络从小范围修正开始比从零起步稳得多。3.2 辨识器与控制器的耦合关系辨识器和控制器不是各跑各的。辨识器输出的系统雅可比信息也就是被控对象输出对控制量的偏导会通过链式法则影响控制器增益的修正方向。论文里用 DRNN 的输出对输入的偏导来近似这个雅可比。实际实现时如果辨识器还没收敛雅可比估计不准控制器增益修正就会乱走。常见做法是前若干百个采样步只训练辨识器冻结控制器增益等辨识误差降到阈值以下再放开控制器在线修正。这个“先辨识后控制”的启动顺序是整套算法能不能稳的关键。3.3 仿真被控对象与参数设置论文给的被控对象是一个二阶非线性状态方程状态变量 x1、x2未知参数 a110.3、a120.7、a21-5.3、a22 等。复现时用四阶龙格库塔离散化采样周期取 0.01 秒仿真时长 10 秒左右就能看到收敛过程。下面是被控对象和主循环的骨架。def plant(x1, x2, u): a11, a12, a21, a22 0.3, 0.7, -5.3, -0.5 dx1 a11 * x1 a12 * x2 dx2 a21 * x1 a22 * x2 u return dx1, dx2 # 主循环骨架 ident DRNNIdentifier(n_input2, n_hidden7, lr0.05) pid AdaptivePID(kp01.0, ki00.1, kd00.05, lr0.01, T0.01) x1, x2 0.5, 0.0 for k in range(1000): r 1.0 # 阶跃指令 u, _ pid.control(r, x1) dx1, dx2 plant(x1, x2, u) x1 dx1 * 0.01 x2 dx2 * 0.01 ym ident.forward(np.array([u, x1])) ident.update(np.array([u, x1]), x1, ym)逻辑说明plant是被控对象连续方程主循环里用欧拉法以 0.01 秒步长推进。辨识器输入取[u, x1]输出逼近 x1。参数上初始状态 x10.5、x20 是为了让系统从非零初值收敛到指令值方便观察过渡过程。仿真步数 1000 对应 10 秒足够看到误差收敛和增益稳定。如果换成四阶龙格库塔把x1 dx1 * 0.01换成 RK4 更新即可精度更高但代码略长。4. 复现时最容易翻车的几个地方4.1 辨识器发散误差越跑越大现象辨识误差 em(k) 不收敛几十步后直接冲到很大值。原因通常是学习率过大或者输入向量没有做归一化被控对象输出量纲远大于控制量导致权值更新步长在某个方向上过大。解决先把学习率降到 0.01 量级再对输入做归一化让 u 和 y 都落在 -1 到 1 之间网络输出再反归一化回物理量。4.2 控制器增益来回震荡不收敛现象kp、ki、kd 三个曲线在仿真图里高频抖动控制量也跟着抖。原因一般是控制器学习率相对辨识器学习率偏大或者辨识器还没收敛就放开了控制器修正。解决控制器学习率取辨识器的五分之一到十分之一并且加一个启动冻结期前 200 到 500 步只训练辨识器辨识误差小于 0.01 后再放开增益修正。4.3 误差差分项把噪声放大现象控制量里出现明显的高频毛刺执行机构跟着响。原因误差差分 de (e - e_prev)/TT 很小时差分对测量噪声极其敏感。解决在差分项后面串一个一阶低通滤波滤波时间常数取 3 到 5 个采样周期或者直接用不完全微分结构把微分项乘一个小于 1 的滤波系数。4.4 采样周期和对象时间常数不匹配现象辨识器怎么调都不收敛或者收敛后一换工况就崩。原因采样周期 T 相对被控对象主导时间常数太大或太小。解决先测被控对象的阶跃响应找到上升到 63% 的时间作为主导时间常数T 取它的十分之一到二十分之一。仿真里如果对象是连续模型务必先离散化再进循环不要混着连续和离散算。4.5 初始增益全设为零导致启动死区现象仿真一开始控制量一直是零系统不动网络也没法从零误差里学到东西。原因PID 初始增益设为零控制量为零被控对象没有激励辨识器输入全是零梯度为零。解决初始增益用一组手动整定的值哪怕粗糙也行保证系统有初始激励。常见做法是先跑一段开环或者固定 PID采集数据预训练辨识器再切到自适应模式。5. 从仿真到落地验证收敛性和鲁棒性的几个硬指标仿真跑通只是第一步判断这套算法到底能不能用我一般盯四个指标。第一是辨识误差的稳态值收敛后 em 的绝对值应该小于被控对象输出量程的 2%否则辨识器精度不够后面增益修正就是建在沙子上。第二是增益收敛时间从放开控制器修正到三个增益波动小于 5%一般希望在 1 到 3 秒内完成太慢说明学习率偏小或者网络容量不够。第三是阶跃响应的超调量和调节时间和手动整定的最优 PID 比超调不应更差调节时间应缩短至少 20%。第四是鲁棒性测试把被控对象参数改 20% 到 30%看增益能不能重新收敛、响应能不能恢复这一条最能区分“真自适应”和“仿真里碰巧调通”。验证鲁棒性时我习惯做一个参数摄动扫描表把关键参数按比例改记录每次的调节时间和超调。下面这个表是我复现时用的记录格式可以直接套。摄动项变化幅度调节时间(s)超调量(%)增益是否重新收敛a21-20%1.86.2是a2120%2.18.5是a12-30%2.411.0是a1230%2.613.4边界收敛加输出噪声5% 量程2.29.1是从表里能看出参数往使系统阻尼变小的方向摄动时超调会明显上升增益收敛也变慢。如果某个摄动下增益不收敛优先查辨识器输入归一化有没有跟着参数变化失效再查学习率是不是需要按摄动幅度自适应缩小。还有一个容易被忽略的点这套算法在线计算量集中在辨识器前向和反传隐含层 7 个神经元时单步计算量很小但如果你把采样周期压到 1 毫秒以下普通 MCU 可能跑不动。落地前先估算单步浮点运算次数留出至少 50% 的 CPU 余量否则控制回路会被计算拖垮。我自己的习惯是每次把这类自适应算法往真实控制器上搬之前先在仿真里把采样周期、学习率、网络规模三组参数各扫一遍找到收敛边界再按边界往保守方向退两档。从那以后凡是带在线学习的控制算法我都强制先跑一遍参数摄动扫描确认收敛域覆盖实际工况才敢往硬件上烧。希望帮到你。本文还有配套的精品资源点击获取
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表