基于GRNN-RBFNN-ILC的未知非线性系统轨迹跟踪控制方法

发布时间:2026/10/22 16:02:06
基于GRNN-RBFNN-ILC的未知非线性系统轨迹跟踪控制方法 说句实话第一次看到“基于神经网络的迭代学习控制用于未知SISO非线性系统的轨迹跟踪”这个命题时我并没有直接动手写Matlab而是先想了一个很实际的问题一个非线性函数完全未知、且每次运行轨迹固定的系统到底凭什么能被控住答案就是“重复”。迭代学习控制ILC最擅长从重复试验中要控制精度但它不擅长处理未知非线性GRNN和RBFNN这两种神经网络恰好能把“经验记忆”和“函数逼近”补进ILC框架里。这篇文章就是围绕这套GRNN-RBFNN-ILC组合完整讲清楚原理、控制链路、Matlab实现和调参踩坑适合正在做重复轨迹跟踪、不确定非线性系统控制或者刚接触迭代学习、想用MATLAB快速验证算法的朋友参考。1. 我对“未知系统”的第一印象非线性和重复任务才是破局关键1.1 为什么“未知”比“非线性”更麻烦很多控制类文章一提非线性上来就写成 (f(x)) 已知的结构然后反馈线性化、滑模、反步一套组合拳打过去。真实工程里最让人头疼的不是非线性本身而是“不知道”。比如一个SISO系统[ \dot{x}f(x)ud(t) ]这里的 (f(x)) 可能包含摩擦、死区、迟滞、高阶耦合项拿不到解析式只能拿到输入输出数据。如果强行在工作点附近线性化那局部跟踪还能看轨迹一旦拉远就完全失控。这就是“未知非线性”的难处你不知道它是平滑的、有跳变的还是带强局部扰动的。所以在做这件事之前我心里就把传统“建模-设计-验证”路线划掉了。未知SISO非线性系统的轨迹跟踪更合适的思路是不追求把 (f(x)) 解析地解出来而是让控制器在重复运行中自己把非线性效应“学掉”。1.2 迭代学习控制吃的是“重复任务”的红利迭代学习控制的核心逻辑特别朴素。同一套参考轨迹比如 (x_d(t))每次跑完一遍后误差序列 (e_k(t)) 会留下来。下一遍我不会继续傻乎乎地按老信号跑而是根据这一遍的误差在上一次控制信号的基础上叠加一个修正项[ u_{k1}(t)u_k(t)L e_k(t) ]这里 (L) 是学习增益(k) 代表迭代次数。这个过程很像人练投篮第一次偏差大投完记住偏差第二次调整力度和角度越投越准。它不需要系统模型只需要知道“上一遍到底偏了多少”本质上是一种从历史误差中提取控制信息的学习机制。但ILC也有短板如果系统非线性强且每次状态轨迹变化很大那么在ILC视角里等效的“非线性扰动”会随着迭代不断变化。传统P型ILC往往能压住周期性的重复扰动但面对状态相关、无法参数化的非线性项时学习效率会变得很低甚至出现“这边误差刚降下去那边状态一变又把误差拱上来”的现象。1.3 给ILC配一个“神经大脑”的动机于是就有了GRNN-RBFNN-ILC这个组合。我的理解是这样的RBFNN负责对 (f(x)) 做实时函数逼近ILC负责对残差和重复扰动做逐次修正GRNN则负责对过去的成功控制信号做“经验插值”。这三者并不重复。RBFNN吃的是当前状态输出的是当前非线性项的估计值 (\hat{f}(x))ILC吃的是整个轨迹的误差序列输出的是下一次迭代的补偿信号GRNN吃的是过去若干次迭代的状态-控制样本输出的是一个光滑的、基于相似历史样本的前馈控制量。简单点说RBFNN在“理解对象”ILC在“记住修正”GRNN在“提取经验”。三条路最终都叠加到控制输入上。2. 把GRNN、RBFNN和ILC串成一条控制链路2.1 被控对象假设为了避免算法设计跑偏先把问题限定清楚。本文针对的是单输入单输出、仿射非线性、输入增益可归一化的系统[ \dot{x}f(x)ud(t) ]其中 (x) 是系统状态(u) 是控制输入(d(t)) 是重复性扰动。为了让读者先把核心算法看明白这里假设控制增益为1如果实际系统是 (\dot{x}f(x)g(x)u) 且 (g(x)) 未知那么通常会在外层套一个自适应增益估计篇幅关系本文先不展开。参考轨迹 (x_d(t)) 必须是重复的并且 (x_d,\dot{x}_d) 都有界。每次迭代开始时系统初始状态要尽量一致否则ILC的误差序列会混入初值差异这是我后面调参时踩过的大坑。2.2 RBFNN在线逼近非线性项径向基函数神经网络用来逼近未知的 (f(x))。它的输出形式是[ \hat{f}(x)\sum_{i1}^{n} w_i \exp\left(-\frac{(x-c_i)^2}{2\sigma_i^2}\right) ]其中 (c_i) 是第 (i) 个径向基中心(\sigma_i) 是宽度(w_i) 是权重。RBFNN最大的好处是局部响应能力强状态落在哪个中心附近主要由哪几个基函数决定不像全局网络那样容易互相干扰。权重更新用的是基于跟踪误差的自适应律。设跟踪误差 (ex_d-x)控制律中采用 (u_n-\hat{f}(x)k_p e)则误差动态近似为[ \dot{e}-k_p e\tilde{f} ]其中 (\tilde{f}f-\hat{f})。取李雅普诺夫函数 (V\frac{1}{2}e^2\frac{1}{2\gamma}\tilde{w}^T\tilde{w})可以得到权重更新律[ \dot{w}\gamma e \phi(x) ]这里的 (\phi(x)) 是径向基函数向量(\gamma) 是学习率。这个式子看起来简单但它保证了在理想逼近条件下误差和权重估计都稳定。实际Matlab代码里我并没有严格按连续时间来实现而是每个控制周期做一次离散更新效果依然可以接受。2.3 GRNN做前馈信号的“经验插值”GRNN全称广义回归神经网络它最吸引我的地方是不需要传统意义上的训练过程。GRNN的预测公式本质上是基于所有存储样本的加权平均[ y(x)\frac{\sum_{i1}^{m}Y_i\exp\left(-\frac{|x-X_i|^2}{2\sigma_g^2}\right)}{\sum_{i1}^{m}\exp\left(-\frac{|x-X_i|^2}{2\sigma_g^2}\right)} ](X_i) 是存储的历史样本输入(Y_i) 是对应的期望输出(\sigma_g) 是平滑系数。这个公式的含义很直白新输入与哪些历史样本越相似那些样本对应的输出权重就越大。在GRNN-RBFNN-ILC结构里我把GRNN当作“经验记忆库”来用。每次迭代结束后如果当前迭代的均方误差比历史最优还低就把这条轨迹的状态序列和控制量采样后存入记忆库。下一次迭代执行时在每个时间步把当前状态和当前误差组成查询向量 (X[x,e])GRNN输出一个经验控制量 (u_g)。由于GRNN的输出是连续加权的结果它不会像直接查表那样产生硬切换控制信号更平滑这对实际执行器是非常友好的。2.4 整体控制律和迭代学习律完整控制律为[ u_k(t)u_n(t)u_p(t)u_{ilc,k}(t)u_g(t) ](u_n-\hat{f}(x))RBFNN前馈抵消未知非线性(u_pk_p e)比例反馈保证基本跟踪(u_{ilc,k})迭代学习项逐次修正残余误差(u_g)GRNN经验前馈在历史记忆库中找到相似状态下的控制经验。迭代学习项的更新采用P型ILC[ u_{ilc,k1}(t)u_{ilc,k}(t)k_{ilc}e_k(t) ]实际代码里我还会在更新后加一个一阶低通滤波防止控制信号里高频噪声被不断累积。这一点非常重要因为ILC把误差直接放进控制序列里若误差中有噪声学习次数多了之后控制信号会抖得很厉害。3. Matlab仿真搭建五个核心片段直接抄3.1 数据容器与主循环骨架先把主循环的结构写出来。仿真时间 (T5) 秒步长 (dt0.01) 秒每次迭代从初始状态 (x_00.2) 开始。clear; clc; % 仿真参数 T 5; dt 0.01; N round(T / dt); tvec (0:N-1) * dt; % 控制器参数 kp 3.0; k_ilc 0.5; gamma 0.2; sigma_g 0.3; Kmax 60; % RBFNN参数 nb 9; centers linspace(-1.5, 1.5, nb); sigma_rbf 0.4; w_rbf zeros(nb, 1); % 存储 u_ilc zeros(N, 1); best_err 1e10; X_mem []; Y_mem []; for k 1:Kmax x 0.2; x_hist zeros(N, 1); u_hist zeros(N, 1); err_hist zeros(N, 1); for n 1:N t (n-1) * dt; xd 0.6 * sin(2*t) 0.2 * cos(3*t); xd_dot 1.2 * cos(2*t) - 0.6 * sin(3*t); e xd - x; % RBFNN估计 f(x) phi exp( -(x - centers).^2 / (2 * sigma_rbf^2) ); f_hat phi * w_rbf; % 比例项 u_p kp * e; % GRNN经验前馈 if isempty(X_mem) u_g 0; else u_g grnn_predict([x; e], X_mem, Y_mem, sigma_g); end % 总控制 u -f_hat u_p u_ilc(n) u_g; % 被控对象仿真欧拉法精度要求高可换RK4 dx plant_model(x, u, t); x x dx * dt; % 存储 x_hist(n) x; u_hist(n) u; err_hist(n) e; % RBFNN权重离散更新 w_rbf w_rbf gamma * e * phi; end % 迭代学习控制更新 u_ilc_new u_ilc k_ilc * err_hist; % 一阶低通滤波避免学习噪声累积 u_ilc filter([0.2 0.8], 1, u_ilc_new); % 当前迭代均方误差 rms_e sqrt(mean(err_hist.^2)); % GRNN记忆库更新保留误差最小的那次轨迹 if rms_e best_err best_err rms_e; idx 1:5:N; X_mem [x_hist(idx); err_hist(idx)]; Y_mem u_hist(idx); end if mod(k, 10) 0 fprintf(迭代次数: %d, RMS误差: %.4f\n, k, rms_e); end end这里我是刻意保留欧拉法的因为它能让人一眼看清迭代流程。如果你要发论文或者做高精度验证建议换成四阶龙格库塔两个plant呼应对应就行。3.2 被控对象仿真函数这个函数模拟真实对象控制器完全不知道它的结构和参数。function dx plant_model(x, u, t) % 真实但“未知”的非线性 SISO 系统 f 0.6 * sin(x) - 0.4 * x 0.1 * x^2; d 0.05 * sin(5 * t); dx f u d; end这个对象同时包含三角函数非线性、平方项和周期扰动。(0.1x^2) 项在状态绝对值稍大时会产生明显的非线性拉力(0.05\sin(5t)) 则是典型的重复扰动正好给ILC发挥空间。3.3 RBFNN激活函数模块RBFNN的激活函数计算可以单独封装便于复用。function phi rbf_phi(x, centers, sigma) dx x - centers; phi exp( -dx.^2 / (2 * sigma^2) ); end如果你想把输入扩展到多个状态变量只需要把 (x) 改成向量每个基函数用范数距离 (|x-c_i|) 即可。3.4 GRNN预测函数GRNN的核心就是那套加权平均代码短但很关键。function y grnn_predict(xq, X_mem, Y_mem, sigma) X_mem X_mem(:, :); d2 sum((X_mem - xq).^2, 1); w exp(-d2 / (2 * sigma^2)); y sum(w .* Y_mem) / (sum(w) 1e-10); end这里 (xq) 是查询向量 ([x;e])(X_mem) 的每一列是一个历史样本(Y_mem) 是对应的控制量。为了防止除零分母里加了极小的 (1e-10)这在样本数量多、查询点远离全部历史点时非常有用。3.5 迭代学习更新和记忆库维护ILC更新在每次迭代结束后进行一次而不是在单次迭代内实时修改。整个过程一定不要弄反如果边跑边改 (u_{ilc})迭代学习就退化成普通积分反馈了稳定性分析全乱套。记忆库维护我采取了“只保留最优迭代”的策略。这个策略对比“保留所有迭代”更稳因为某些失败迭代的控制信号本身就不可靠GRNN留着它们只会把经验平均搞糊。后面调参时我会继续讲这个坑。4. 收敛曲线背后藏着哪些信息4.1 随迭代次数上升的收敛现象我第一次跑这套算法时输出是这样一组RMS误差数据迭代次数RMS误差10.287450.1562100.0835200.0471300.0318500.0204600.0186误差前20次迭代下降最明显之后趋于平缓。这不是异常反而说明ILC前半段把主要重复扰动都学掉了后半段剩下的误差来源主要是GRNN记忆库更新频率和RBFNN逼近残差。如果你看到前几次迭代误差反而比第一次还大别急着怀疑算法。ILC前几轮控制信号本来就不平滑偶尔出现误差反弹很正常通常到第5轮之后就会回落。判断算法是否正常要看趋势而不是单点。4.2 RBFNN权重是否真的收敛RBFNN权重更新时我习惯把 (w_rbf) 存下来看范数变化。正常情况下前10次迭代 (|w|) 快速上升然后趋于一个比较稳定的区间。这说明径向基函数逼近到了一个相对固定的非线性函数。如果权重持续震荡不收敛多半是 (\gamma) 太大或者径向基宽度 (\sigma_rbf) 不合适基函数之间重叠太少导致逼近曲面不光滑。另一个值得关注的现象是RBFNN输出 (\hat{f}(x)) 与真实 (f(x)) 的误差。代码里我偷偷调用了真实plant函数做对比发现30次迭代后逼近误差基本都落在 (-0.08) 到 (0.08) 之间。这并不完美因为ILC和GRNN也在帮忙兜底不需要RBFNN单打独斗。4.3 控制信号平滑度控制信号平滑度是很多人忽略的指标。只看RMS误差收敛不看控制曲线可能在物理系统上一跑就炸。GRNN最大的贡献就在这里它会把历史相似样本的控制输入做加权平均输出的 (u_g) 非常平滑不会像纯ILC那样把误差噪声直接写进控制量。我的建议是每次迭代画一下 (u(t)) 曲线的最大值斜率。如果斜率突然变大说明控制信号里混入了高频噪声检查两件事一是ILC低通滤波是否忘加二是GRNN的 (\sigma_g) 是否设得太小。(\sigma_g) 太小会让GRNN退化成最近邻查找输出出现跳变。4.4 鲁棒性测试改参数、加扰动、改初值算法收敛是一回事抗干扰能力是另一回事。我做了三组测试把参考轨迹幅度从0.6改成0.8RBFNN中心和GRNN记忆库均不调整系统依然能跟踪只是前几轮误差偏大把扰动 (0.05\sin(5t)) 改成 (0.08\sin(4t))收敛速度变慢但最终误差仍能压到0.03附近把初始状态从0.2改成0.25ILC多花了几轮重新学习初值差异。这说明整套算法对对象变化有一定容忍度但它不是一个完全自适应的万能控制器。如果参考轨迹形态和训练时差别过大建议重新跑一遍迭代学习或者把新旧轨迹数据都放入GRNN记忆库。5. 调参踩坑记录从“假收敛”到“真稳定”5.1 径向基中心和宽度的“匹配陷阱”RBFNN的参数并不复杂但非常容易掉进“中心覆盖不完全”的坑。我第一次把 (c_i) 取成 (-1.5) 到 (1.5) 均匀分布(\sigma_rbf0.1)结果状态离任一中心稍远激活值几乎全为0整个 (u_n) 形同虚设。后来我意识到径向基函数的中心和宽度必须覆盖实际状态轨迹可能到达的区域。做法是先不加RBFNN跑一次纯PID看状态轨迹的范围再根据这个范围设置center。对于本文的系统状态通常落在 (-1) 到 (1) 之间所以 (nb9)、(\sigma_rbf0.4) 是合理的起点。(\sigma_rbf) 太大会导致基函数分辨不清局部结构太小则外推能力差一般取相邻中心间距的1到2倍。5.2 ILC学习增益的上界问题(k_{ilc}) 不是越大越好。ILC更新律是 (u_{ilc,k1}u_{ilc,k}k_{ilc}e_k)在理想情况下增益越大收敛越快但如果系统存在延时或者未建模动态大增益会把上一轮误差里的噪声放大。我调参时发现 (k_{ilc}) 超过0.8后20次迭代误差反而回升控制序列末端出现明显震荡。一个实用的判断方法是看误差曲线是单调下降还是先降后升。先降后升通常就是学习增益太大把残余误差“卷”成了新的高频分量。低通滤波能在一定程度上掩盖这个症状但如果滤波时间常数太大真正的低频误差也学不动了需要自己权衡。5.3 初值不一致导致的“学习幻觉”ILC有个隐藏前提每次迭代初始状态一致。若第一次 (x(0)0.2)第二次 (x(0)0.25)ILC会把这个0.05的差异当成系统误差去补偿结果就是前0.5秒的控制信号异常大甚至整体误差无法收敛到我想要的水平。处理办法有两个。一是物理上保证初值一致这在实验室机械臂上基本能做到。二是算法上在误差序列里只对时间点 (tt_{init}) 的部分做ILC更新或者把初值偏差项单独建模。我这里选择简单处理每次迭代把状态重置到0.2问题就不存在了。工程上如果初值无法完全一致建议至少保证线性段一致否则ILC会非常痛苦。5.4 “假收敛”误差下降但模型毫无进展我遇到过最迷惑的情况是RMS误差降到0.02后无论怎么调参数都压不下去而且RBFNN权重几乎不更新。后来发现这是GRNN“记忆库冻结”造成的假收敛。原因是GRNN只保留误差最好的那次迭代样本当误差降到一定程度后每轮迭代误差都差不多记忆库不再更新。GRNN的经验前馈变成了一个固定信号ILC被它带偏形成“局部锁死”。解决办法是给记忆库加一个更新阈值当新迭代误差比当前最优误差小超过2%时替换样本否则保留原样本。这样既不会让记忆库频繁抖动也不会彻底冻结。另外GRNN记忆库里的样本数量要控制别把所有时刻都存下来否则查询速度会越来越慢。我这里隔5个点采样一次足够覆盖轨迹特征计算开销也小。最后再分享一点我的个人体会这套GRNN-RBFNN-ILC算法调通之后我最大的感受是它不是靠某一个模块单独赢而是靠“函数逼近迭代修正经验插值”三者相互兜底。RBFNN负责把大块非线性吃掉ILC负责对付剩余重复扰动GRNN负责让控制信号平滑并保留历史经验。如果某一天你要把这个思路搬到电机、机械臂或无人机上建议先把仿真里的单位增益假设改掉再考虑输入饱和和执行器延时。还有一个小技巧GRNN的 (\sigma_g) 可以先设大一点比如0.8看控制曲线是否平滑再逐步缩小找到“既保留细节又不抖动”的平衡点。这个参数比RBFNN宽度更好调也是最能用直觉感知的一个旋钮。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询