利用时序数据进行时域系统辨识
时间表是一种内置的 MATLAB® 数据类型,由 timetable 对象表示。时间表可以包含多个变量,通常用于表示按时间顺序排列的观测值或数据值。在系统辨识中,您可以使用包含估计输入和输出信号通道的时间表数据。您可以通过时间表构造函数,或者使用 array2timetable 命令来创建时间表。当您从数据文件(如 csv 文件或电子表格)将数据导入 MATLAB 时,导入过程会自动生成时间表。
例如,创建一个单变量时间序列,其中包含五秒时间段内的随机数据。
T = seconds(1:5)'; u = rand(5,1); tt = timetable(T,u)
tt=5×1 timetable
T u
_____ _______
1 sec 0.81472
2 sec 0.90579
3 sec 0.12699
4 sec 0.91338
5 sec 0.63236
时间向量本身并不是一个变量。您可以通过属性 tt.Properties.RowTimes 访问 tt 中的时间向量 T。其他与时间相关的属性是 tt.Properties.SampleRate 和 tt.Properties.TimeStep。
T = tt.Properties.RowTimes
T = 5×1 duration
1 sec
2 sec
3 sec
4 sec
5 sec
辨识通常需要均匀采样数据。这意味着 SampleRate 和 TimeStep 属性必须各自包含一个有限值。该要求的例外之一是神经状态空间模型,它由 idNeuralStateSpace 对象表示。要估计该模型的连续时间形式,时刻表的采样点不必均匀分布。
System Identification Toolbox™ 支持基于 timetable 的估计数据,适用于 R2022b 及后续版本。对于早期版本,您必须使用 iddata 对象来表示估计数据。
定义变量
通常情况下,时间表不仅可以存储非数值数据,还可以为每个时间值存储任意大小的样本。但是,只能使用数值型标量变量来辨识模型。例如,假设您有两个信号 u1 和 u2 的数据,它们共享一个共同的时间向量 T。将这些信号存储在时刻表中有两种方法:
作为单个变量,其值在给定时间
t时为一个包含 2 个元素的向量[u1(t), u2(t)]。作为两个独立的变量,每个信号对应一个。
在 System Identification Toolbox 中,第二种选项 - 为每个信号使用不同的变量 - 是唯一受支持的表示方式。以下示例展示了这两种方法的结果。
创建一个包含两个随机数据信号的数据集。
T = seconds(1:5)'; u1 = rand(5,1); u2 = rand(5,1);
通过将 u1 和 u2 合并到一个变量 U 中,实现选项 1。
tt1 = timetable(T, [u1, u2], 'VariableNames', {'U'}); head(tt1)
T U
_____ __________________
1 sec 0.09754 0.15761
2 sec 0.2785 0.97059
3 sec 0.54688 0.95717
4 sec 0.95751 0.48538
5 sec 0.96489 0.80028
通过将 u1 和 u2 分别赋值给变量 u1 和 u2,来实现选项 2。
tt2 = timetable(T, u1, u2, 'VariableNames', {'u1','u2'}); head(tt2)
T u1 u2
_____ _______ _______
1 sec 0.09754 0.15761
2 sec 0.2785 0.97059
3 sec 0.54688 0.95717
4 sec 0.95751 0.48538
5 sec 0.96489 0.80028
您不能将 tt1 用于模型估计和分析。只有 tt2 才是有效的表示形式。
使用指定的输入和输出通道对模型进行估计
根据包含两个输入通道和两个输出通道的数据,估计一个模型。
加载数据。
load steamdata ttsteam head(ttsteam,4)
Time Pressure MagVolt GenVolt Speed
________ ________ _______ ________ _________
0.05 sec -1.5283 2.0584 0.57733 -0.12274
0.1 sec 1.4412 -2.005 0.75804 -0.086114
0.15 sec 1.4314 2.0584 -0.76577 -0.19845
0.2 sec 1.4412 -1.9806 0.47721 -0.20577
ttsteam 包含输入变量 Pressure 和 MagVolt 以及输出变量 GenVolt 和 Speed。
您可以使用其中任意一个或所有可用通道,但必须显式指定要使用的通道。默认情况下,该软件将最后一个变量视为单个输出通道,其余变量视为输入通道。
将极点数和零点数均设为 2,并尝试在不指定输入和输出通道的情况下估计模型。
np = 2; nz = 2; sysdef = tfest(ttsteam,np,nz);
查看输入和输出的默认分配。
inputs = sysdef.InputName
inputs = 3×1 cell
{'Pressure'}
{'MagVolt' }
{'GenVolt' }
outputs = sysdef.OutputName
outputs = 1×1 cell array
{'Speed'}
fit = sysdef.Report.Fit.FitPercent
fit = 71.2432
该软件将前三个变量指定为输入。
使用两个输入通道对模型进行估计,但仅使用 GenVolt 输出通道。
sys21 = tfest(ttsteam, np, nz, 'InputName',{'Pressure','MagVolt'},'OutputName','GenVolt'); outputs = sys21.Outputname
outputs = 1×1 cell array
{'GenVolt'}
fit = sys21.Report.Fit.FitPercent
fit = 90.8266
使用所有通道对模型进行估计。
sys22 = tfest(ttsteam, np, nz, 'InputName',{'Pressure','MagVolt'},'OutputName',{'GenVolt','Speed'}); fit = sys22.Report.Fit.FitPercent
fit = 2×1
90.8150
63.0827
在所有需要输入/输出数据的模型验证和分析操作中,均可使用时间表。估计模型会存储输入和输出通道信息,因此在使用这些操作时,无需指定要使用哪些通道。
compare(ttsteam, sys22)

整合来自多个实验的数据
一张时间表只能表示单次试验的数据。如果您有来自多个试验的多个时间表,可以将这些时间表合并到一个元胞数组中,并使用该元胞数组进行估计和分析。元胞数组中的各个时间表被称为试验。例如,变量 X = {tt1, tt2, tt3} 表示一个由三个试验 tt1, tt2 和 tt3 组成的多试验数据集。每个试验必须具有相同的数据类型(在本例中为“时间表”)、相同的活动数值变量,以及相同的采样时间和时间单位。各试验的开始时间以及观测次数可能有所不同。
加载两个时间表:tt1 和 tt2。仅为本示例之目的,假设这两个时刻表对应的是同一个系统。这些时序的长度各不相同,但采样率均为 10 Hz。
load sdata1 tt1 load sdata2 tt2
创建一个包含多个试验的元胞数组。
MultiExpData = {tt1, tt2};使用 MultiExpData 来估计一个非线性 ARX 模型。
Orders = [5 5 1]; NL = idGaussianProcess; nlsys = nlarx(MultiExpData, Orders, NL);
将模型响应与估计数据进行比较。
compare(MultiExpData, nlsys);
该图显示了对第一个数据集的拟合结果。在绘图上右键点击,然后通过上下文菜单选择要查看的第二个数据试验。要调用上下文菜单,必须通过命令行窗口生成绘图,而不是通过脚本生成。
与前面的函数类似,您可以利用多试验数据进行模型仿真、响应预测和残差分析。例如,用 MultiExpData 仿真 nlsys。
sim(nlsys,MultiExpData)


该图展示了仿真结果。
另请参阅
timetable | array2timetable | compare | sim