资讯动态

递推最小二乘算法详解:原理、MATLAB实现与实验报告指南

发布时间:2026/9/2 2:56:16 来源:尧图企业网站定制
简介递推最小二乘RLS算法是动态系统参数在线估计的经典方法本资源以Python实现为核心配套Word版详细实验报告面向自动化、信号处理及相关专业学生与工程师适合课程实验、课设或工程预研。压缩包共3个文件.py源码包含初始化、预测、更新、遗忘因子调节等关键步骤结构清晰且可直接运行.txt文件对程序使用要点和运行环境作简要说明.doc报告系统讲解算法背景、递推公式推导、矩阵更新细节、代码逐段解析以及实验结果分析同时结合遗忘因子对估计精度的影响进行讨论形成从原理到实践的完整闭环既适合教学演示也适合工程验证。资源包仅316KB轻量实用便于按需阅读和调试。目前已有466人学习下载尤其适合希望在短时间内理解RLS机制并动手验证的读者借助报告中的曲线和结论可快速校验算法效果是学习自适应滤波与在线辨识的有力工具。 拿到“递推最小二乘算法程序代码及word版详细实验报告.rar”这种压缩包时我的第一反应不是赶紧解压而是先问一句递推最小二乘算法到底是用来干什么的我现在能不能用自己的话讲清楚作为系统辨识和自适应控制课程里的常驻角色递推最小二乘Recursive Least Squares, RLS解决的问题非常实际系统模型结构已知但参数未知数据还在源源不断到达我们必须一边接收新观测值一边在线刷新对参数的估计。这篇内容我不打算只替你盘点资源包而是从实践角度完整梳理RLS的原理推导、程序代码模块、实验报告写法以及跑这类程序时容易踩的坑。1. 拿到这份rar资源后先别急着解压跑代码1.1 压缩包里大概率有什么这种标题的资源包内容构成一般比较固定一个主程序文件多数是MATLAB的.m文件有时是Python脚本、一份word版实验报告、可能还带几个数据文件或图片。rar只是一个打包容器真正值钱的是里面代码的组织方式和报告里对公式、步骤、结果图的完整记录。我见过太多人拿到这类资源后第一件事就是解压、运行、截图、导出PDF然后当成自己的实验报告交上去。这种用法其实特别浪费。代码能不能跑通是一个层面能不能讲清楚递推式里每个变量为什么这样更新是另一个层面。资源包里的代码和报告应该被当成一份“参考答案”而不是“作业本体”。1.2 三分钟判断这个资源和你是否匹配解压之前先花三分钟检查几件事代码是MATLAB还是Python如果是MATLAB你的环境里是否有MATLAB或者Octave可以打开实验报告里的模型结构是什么最常见的是一阶/二阶ARX模型也有可能是差分方程形式报告和代码里的符号约定和你课程教材是否一致比如有人用θ表示参数向量有人用a、b分开表示代码里是否含有数据生成部分还是只读取现成数据文件。这几个问题不确认清楚直接跑代码很容易出现“代码报错找半天原因结果是版本不兼容”或者“报告结论和代码结果对不上”的情况。宁可先花几分钟把目录结构和符号约定理清楚也别盲跑。1.3 一个高效的学习顺序建议如果你是想通过这份资源真正学会递推最小二乘我的建议顺序是这样先通读实验报告里的原理部分把算法流程框架建立起来再运行一遍示例代码观察参数估计曲线的收敛过程然后逐行阅读主循环代码把每一行和递推公式对应起来最后把仿真对象换成你自己的系统或者换一组参数重新辨识。这个顺序的核心逻辑是“先见森林再见树木”。先知道算法要解决什么问题、流程是什么模样再去扣代码里的细节才不会迷失在一堆矩阵运算里。2. 递推最小二乘的原理从“一次算完”到“来一组修一组”2.1 先回顾一下离线最小二乘递推最小二乘并不是一个全新的独立算法它就是离线最小二乘的在线版本。离线情况下假设我们已经收集了N组输入输出数据模型可以写成Y Φθ e其中Y是输出向量Φ是回归矩阵θ是待辨识的参数向量e是残差。最小二乘的核心思路是让残差平方和最小J (Y - Φθ)^T (Y - Φθ)对θ求导并令导数为零就得到经典的解θ_hat (Φ^T Φ)^(-1) Φ^T Y这个公式本身很简单问题在于它是一次性计算。每一组新数据到来时如果都要重新构建Φ和Y再求一次矩阵逆计算开销会随数据量增加越来越大。更重要的是在实时控制、在线监测这类场景里我们不可能等所有数据采集完再解方程数据是不断产生的处理器必须在每个采样周期内完成参数更新。这正是递推最小二乘存在的理由。2.2 递推公式是怎么推出来的递推的思路是当新样本(φ(k1), y(k1))到来时利用上一时刻已有的估计结果加一个修正项得到新估计而不是重新求解整个最小二乘问题。为了说清楚这个修正项先定义P(k) (Φ_k^T Φ_k)^(-1)它相当于当前时刻的“协方差矩阵”衡量的是对当前估计的置信程度。新数据到来后P的逆矩阵可以写成P(k1)^(-1) P(k)^(-1) φ(k1)φ(k1)^T利用矩阵求逆引理可以从这个式子推出三行核心递推公式增益矩阵K(k1) P(k)φ(k1) / (1 φ(k1)^T P(k) φ(k1))参数更新θ_hat(k1) θ_hat(k) K(k1)[y(k1) - φ(k1)^T θ_hat(k)]协方差更新P(k1) (I - K(k1)φ(k1)^T)P(k)括号里的欧几里得向量形式就是整个RLS的骨架。如果只用一句话说清楚新估计 旧估计 增益 × 预测误差。预测误差是新观测值和旧模型预测值之间的差值增益K决定这个差值有多少比例被用来修正参数。我通常用一个导航类比的例子帮助理解旧参数估计就像原本规划的路线新观测数据就像实时路况信息。如果路况信息质量很高且当前路线可信度不足增益K就大路线会大幅修正如果当前路线已经很可靠K就小新信息只是微调。P矩阵就是这个“可信度”的量化载体。2.3 遗忘因子是怎么进来的普通递推最小二乘给所有历史数据相同的权重这适合时不变系统。但工程中很多对象会随工况变化比如电机温升后电阻值改变或者飞行器气动参数随马赫数变化。这种情况下我们希望算法“忘记”过于陈旧的数据更相信最近时刻的观测。做法是在损失函数里引入指数遗忘因子λ。每增加一个新数据旧数据的权重都会乘以λ整体形成指数衰减。递推公式变成K P(k)φ(k1) / (λ φ(k1)^T P(k) φ(k1))P(k1) (I - Kφ(k1)^T)P(k) / λ当λ1时退化为普通递推最小二乘所有历史数据权重相同λ越小旧数据被遗忘得越快算法跟踪时变参数的能力越强但代价是对噪声更敏感稳态波动更大。实际调试时λ的取值范围通常在0.95到1之间。0.98是个不错的起点快速时变系统可以尝试0.95高噪声环境则建议0.995以上。具体选多少要看你更在乎收敛速度还是稳态精度。3. 递推代码的模块拆解一份可以直接改着用的模板3.1 初始化参数下面这份代码是我自己常用的RLS模板以二阶ARX模型为例。先看初始化部分% 参数初始化 n 2; % 待辨识参数个数这里以 y(k) a1*y(k-1) b1*u(k-1) 为例 theta_hat zeros(n,1); % 参数估计初值 P 1e6 * eye(n); % 协方差矩阵初值 lambda 0.98; % 遗忘因子这里有几个关键点。theta_hat初值在没有先验信息时直接取零向量是合理的但P矩阵初值一定要取大比如1e4到1e6倍的单位矩阵。P表示对当前参数估计的置信程度P越大代表“我越不信当前估计”因此前几步会有较大的修正量让参数快速从初始猜测收敛到真值附近。如果P初值设置太小比如直接取eye(n)算法会以为初始参数已经很准了新数据的修正作用很小结果就是收敛极慢甚至在一段时间内看不到明显变化。3.2 构造回归向量与递推主循环核心递推循环大概是这样的N length(y); % 数据长度 theta_rec zeros(n, N); % 记录每一时刻的参数估计值方便画图 for k 2 : N % 构造回归向量结构与模型形式强相关 phi [-y(k-1); u(k-1)]; % 预测误差 e y(k) - phi * theta_hat; % 增益矩阵 K P * phi / (lambda phi * P * phi); % 参数更新 theta_hat theta_hat K * e; % 协方差更新 P (eye(n) - K * phi) * P / lambda; % 记录结果 theta_rec(:, k) theta_hat; end这段代码里最容易被忽视的是回归向量phi的构造。它必须和你的模型结构严格对应。比如模型是y(k) a1y(k-1) b1u(k-1)那phi就是[-y(k-1); u(k-1)]如果是二阶ARX模型phi就要包含y(k-1)、y(k-2)、u(k-1)、u(k-2)四项同时n也要改成4。很多同学直接把别人模板里的phi拿过来跑结果参数怎么都收敛不到真值问题往往就出在模型结构对不上。另外在MATLAB里phi * P * phi得到的是一个标量K的维度是n×1这样参数更新时theta_hat K*e的维度才能匹配。在Python的numpy里也一样只不过需要更小心矩阵维度和广播机制。3.3 数据生成与结果验证为了验证算法先得有一组已知真值的仿真数据。我经常用这样的方式生成% 生成仿真数据真实系统取 a1-1.5, b10.3 a1_true -1.5; b1_true 0.3; N 500; u randn(N,1); % 激励信号用白噪声 y zeros(N,1); for k 2:N y(k) -a1_true * y(k-1) b1_true * u(k-1) 0.01 * randn; end激励信号这里不能偷懒用常数或者斜坡。递推最小二乘要求输入信号满足持续激励条件简单理解就是输入要足够“丰富”包含足够的频率成分才能把系统的动态特性激发出来。白噪声和伪随机序列都是常用选择。如果输入一直是直流回归矩阵会病态参数无法唯一辨识这是实验里最经典的翻车原因之一。跑完递推后画参数收敛曲线、预测输出对比曲线再算一下估计值与真值之间的均方根误差整个实验流程就完整了。3.4 模板使用时的几个注意事项回归向量要按模型结构改不能只改参数个数记录估计结果的theta_rec要预先分配矩阵避免循环里动态扩容拖慢速度Python实现时P更新完成后最好做一次对称化处理P (P P.T) / 2防止数值误差破坏对称正定性如果数据长度很长注意lambda过小时协方差矩阵可能数值爆炸需要定期检查P是否出现NaN或Inf。4. 实验报告的核心结构如何把“详细”落到实处4.1 原理部分不要只堆公式一份word版实验报告原理部分最容易犯的毛病是公式连抄三页却没有一句人话。写递推最小二乘的原理关键是说清楚“为什么需要递推”。可以从三个角度展开第一实时性要求工业现场不可能等全部数据采集完成再计算第二计算量控制递推形式避免了不断重复的矩阵求逆第三时变系统需要遗忘因子让估计能跟随参数变化。实验目的也别写“学习递推最小二乘算法”这种空话而是写得更具可检验性比如“掌握递推最小二乘的迭代流程能够通过仿真数据分析遗忘因子对参数估计收敛性能的影响”。这样的目的写着明确老师看着也舒服。4.2 仿真结果要能讲出“故事”仿真结果部分至少要有三样东西参数估计收敛曲线、预测输出与真实输出对比图、误差曲线。收敛曲线要能看到参数从初始值出发逐渐逼近水平线预测输出对比图要能体现“模型输出跟随真实输出”的效果误差曲线最好同时画出预测误差和参数误差两种。关键是要对每一张图都有明确的观察结论不能只贴图不解释。比如这样写“由图2可以看出a1估计值从初始值0开始经过约80个采样点后收敛到-1.5附近稳态波动范围小于±0.02遗忘因子λ0.98时参数收敛速度高于λ1的情况但稳态波动略大。”这种表述说明你真的观察过数据而不是随手截图。不同遗忘因子的对比可以用表格呈现遗忘因子λ收敛速度稳态波动时变跟踪能力0.95快较大强0.98中等中等中等1.00慢较小弱4.3 容易被忽略的加分项如果想让报告更出彩可以在仿真中设计一个参数突变场景。比如前250个采样点真实a1-1.5第251个采样点开始真实a1突然变成-1.0然后观察不同遗忘因子下参数估计的跟踪速度。这个实验能非常直观地体现遗忘因子的价值也是面试或答辩时很容易展开聊的一个点。另外把递推结果和离线最小二乘结果做一个对比说明两者在数据量足够大时应该趋于一致也是一个很有深度的分析角度。报告中可以写出离线最小二乘得到的参数作为“终值参考”再用递推结果的最终值去比较差异能反映递推算法的收敛性能。4.4 word版报告排版上的实际问题公式用Word公式编辑器输入不要贴截图排版更清晰图用矢量图或者高分辨率PNG插入后注意缩放比例确保坐标轴文字能看清图和表都要有编号和标题正文里要先有引用比如“如图1所示”如果资源包里的报告是别人写好的务必自己重新生成图表和数据后再用。出于学术诚信考虑这既是对自己的保护也是学习的必要环节。5. 调试递推最小二乘程序时踩过的坑5.1 参数发散或出现NaN这是新手最容易遇到的情况。估计值曲线突然冲到离谱数值或者直接变成NaN/Inf。我复盘过几次原因基本逃不出这几类第一P矩阵在长时间递推后失去正定性这通常是因为λ太小或者数值舍入误差累积第二数据里有缺失值或异常值喂进了NaN第三激励信号太弱回归矩阵接近病态。解决办法依次是把λ往回调到0.98以上每次更新P之后做一次对称化处理检查数据是否干净如果信号确实很弱考虑加一点随机扰动作为激励。还有一种相对稳妥的变体是带正则化的RLS在P逆矩阵更新时加一个小正则项能有效抑制数值发散。5.2 参数收敛不到真值参数持续在某个错误值附近波动最常见的原因是模型结构与实际系统不匹配。你拿一阶模型去辨识一个二阶系统参数当然无法收敛到“真值”因为所谓真值在一阶模型里根本不存在。另一个常见原因是信噪比太低测量噪声淹没了系统动态特征这时无论什么辨识算法都很难给出准确结果。我的调试建议是先用离线最小二乘对整段数据做一次辨识如果离线结果都明显偏离真值说明模型结构或数据质量有问题先解决这个如果离线结果没问题但递推结果不理想再检查初始化、遗忘因子、数据顺序等递推特有的环节。这个排查顺序能帮你快速缩小问题范围。5.3 P初值和遗忘因子是耦合的P初值取1e6还是1e3对算法前几步影响会很大。P初值过小会让参数更新幅度变小收敛变慢P初值过大会让前几步估计值波动剧烈但通常能快速拉回真值附近。遗忘因子和P初值会共同影响动态特性调参时要记住它们的本质都是在权衡“相信旧信息”和“接受新信息”。我一般先固定λ1、P初值取1e6把基础收敛性跑通然后再引入λ并逐步减小观察时变跟踪效果。这样分步调参能避免两个变量同时变动导致“不知道是谁的功劳”。5.4 数据预处理的隐形坑递推最小二乘默认数据是等间隔采样的。如果你的数据采集时间不均匀直接做递推会在时间语义上出错结果自然不可靠。这时候需要先做插值重采样。另外输入输出数据如果有明显的直流分量回归矩阵中的某些列会高度相关影响参数辨识的数值稳定性。建议先对输入输出做去均值处理也就是减去平均值只保留波动成分辨识完成后再还原到原始坐标。6. 从“跑通代码”到“真正掌握”的最后一步我的经验是处理这类资源包最有效的路径永远是“先复现、再改造、后内化”。解压之后先给代码每一行写上注释搞懂每一步对应哪个公式然后把它改造到你的场景里无论是换一个被辨识对象还是把模型阶数提高都会逼你重新审视回归向量的构造最后把遗忘因子、P初值当成实验变量去观察影响记录下你调参时看到的现象。做到这一步哪怕把别人的代码和word报告都还回去算法也已经长在你自己身上了。递推最小二乘是很多在线辨识方法的基础后面学卡尔曼滤波、自适应控制甚至各类梯度递推算法时你会发现它们的思维框架惊人相似都是“预测—修正—更新”的循环。把这个循环吃透比单纯解压一个rar、跑通一段脚本有意义得多。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价