主要内容

本页采用了机器翻译。点击此处可查看英文原文。

利用时序数据进行时域系统辨识

时间表是一种内置的 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.SampleRatett.Properties.TimeStep

T = tt.Properties.RowTimes
T = 5×1 duration
   1 sec
   2 sec
   3 sec
   4 sec
   5 sec

辨识通常需要均匀采样数据。这意味着 SampleRateTimeStep 属性必须各自包含一个有限值。该要求的例外之一是神经状态空间模型,它由 idNeuralStateSpace 对象表示。要估计该模型的连续时间形式,时刻表的采样点不必均匀分布。

System Identification Toolbox™ 支持基于 timetable 的估计数据,适用于 R2022b 及后续版本。对于早期版本,您必须使用 iddata 对象来表示估计数据。

定义变量

通常情况下,时间表不仅可以存储非数值数据,还可以为每个时间值存储任意大小的样本。但是,只能使用数值型标量变量来辨识模型。例如,假设您有两个信号 u1u2 的数据,它们共享一个共同的时间向量 T。将这些信号存储在时刻表中有两种方法:

  1. 作为单个变量,其值在给定时间 t 时为一个包含 2 个元素的向量 [u1(t), u2(t)]

  2. 作为两个独立的变量,每个信号对应一个。

在 System Identification Toolbox 中,第二种选项 - 为每个信号使用不同的变量 - 是唯一受支持的表示方式。以下示例展示了这两种方法的结果。

创建一个包含两个随机数据信号的数据集。

T = seconds(1:5)';
u1 = rand(5,1);
u2 = rand(5,1);

通过将 u1u2 合并到一个变量 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

通过将 u1u2 分别赋值给变量 u1u2,来实现选项 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 包含输入变量 PressureMagVolt 以及输出变量 GenVoltSpeed

您可以使用其中任意一个或所有可用通道,但必须显式指定要使用的通道。默认情况下,该软件将最后一个变量视为单个输出通道,其余变量视为输入通道。

将极点数和零点数均设为 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)

MATLAB figure

整合来自多个实验的数据

一张时间表只能表示单次试验的数据。如果您有来自多个试验的多个时间表,可以将这些时间表合并到一个元胞数组中,并使用该元胞数组进行估计和分析。元胞数组中的各个时间表被称为试验。例如,变量 X = {tt1, tt2, tt3} 表示一个由三个试验 tt1, tt2tt3 组成的多试验数据集。每个试验必须具有相同的数据类型(在本例中为“时间表”)、相同的活动数值变量,以及相同的采样时间和时间单位。各试验的开始时间以及观测次数可能有所不同。

加载两个时间表:tt1tt2。仅为本示例之目的,假设这两个时刻表对应的是同一个系统。这些时序的长度各不相同,但采样率均为 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)

MATLAB figure

MATLAB figure

该图展示了仿真结果。

另请参阅

| | |

主题