尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

系统辨识与自适应控制MATLAB仿真:从递推最小二乘到MRAC实践

发布时间:2026/9/3 2:11:25

资讯中心
01
ARTICLE

系统辨识与自适应控制MATLAB仿真:从递推最小二乘到MRAC实践

系统辨识与自适应控制MATLAB仿真:从递推最小二乘到MRAC实践
简介北航《系统辨识与自适应控制MATLAB仿真》配套程序包适合正在学习系统辨识、自适应控制与MATLAB仿真的本科生或工程师用于打通理论到代码实现的环节。压缩包共114个文件内含46个m脚本、7个exe可执行程序以及Delphi/VB工程文件总大小约1MB解压后可按章节查找。已有272人学习内容覆盖最小二乘法、ARX/状态空间建模、模型参考自适应控制、LQG自适应控制、滑模控制等并涉及仿真步长设置、实验数据处理与结果绘图等技巧。此外程序中还包含不确定系统鲁棒处理的示例以及机械臂、电力系统等应用案例方便读者了解从建模、控制器设计到仿真验证的完整流程。为想在控制领域提升编程与调试能力的读者这套程序提供了完整可运行示例可对照教材逐行理解。 手头拿到过北航《系统辨识与自适应控制MATLAB仿真》课程配套程序包的人大概都经历过同样的场景课堂上推导公式推到怀疑人生最小二乘、递推估计、模型参考自适应控制一堆数学符号在PPT上整整齐齐一到自己动手仿真就不知道从哪里开始。这套程序的意义恰恰在于它把教材里那些抽象的递推公式和稳定性证明变成了可以直接运行、可以改参数、可以看曲线的m文件。无论你是正在修这门课的学生还是工作中需要做系统辨识或自适应控制项目但没经验的工程师把这套程序吃透都能省掉大量从零造轮子的时间。这篇文章我想从一个实际运行者的角度拆一下这套程序包里的核心模块、算法实现思路、以及我在跑通和复现过程里踩过的坑。我不会把每个文件逐行贴出来而是把“程序为什么这么组织”“每个核心算法需要盯哪些关键参数”“仿真不收敛时从哪里排查”这类真正影响你上手效率的问题讲清楚。1. 这套程序到底解决了什么问题1.1 辨识和控制为什么总是成对出现先捋一个基本逻辑链。系统辨识解决的是“被控对象到底长什么样”的问题也就是根据输入输出数据把对象的数学模型结构定下来参数估出来。自适应控制解决的是“对象参数在变控制器怎么跟着调”的问题。这两个问题在工程上是绑定的——你连对象模型都不知道控制器参数再怎么自适应也缺少基准反过来辨识出来的模型如果不能服务于控制设计那辨识就只是离线分析价值少了一大半。北航这套课程程序把这两块放在一起原因也在这。它不是单纯让你跑一个最小二乘就完事而是让你体验完整的闭环先对对象施加激励信号采集数据离线辨识对象模型再把这个模型作为自适应控制设计的基础在Simulink或m脚本里搭建控制回路观察参数突变时控制器如何调整自己。这种“先辨识、后控制”的叙事是这门课的核心主线也是程序包组织逻辑的骨架。1.2 MATLAB仿真在这门课里的真实角色MATLAB在这门课里不只是计算工具它承担了三层职能。第一层是算法验证把最小二乘、辅助变量法这些递推公式写成代码验证推导结果的正确性第二层是实验平台模拟各种噪声环境、参数时变场景这些在真实物理对象上很难人为制造但在仿真里可以随时注入第三层是演示工具课程答辩、报告里的辨识曲线、控制响应曲线基本都是靠这套仿真程序生成的。明白了这三层职能你再看程序包的构成就不会觉得杂乱。它既有离线辨识算法脚本又有在线递推算法脚本还有带噪声注入的信号生成模块和控制回路仿真模型。每个文件都对应着教学大纲里的某个知识点本质上是一套“可执行的讲义”。2. 程序库整体结构拆解2.1 辨识模块最小二乘家族的进阶路线辨识部分不是只给一个最小二乘就结束而是按照“基本方法→改进方法”的路线铺开的。我手里看到的程序包里最小二乘相关的脚本就有好几类一次完成最小二乘、递推最小二乘、增广最小二乘、广义最小二乘还有辅助变量法。这个编排顺序是有讲究的。普通最小二乘在噪声为白噪声的条件下是无偏估计这个条件在真实系统里几乎不成立噪声往往是相关的、有色的。增广最小二乘的思路是把噪声模型也纳入辨识范围把噪声模型的参数作为增广状态一起估计。广义最小二乘则是通过对数据预先滤波把有色噪声白化后再做最小二乘。辅助变量法更直接构造一个与噪声不相关的辅助变量来消除偏置。程序里这几个脚本放在一起你只要对比着跑一遍马上就能理解教科书上那句“有色噪声会使最小二乘估计有偏”到底是什么意思。每一个脚本的代码量其实都不大都在几十行到上百行的量级。关键在于这些脚本共享了一套数据生成函数你可以在统一的模型设定下切换辨识算法直接比较它们的估计精度。这种设计对学习特别友好强烈建议你不要只跑默认参数而是亲手改一改噪声方差、模型阶次感受不同算法的差异。2.2 自适应控制模块模型参考与自校正两条路线自适应控制部分主要覆盖两大方向模型参考自适应控制MRAC和自校正控制。MRAC的思想很直观你先设定一个参考模型这个模型的输出是你期望的响应然后通过自适应律调整控制器参数让实际对象的输出尽量去跟踪参考模型的输出。程序里MRAC的实现通常会提供两种自适应律的对比基于MIT律的梯度型设计和基于李雅普诺夫稳定性理论的超稳定性设计。MIT律实现简单但自适应增益选不好就容易发散李雅普诺夫方法更稳健但推导过程复杂。程序里把两种都写出来跑一下对比曲线你对“为什么教科书里强调稳定性设计”这个问题的理解会直接上几个台阶。自校正控制那边核心是“在线辨识 控制器参数计算”的实时循环。每来一个新数据先用递推参数估计更新模型参数再根据新的模型参数计算控制器参数。程序里一般会实现最小方差自校正控制或极点配置自校正控制的仿真你可以直观看到控制器参数在仿真过程中如何一步步自动调整最终把输出方差压下去。3. 核心算法实现与参数调试要点3.1 递推最小二乘的代码骨架递推最小二乘RLS是整套程序里的重中之重后面几乎所有在线算法都基于它。核心代码其实很紧凑关键就四步计算增益、更新参数估计、更新协方差矩阵、递推推进。我习惯把一个基础的RLS循环写成下面这样方便对照程序理解。% theta: 参数向量初始化(一般给零向量) % P: 协方差矩阵初始化(C通常较大比如eye(n)*1000) for k 1:N phi [-y(k-1), -y(k-2), u(k-1), u(k-2)]; % 回归向量 % 计算增益 K P * phi / (lambda phi * P * phi); % 更新参数估计 theta theta K * (y(k) - phi * theta); % 更新协方差矩阵 P (eye(n) - K * phi) * P / lambda; end这段代码里最值得研究的是lambda也就是遗忘因子。lambda取1时算法不会遗忘以前的数据适合时不变系统lambda取0.95到0.99之间时算法会更重视近期数据适合参数缓慢时变的系统。但lambda不能取得太小否则协方差矩阵P会不断增大参数估计在噪声作用下剧烈漂移甚至发散。另外要注意回归向量的构造顺序这直接影响到你最后读出来的参数对应关系。程序里通常把输出项放在前面输入项放在后面排列顺序和你在理论推导里使用的差分方程形式是对应的。改程序前先把这个对应关系理顺否则你辨识完都不知道theta里哪一项是a1、哪一项是b1。3.2 遗忘因子和噪声设置的经验值看了不少同学跑这套程序时踩的坑大部分问题其实出在两个地方遗忘因子和噪声设置。遗忘因子这块我的经验是除非你要辨识时变系统否则尽量取0.98以上。很多初学者为了展示算法的自适应能力一上来就把lambda设成0.9结果曲线抖得跟心电图一样还想不明白为什么。道理很简单lambda越小算法对噪声越敏感历史数据被快速遗忘参数估计的方差就会变大。如果是离线辨识一段固定数据直接用lambda1就行不需要引入遗忘机制。噪声设置方面程序里一般会在信号生成部分给一个高斯白噪声发生函数幅度用方差或信噪比控制。想得到漂亮的辨识结果信噪比不能太低一般保证噪声方差是信号方差的10%以内。想测试算法在恶劣条件下的表现再把噪声加大。我给你的建议是先跑出无噪声或弱噪声条件下的理想结果确认实现正确再逐步加大噪声观察各种辨识算法的退化差异这才是这套程序的教学重点。3.3 模型参考自适应控制的仿真搭建要点MRAC仿真在程序包里通常有两种实现方式全部写在m脚本里或者用Simulink搭建。m脚本的方式更适合理解算法流程Simulink方式更适合观察控制系统的实时响应。如果是m脚本方式你需要手动写被控对象差分方程在每个仿真步长内先计算参考模型输出再根据误差计算自适应律最后更新控制量。这个流程看着简单但有一个很容易踩的坑自适应增益gamma的取值尺度。gamma太小参数调节速度慢误差半天消不掉gamma太大系统高频震荡甚至发散。不是每个程序都给了合适的默认gamma所以你要做好手动调参的心理准备。我的做法是先用很小的gamma比如0.01量级跑一遍确定系统不发散以后再逐步增大gamma观察误差下降速度和震荡情况找到“误差收敛快但震荡不明显”的临界值。这个过程很像调PID参数需要一点耐心但试过几次以后你对自适应律的收敛机制会形成很直观的直觉。4. 实操过程与仿真场景复现4.1 一个典型场景带噪声的二阶系统辨识我用程序包里的标准示例给你演示一个完整的辨识流程。假设被控对象是一个二阶离散系统真实差分方程是y(k) 1.2*y(k-1) 0.35*y(k-2) 0.4*u(k-1) 0.2*u(k-2) v(k)其中v(k)是零均值白噪声方差设为0.01。系统是稳定的两个极点都在单位圆内属于比较温和的辨识对象。仿真第一步是生成激励信号程序里一般会用M序列或者伪随机二进制序列PRBS。激励信号长度取500到1000个点足够了。第二步是采集输入输出数据然后调用一次完成最小二乘脚本得到离线辨识结果。对同样的数据再调用递推最小二乘脚本观察参数估计随迭代次数的收敛轨迹。对比两组结果你会发现离线最小二乘直接给出一个估计值而递推最小二乘展示的是一条从初始值逐步逼近真值的曲线。这条收敛曲线就是课程里反复强调的“在线实时辨识”的直观证据。我把这个过程的脚本骨架整理如下你可以对照程序包理解% 生成PRBS激励信号 u idinput(N, prbs); % 模拟对象输出 for k 3:N y(k) -1.2*y(k-1) - 0.35*y(k-2) 0.4*u(k-1) 0.2*u(k-2) v(k); end % 构造回归矩阵 Phi [-y(2:N-1), -y(1:N-2), u(2:N-1), u(1:N-2)]; % 一次完成最小二乘 theta_ls Phi \ y(3:N); % 递推最小二乘 [theta_rls, traj] rls_fun(y(3:N), u(3:N), 0.99);这里有个小细节构造回归矩阵时会把y的延时项和输入项错位排列常见错误是padding的时候没有对齐导致后面的数据全部错位。拿着程序跑之前先像上面这样把索引关系理清能省很多排查时间。4.2 激励信号的选择逻辑激励信号不是随便给个正弦波就行系统辨识领域有个硬性要求叫“持续激励条件”。简单说输入信号必须足够丰富能够激发系统的所有动态模态否则辨识算法没法产生足够的有效信息来估计全部参数。我见过很多同学直接用阶跃信号做激励辨识出来的参数一塌糊涂还以为是算法写错了。原因很简单阶跃信号只在低频段有能量激发不出系统的高频特性。程序里默认提供的是PRBS信号也就是伪随机二进制序列它的频谱近似白噪声在整个频带内都有能量分布能有效激励系统。如果你自己设计激励信号记住这个原则优先选用PRBS或多正弦叠加信号避免用恒定值或单一频率正弦。信号幅值方面也要兼顾系统线性和信噪比。幅值太小辨识结果被噪声淹没幅值太大可能把系统推出线性工作区导致模型失配。实际操作中一般取系统正常工作幅值的5%到20%之间具体多少要根据你的对象特性来定。4.3 结果曲线怎么读跑完辨识仿真你面前通常有三类曲线输出响应对比图、参数收敛轨迹图、误差曲线图。这三类图的读法不一样很多人只盯着输出对比图看其实信息量最大的是参数收敛轨迹。输出响应对比图看的是模型拟合精度也就是实际系统输出和辨识模型输出的重合程度。如果两条曲线基本重叠说明模型结构正确、参数估计精度高。参数收敛轨迹图看的是递推算法的收敛行为重点观察参数是否从初始值快速收敛到真值附近收敛后是否稳定有没有持续漂移。误差曲线图看的是残差性质白噪声情况下的残差应该是不相关的如果残差出现明显的自相关说明模型阶次可能不够或者噪声模型没有正确辨识。自适应控制部分的曲线解读稍有不同。MRAC仿真里你需要同时看跟踪误差和参数调节轨迹。跟踪误差是指参考模型输出和对象实际输出的差这个差值应该逐步收敛到零附近。参数调节轨迹展示的是控制器参数在自适应律作用下的演化过程同样的应该收敛到某个稳定区域而不是持续发散。5. 常见问题与排查技巧实录5.1 参数估计不收敛时的排查路径这是我在使用这套程序时收到反馈最多的问题。按我的经验不收敛的原因可以按概率排序激励信号不够丰富、遗忘因子太小、模型阶次给错、初始协方差矩阵设置不合理。排查顺序建议这样来。先换成程序默认的PRBS激励排除信号问题再把遗忘因子改成1排除遗忘因子造成的漂移再检查模型阶次如果程序允许你配置ARX模型的阶次确保na、nb设置和真实系统一致最后看初始协方差矩阵P矩阵初始值决定了算法对初始参数估计的信任程度一般取1000乘单位阵量级如果初始值太小算法会过度信任初始参数收敛速度变得非常慢。5.2 数值稳定性的坑MATLAB仿真里有个很容易被忽视的问题矩阵求逆或除法运算在条件数很大时会产生数值不稳定。递推最小二乘里协方差矩阵P在迭代过程中可能因为遗忘因子的作用变得病态导致计算结果失真。遇到这种情况你可以考虑改进算法比如使用带遗忘因子的UD分解或平方根滤波数值稳定性会好很多。如果你不想修改算法结构至少可以做一件事在协方差矩阵更新时加入一个非常小的正定矩阵保护项防止P矩阵奇异。这个方法简单但有效我在实际调试中多次靠它解决了发散问题。5.3 MATLAB版本兼容与运行环境这套程序是老课程资料编写时使用的MATLAB版本可能是早期版本直接用新版MATLAB打开运行时可能会遇到一些兼容问题。最常见的包括绘图命令的语法变化、某些统计工具箱函数被移除或改名、以及Simulink模块库路径变化。我建议遇到报错时先看错误信息里的函数名去MATLAB官方文档里查一下有没有替代函数。比如老程序里用star(t)这种工具命令新版本放在系统辨识工具箱里。如果只是绘图相关的问题直接把绘图部分替换成新语法就行。另外确保你已经安装了System Identification Toolbox和Control System Toolbox这套程序的很多功能依赖这两个工具箱。还有一个小技巧如果你装的MATLAB版本太新某些老脚本可能因为图窗对象访问方式不同而报警告。这些警告通常不影响程序结果但会在命令行刷屏。如果嫌烦可以在脚本开头加上warning off屏蔽掉非关键警告让输出界面整洁一些。6. 环境配置与程序组织建议6.1 运行前的目录准备拿到程序包后第一件事不是急着双击运行而是先把目录结构梳理一遍。我习惯把所有脚本放在一个专门的工程目录下并清空MATLAB的当前路径干扰。顺序是新建一个文件夹比如sys_id_adap_ctrl_demo把程序所有m文件和模型文件放进去右键文件夹添加到路径。然后按依赖关系整理一下程序清单弄清楚哪个是主程序、哪个是函数脚本、哪个是数据生成脚本。大多数情况下程序包里会有几个明显的入口文件文件名可能包含main或demo字样其余是函数文件。如果目录组织比较乱你可以在MATLAB里用依赖分析工具找出每个主文件依赖哪些子函数把依赖关系理清再运行。6.2 怎么把程序改成自己的项目需求这套程序虽然是课程配套但把它改成自己项目用的代码也并不难。核心思路是替换对象模型和参数配置。如果你要做自己系统的辨识需要修改对象仿真部分把默认的差分方程换成你的系统模型。如果你只有实际采样的输入输出数据那就不需要对象仿真部分直接把数据读入跳过信号生成环节进入辨识算法。自适应控制部分你需要根据自己的控制目标修改参考模型和控制器参数计算逻辑。我见过不少人成功把这套代码改造成工业现场模型在线校正工具的原型。它当然不适合直接用于嵌入式系统但作为算法验证和离线分析工具这套代码足够你跑通整个技术路线。归根结底这套程序的真正价值不在于代码本身而在于它把两条完整的技术链路演示得清清楚楚一条是从数据到模型的辨识之路一条是从模型到控制的自适应之路。把这两条链路的每一环吃透比单纯记代码有意义得多。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。