2. MATLAB系统辨识工具箱快速入门

系统辨识的完整工作流可以概括为“准备数据 → 选择模型结构 → 估计参数 → 验证模型 → 应用模型”五个环节,而 MATLAB 的 System Identification Toolbox 正是围绕这条主线提供支持的。本节不讨论辨识算法本身,而是先把“工具用起来”:确认工具箱是否可用、认识图形界面与命令行两条入口、掌握数据对象的构造与导入方式,并完成一次最小可运行的辨识操作。

一、确认与安装工具箱

在动手之前,先确认当前 MATLAB 是否已经安装了该工具箱。最直接的方式是在命令行执行:

ver                      % 列出已安装的所有工具箱及版本
license('test','Identification_Toolbox')   % 返回 1 表示已授权
which ident              % 返回路径说明可用,返回空说明未安装

如果 ver 的输出中没有 “System Identification Toolbox”,则需要通过 MATLAB 的“附加功能 → 获取附加功能”(Add-Ons → Get Add-Ons)搜索并安装;校园版或网络许可用户通常由管理员统一部署,安装后重启 MATLAB 即可生效。安装完成后建议再执行一次 ver 确认版本号,因为不同版本在函数名和 App 名称上略有差异(例如早期版本使用 ident 图形界面,较新版本推荐使用 systemIdentification App)。

判断工具箱是否真正可用的标准不是“安装列表里有名字”,而是 which ident 能返回有效路径、且 systemIdentification 能正常打开 App 窗口。

二、两条入口:App 界面与命令行

工具箱提供两种互补的使用方式。图形界面适合探索性分析:在命令行输入 systemIdentification 打开 System Identification App,界面自上而下分为四个区域——左侧是“数据/模型”列表,用于导入和选择工作数据;中部是“操作选择区”,包含 Estimate(估计)、Process Models(过程模型)、Quick Start(快速开始)等入口;右侧是“结果视图区”,可切换 Time plot(时域曲线)、Frequency response(频响)、Model output(模型输出对比)、Residual analysis(残差分析)等视图;底部是状态提示区,显示当前数据区间、采样时间等信息。

命令行方式适合批量处理与脚本化复现。两者并非割裂:App 中的每一步操作都会在命令行历史中留下对应函数调用,可以据此把交互过程固化为脚本。常用命令按功能归类如下:

功能常用命令说明
构造数据对象iddata把输入输出数组封装为辨识专用对象
数据预处理detrend、resample、iddata 的 Ts 参数去趋势、重采样、设定采样时间
划分数据data(1:500)、merge按索引切片或合并多段实验数据
模型估计arx、armax、oe、bj、tfest、ssest不同结构的最小二乘/预测误差估计
模型比较compare、resid、predict拟合度对比、残差白性检验、预测
模型转换tf、ss、c2d、d2c传递函数/状态空间互转、连续离散互转

三、数据导入与 iddata 对象

辨识的第一步永远是数据。工具箱要求数据以 iddata 对象形式参与运算,其基本构造语法为:

% y: 输出序列(N×1),u: 输入序列(N×1),Ts: 采样周期
data = iddata(y, u, Ts);

% 若为多输入多输出,u 为 N×nu 矩阵,y 为 N×ny 矩阵
data = iddata(y, u, 0.01, 'Name', 'motor_test', ...
              'InputName', {'voltage'}, 'OutputName', {'speed'});

数据来源通常有三类:一是工作区中已有的数值数组,直接传入 iddata;二是文本或 Excel 文件,用 readmatrix 或 readtable 读入后再构造;三是 App 中的 Import data 菜单,支持从 MAT 文件、工作区变量或 Excel 导入。导入后务必检查三件事:采样时间 Ts 是否与实际一致(Ts=0 表示连续时间数据)、输入输出是否对齐、是否存在缺失值或异常跳变。可用 data.Ts、data.InputData、data.OutputData 查看属性,用 plot(data) 快速观察波形。

下面这张图把“从原始数据到可用模型”的关键路径与各环节对应的命令、检查点串在一起,可作为本节的操作地图:

系统辨识工具箱操作地图:数据 → 模型 → 验证 ① 数据准备 readmatrix / readtable iddata(y, u, Ts) detrend / resample plot(data) 观察波形 检查:Ts、对齐、缺失值 ② 数据划分 data_est = data(1:700) data_val = data(701:end) merge 合并多段实验 原则:估计集与验证集分离 ③ 模型估计 arx / armax / oe / bj tfest / ssest 指定阶次与延迟 App:Estimate → Quick Start ④ 模型验证与比较 compare 拟合度 fit % resid 残差白性检验 predict k 步预测对比 判断依据:验证集 fit 高、残差自相关落在置信区间内、模型阶次不过高 不满足则调整结构/预处理

四、一次最小可运行的辨识示例

下面用一段自造数据走通全流程,便于理解各命令的输入输出关系。示例数据由已知二阶系统生成,属于教学假设,不代表任何实测结果:

rng(1);                          % 固定随机种子,保证可复现
Ts = 0.05;                       % 采样周期 0.05 s
t  = (0:Ts:20)';                 % 20 s 数据
u  = idinput(length(t),'prbs',[0 0.3]);   % PRBS 激励信号
sys_true = tf([1],[1 1.2 1]);    % 假设真实连续系统
sys_d = c2d(sys_true, Ts);       % 离散化
y = lsim(sys_d, u, t) + 0.02*randn(size(t));  % 加少量噪声

data = iddata(y, u, Ts);         % 构造 iddata 对象
de = data(1:300);                % 估计集
dv = data(301:end);              % 验证集

m_arx = arx(de, [2 2 1]);        % ARX:na=2, nb=2, nk=1
m_oe  = oe(de,  [2 2 1]);        % OE 结构
compare(dv, m_arx, m_oe);        % 在验证集上比较拟合度
resid(dv, m_arx);                % 残差分析

运行后 compare 会给出各模型在验证数据上的拟合百分比(fit),数值越高说明模型输出与实际输出越接近;resid 会绘制残差自相关与输入互相关图,若曲线基本落在置信区间内,说明残差接近白噪声,模型未遗漏主要动态。若拟合度偏低,常见原因包括:阶次不足、延迟 nk 设置错误、数据未去趋势、或激励信号频带不足以激发系统动态。此时应回到数据准备与结构选择环节调整,而不是盲目提高阶次。

不要用估计集自身的拟合度作为最终评价标准。估计集拟合高只说明参数拟合了这批数据,验证集上的表现才反映模型的泛化能力。

五、基本操作中的几个易错点

  • 采样时间不一致:若 iddata 的 Ts 与实际采样周期不符,频响和预测结果都会失真。连续时间数据应显式设 Ts=0。
  • 输入输出维度错位:iddata(y,u,Ts) 中 y 在前、u 在后,多通道时按列排列,顺序必须与 InputName/OutputName 对应。
  • 直接对含趋势数据建模:温漂、零点漂移等慢变分量会被模型误当作动态,建议先 detrend 或差分处理。
  • 忽略延迟 nk:实际系统存在纯延迟时,若 nk 设为 1 而真实延迟为 3 个采样周期,ARX 会强行用高阶极点逼近,导致模型虚高。