主要内容

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

iddata

在时域或频域中用于系统辨识的输入-输出数目据及其属性

说明

使用 iddata 对象封装您想要辨识的系统的输入和输出测量数据。系统辨识函数使用这些测量值来估计模型。模型验证函数使用输入测量值来提供仿真的输入,并使用输出测量值来比较估计的模型响应与原始数据的拟合度。

iddata 对象可以包含一组测量值或多组测量值。每组数据对应一个试验。对象具有以下特征,这些特征在对象属性中编码:

  • 数据可以位于频域中,也可以位于时域中。您可以将对象从一个域转换到另一个域。

  • 在时域中,数据可以均匀采样,也可以非均匀采样。然而,要使用 iddata 对象进行估计,必须对数据进行均匀采样,并且必须在同一时刻记录每个试验的输入和输出数目据。

  • 您可以指定数据属性,例如采样时间、开始时间、时间点、频率采样点和采样间行为。

  • 您可以提供标签和注释来区分和注释数据组件、试验和整个对象。

要访问对象属性,请使用圆点表示法。例如,假设您使用命令 sys = iddata(ym,um,Tsamp) 创建了一个 iddata 对象,其中 ym 是测量的输出数目据,um 是测量的输入数目据,Tsamp 是采样时间。iddata 分别将这些变量存储在属性 InputDataOutputDataTs 中。您可以使用 sys.InputDatasys.OutputDatasys.Ts 查看或修改数据。有关使用圆点表示法查看和修改属性的示例,请参阅查看和修改属性

创建对象

描述

使用时域数据

data = iddata(y,u,Ts) 创建一个包含时域输出信号 y 和输入信号 uiddata 对象。Ts 指定试验数据的采样时间。

您可以通过将 yu 指定为元胞数组来使用 iddata 创建多试验 iddata 对象。您也可以创建单试验 iddata 对象并使用 merge (iddata) 将这些对象组合成一个多试验 iddata 对象。有关多试验 iddata 对象的详细信息,请参阅Create Multiexperiment Data at the Command Line

示例

data = iddata(y,[],Ts) 为时间序列数据创建一个 iddata 对象。该对象包含一个时域输出信号 y 和一个空输入信号 []Ts 指定试验数据的采样时间。

示例

data = iddata(tt) 根据时间表 tt 创建一个 iddata 对象。

该软件从 tt 中提取变量名称和采样时间。

默认情况下,该软件将 tt 中的最后一个变量解释为单个输出通道,而所有其他变量都是输入通道。要更改此解释,请使用名称-值参量设置 'InputName''OutputName' 属性。

示例

使用频域数据

data = iddata(y,u,Ts,'Frequency',W) 创建一个包含频域数据的 iddata 对象。Widdata 属性 Frequency 设置为频率向量。通常,yu 是时域信号的离散傅里叶变换。

示例

配置其他属性

data = iddata(___,Name,Value) 使用名称-值参量设置附加属性。在前面语法中的任何输入参量组合后指定 Name,Value

示例

输入参量

全部展开

系统的输出信号,指定为下列内容之一:

  • 单输出系统的 N×1 向量,其中 N 是观测值的数量

  • 多输出系统的 N×Ny 矩阵,其中 Ny 是输出通道的数量

  • 多试验数据集的 Ne 元素元胞数组,其中 Ne 是试验数量,每个元胞都包含一个试验的输出信号

  • [](对于没有输出信号的系统,例如仅记录输入信号时)

y 必须与输入数目据 u 位于同一域中。如果数据在时域中,则必须在同一时刻记录 yu

如果使用 iddata 对象进行估计,则必须对 yu 进行均匀采样。如果非均匀性较小,您也许能够将数据转换为具有足够完整性的均匀采样集,以便转换后的数据支持估计。有关您可以尝试的技术的详细信息,请参阅 interp1MATLAB 中的缺失数据

y 设置 iddata 对象的 OutputData 属性。

系统的输入信号,指定为下列内容之一:

  • 单输入系统的 N×1 向量,其中 N 是观测值的数量

  • 多输入系统的 N×Nu 矩阵,其中 Nu 是输入通道的数量

  • 多试验数据集的 Ne 元素元胞数组,其中 Ne 是试验数量,每个元胞都包含一个试验的输入信号

  • [](对于没有输入信号的系统,例如时间序列)

u 必须与输出数目据 y 位于同一域中。如果数据在时域中,则必须在同一时刻记录 yu

如果使用 iddata 对象进行估计,则必须对 yu 进行均匀采样。如果非均匀性较小,您也许能够将数据转换为具有足够完整性的均匀采样集,以便转换后的数据支持估计。有关您可以尝试的技术的详细信息,请参阅 interp1MATLAB 中的缺失数据

u 设置 iddata 对象的 InputData 属性。

输入和输出信号的时间表,指定为使用固定间隔的时间向量的时间表。

对于多试验数据,将 tt 指定为 Ne×1 元胞数组,其中 Ne 是试验的数量。

要辨识哪些变量是输入信号以及哪些变量是输出信号,或者提取部分变量进行转换,请使用名称-值参量设置 'InputName''OutputName' 属性。

以属性 TimeUnit 指定的单位表示的采样时间,指定为以下项之一:

  • yu 均匀采样时的标量。

  • 0(对于频域中的连续时间数据)。

  • [](当 yu 不是均匀采样,并且您在属性 SamplingInstants 中指定时间值时)。对于非均匀采样,yu 必须位于时域中。

Ts 设置 iddata 对象的 Ts 属性。

属性

全部展开

数据时域或频域,指定为下列二者之一:

  • 'Time' - 数据位于时域中

  • 'Frequency' - 数据位于频域中

iddata 对象中包含的每个数据集的名称,指定为字符向量的 Ne×1 元胞数组,其中 Ne 是试验的数量。每个元胞都包含相应试验的名称。例如,{'MyMeas1';'MyMeas2';'MyMeas3'} 包含三试验 iddata 对象的试验名称。

频域数据的频率值,指定为下面二者之一:

  • N×1 向量,其中 N 是单个试验中的频率值的数量

  • Ne 元胞数组,其中 Ne 是试验的数量,每个元胞都包含相应试验的频率向量。频率向量必须全都采用相同的单位。

频域数据的频率单位,指定为标量。此属性适用于数据集中的所有元素。

更改此属性不会缩放或转换数据。修改该属性只会更改现有数据的解释。

系统的输入信号值,指定为以下项之一:

  • N×Nu 矩阵(对于单个试验),其中 N 是数据采样的数量,Nu 是输入通道的数量

  • 包含 Ne 个单试验矩阵的元胞数组(对于多个试验),其中 Ne 是试验的数量

从命令行访问 InputData 时,可以使用简写形式 u。例如,u1 = data.InputData 等同于 u1 = data.u

输入通道名称,指定为 Nux1 元胞数组,其中 Nu 是输入通道的数量。

输入通道单位,指定为 Nux1 元胞数组,其中 Nu 是输入通道的数量。每个元胞都包含相应输入通道的单位。

示例: {'rad';'rad/s'}

离散时间和连续时间之间的转换的采样间行为,指定为字符向量或字符向量元胞数组。对于每个试验,每个输入通道的可能值如下:

  • zoh - 零阶保持在采样之间维持分段常数输入信号。

  • foh - 一阶保持在采样之间维持分段线性输入信号。

  • bl - 带限行为指定连续时间输入信号在奈奎斯特频率以上的功率为零。

对于具有单个输入通道的单个试验,InterSample 包含上一列表中的一个值。对于多个试验,InterSampleNu×Ne 元胞数组,其中 Nu 是输入通道的数量,Ne 是试验的数量。每个元胞都包含与该元胞代表的试验和输入通道相关联的行为值。

数据集的名称,指定为字符向量。

示例: 'dryer data'

关于数据集的注释,指定为字符向量,或者 Ne×1 元胞数组(对于多试验数据集),其中 Ne 是试验的数量。

示例: {'data from experiment 1';data from experiment 2'}

系统的输出信号值,指定为以下项之一:

  • N×Ny 矩阵(对于单个试验),其中 N 是数据采样的数量,Ny 是输出通道的数量

  • 包含 Ne 个单试验矩阵的元胞数组(对于多个试验),其中 Ne 是试验的数量

从命令行访问 OutputData 时,可以使用简写形式 y。例如,y1 = data.InputData 等同于 y1 = data.y

输出通道名称,指定为 Nyx1 元胞数组,其中 Ny 是输出通道的数量。

输出通道单位,指定为 Nyx1 元胞数组,其中 Nu 是输出通道的数量。每个元胞都包含相应输入通道的单位。

示例: {'rad';'rad/s'}

输入信号的周期,指定为双精度值(对于每个试验)。对于非周期性输入信号,该值为 Inf;对于周期性输入信号,该值为以属性 TimeUnit 指定的单位表示的周期。

  • 对于具有单个输入通道的单个试验,Period 包含单个值。

  • 对于多输入系统,PeriodNu×1 向量,其中 Nu 是输入通道的数量,第 k 个条目包含第 k 个输入的周期。

  • 对于多试验数据,Period 是 1×Ne 元胞数组,其中 Ne 是试验的数量,每个元胞都包含相应试验的周期标量或向量。

TimeUnit 指定的单位表示的时域数据的时间值,指定为以下项:

  • N×1 向量,其中 N 是数据点的数量

  • Ne 元胞数组,其中 Ne 是试验的数量,每个元胞都包含相应试验的采样时刻。

SamplingInstants 中的值可以是均匀的,也可以是不均匀的。如果您指定 Ts 属性,软件会根据 TsTstart 计算 SamplingInstants 中的均匀时间值。如果有非均匀的采样点,请在 SamplingInstants 中指定时间值。软件然后将 Ts 属性设置为空。估计函数不支持非均匀采样。

时间变量和采样时间的单位,指定为标量。此属性适用于数据集中的所有试验。

更改此属性不会重新采样或转换数据。修改该属性只会更改现有数据的解释。

TimeUnit 指定的单位表示的采样时间,指定为标量或元胞数组。对于每个试验,该值是以下项之一:

  • 标量(当 yu 均匀采样时)

  • 0(对于频域中的连续时间数据)

  • [](当 yu 非均匀采样且在时域中),因为 SamplingInstants 属性设置此类数据的时间值。

对于单个试验,Ts 是标量。对于多试验数据,Ts 是 1×Ne 元胞数组,其中 Ne 是试验的数量,每个元胞都包含相应试验的采样时间。

对于频域数据,该软件使用 Ts 来解释数据。

  • 如果 Ts 为 0,该软件将输入和输出解释为相应信号的连续时间傅里叶变换 (CTFT)。

  • 如果 Ts 是标量,该软件将输入和输出解释为相应信号的离散时间傅里叶变换 (DTFT),其中 Ts 为采样时间。

时域数据的开始时间,指定为以下项:

  • 标量(对于单个试验)

  • 1xNe 元胞数组(对于多个试验),其中 Ne 是试验的数量,每个元胞都包含相应试验的开始时间

对于均匀采样数据,Tstart 的默认值是 Ts;对于非均匀采样数据,该默认值为 []

数据集的附加注释,指定为任何 MATLAB 数据类型。

对象函数

一般来说,任何适用于系统辨识数据的函数都适用于 iddata 对象。这些函数有三种通用类型。

  1. iddata 对象进行运算并返回该对象的函数使您能够操作和处理 iddata 对象。

    • 使用 fftifft 将现有的 iddata 对象转换为时域和频域。例如:

      datafd = fft(Data);
      datatd = ifft(Dataf);

    • 使用 merge (iddata)iddata 对象合并为包含多个试验的单个 iddata 对象。要从多试验 iddata 对象中提取试验,请使用 getexp。例如:

      data123 = merge(data1,data2,data3);
      data2 = getexp(data123,2);
      

      有关更详细的示例,请参阅提取并建模特定数据段

    • 使用预处理函数(例如 detrendidfilt)来过滤 iddata 对象中的数据并删除不正确的数据。例如:

      data_d = detrend(data);
      data_f = idfilt(data,filter);

  2. iddata 对象执行解析处理并创建绘图或返回特定参数或值的函数可让您分析数据并确定用于估计的输入。

    • 使用分析函数(例如 delayestspa)来计算时间延迟和频谱等变量。

  3. 使用 iddata 对象中的数据来估计、仿真和验证模型的函数可让您创建动态模型并评估模型响应与验证数据的匹配度。

    • 使用估计函数(例如 ssesttfest)来估计具有特定结构的模型。

    • 使用验证函数(例如 comparesim)来仿真估计模型,并将仿真输出与验证数据和其他模型进行比较。

    以下列表包含可与 iddata 对象一起使用的函数的代表性子集。

全部展开

idplotPlot input and output channels of estimation data
getexp从多试验数据集中获取特定试验
merge (iddata)Merge data sets into iddata object
detrendSubtract offset or trend from time-domain signals contained in iddata objects
retrendAdd offsets or trends to time-domain data signals stored in iddata objects
idfiltFilter data using user-defined passbands, general filters, or Butterworth filters
diffiddata 对象中的差异信号
misdataReconstruct missing input and output data
idresampResample time-domain data by decimation or interpolation
fftiddata 对象的快速傅里叶变换 (FFT)
ifft将 iddata 对象从频域转换为时时域
realdataDetermine whether iddata is based on real-valued signals
delayest根据数据估计时间延迟(死区时间)
isrealDetermine whether model parameters or data values are real
impulseestNonparametric impulse response estimation
pexcitLevel of excitation of input signals
checkFeedbackIdentify possible feedback data
etfeEstimate empirical transfer functions and periodograms
spafdrEstimate frequency response and spectrum using spectral analysis with frequency-dependent resolution
spaEstimate frequency response with fixed frequency resolution using spectral analysis
dataPlotOptionsOption set for idplot when plotting input/output estimation data contained in a timetable, numeric matrices, or an iddata object
ssestEstimate state-space model using time-domain or frequency-domain data
tfest估计传递函数模型
ar辨识标量时间序列的 AR 模型或 ARI 模型时估计参数
simSimulate response of identified model
findstatesEstimate initial states of model
compare将辨识模型输出与测量的输出进行比较
predict预测辨识模型的 K 步输出
goodnessOfFit用于分析和验证辨识模型的测试数据和参考数据之间的拟合优度
procestEstimate process model using time-domain or frequency-domain data
residCompute and test residuals

示例

全部折叠

使用单输入/单输出 (SISO) 时域数据创建 iddata 对象。输入和输出各包含 1000 个采样,采样时间为 0.08 秒。

load dryer2_data output input;
data = iddata(output,input,0.08)
data = 
Time domain data set with 1000 samples.
Sample time: 0.08 seconds              
                                       
Outputs      Unit (if specified)       
   y1                                  
                                       
Inputs       Unit (if specified)       
   u1                                  
                                       
Data Properties

该软件将默认通道名称 'y1' 分配给第一个也是唯一的输出通道。当输出信号包含多个通道时,该软件会分配默认名称 'y1','y2',...,'yn'。类似地,该软件将默认通道名称 'u1' 分配给第一个也是唯一的输入通道。有关命名通道的详细信息,请参阅Naming, Adding, and Removing Data Channels

绘制数据。

idplot(data)

Figure contains 2 axes objects. Axes object 1 with title y1 contains an object of type line. This object represents untitled1. Axes object 2 with title u1 contains an object of type line. This object represents untitled1.

相邻的图显示输出数目据和输入数目据。

从时间序列数据创建 iddata 对象。时间序列数据没有输入通道。

加载数据集的输出通道,并创建采样时间为 0.08 秒的 iddata 对象。

load dryer2_data output
data = iddata(output,[],0.08)
data = 
Time domain data set with 1000 samples.
Sample time: 0.08 seconds              
                                       
Outputs      Unit (if specified)       
   y1                                  
                                       
Data Properties

绘制数据。

idplot(data)

Figure contains an axes object. The axes object with title y1 contains an object of type line. This object represents untitled1.

您可以使用 data 进行时间序列模型估计。

加载时间表数据 tt7 并显示前四行。

load sdata7 tt7
head(tt7,4)
      t      u1      u2           y    
    _____    __    _______    _________

    1 sec     1     0.2749    -0.091981
    2 sec    -1    0.25148      0.22567
    3 sec    -1     1.2381     -0.28617
    4 sec    -1    -1.2216       1.4581

tt7 有两个输入,变量名称为 u1u2,还有一个输出,变量名称为 y。将 tt7 转换为 iddata 对象。

z7conv = iddata(tt7)
z7conv =

Time domain data set with 400 samples.
Sample time: 1 seconds                 
                                       
Outputs      Unit (if specified)       
   y                                   
                                       
Inputs       Unit (if specified)       
   u1                                  
   u2                                  
                                       
z7conv.OutputName
ans = 1×1 cell array
    {'y'}

z7conv.InputName
ans = 2×1 cell
    {'u1'}
    {'u2'}

z7conv 保留采样时间,并将变量名称存储在 OutputNameInputName 属性中。

从复数值频域输入-输出数目据创建并检查 iddata 对象。将对象转换到时域中。

输入和输出数目据有时以时域输入-输出信号的傅里叶变换形式表示。您可以将此数据封装在频域 iddata 对象中。

加载数据,该数据由复数值输入-输出频域数据 UY、频率向量 W 以及采样时间 Ts 组成。

load demofr1 U Y W Ts

创建频域 iddata 对象 data_fr

data_fr = iddata(Y,U,Ts,'Frequency',W)
data_fr = 
Frequency domain data set with responses at 501 frequencies.
Frequency range: 0 to 31.416 rad/seconds
Sample time: 0.1 seconds                                                                             
                                                                                                     
Outputs      Unit (if specified)                                                                     
   y1                                                                                                
                                                                                                     
Inputs       Unit (if specified)                                                                     
   u1                                                                                                
                                                                                                     
Data Properties

检查属性。频域 iddata 对象包括频率特定的属性,例如频率矢量的 Frequency 和频率单位的 FrequencyUnit。相比之下,时域 iddata 对象包括时间特定属性,例如时域数据的 TstartSamplingInstants

get(data_fr)
ans = struct with fields:
            Domain: 'Frequency'
              Name: ''
        OutputData: [501×1 double]
        OutputName: {'y1'}
        OutputUnit: {''}
         InputData: [501×1 double]
         InputName: {'u1'}
         InputUnit: {''}
            Period: Inf
       InterSample: 'zoh'
                Ts: 0.1000
     FrequencyUnit: 'rad/TimeUnit'
         Frequency: [501×1 double]
          TimeUnit: 'seconds'
    ExperimentName: 'Exp1'
             Notes: [0×1 string]
          UserData: []

将频率属性的内容分配给变量 F

F = data_fr.Frequency;

获取数据的频率单位。属性 TimeUnit 设置采样时间的单位。

frequ = data_fr.FrequencyUnit
frequ = 
'rad/TimeUnit'
timeu = data_fr.TimeUnit
timeu = 
'seconds'

使用傅里叶逆变换函数 ifftdata_fr 转换回时域。

data_t = ifft(data_fr)
data_t = 
Time domain data set with 1000 samples.
Sample time: 0.1 seconds               
                                       
Outputs      Unit (if specified)       
   y1                                  
                                       
Inputs       Unit (if specified)       
   u1                                  
                                       
Data Properties
get(data_t)
ans = struct with fields:
              Domain: 'Time'
                Name: ''
          OutputData: [1000×1 double]
          OutputName: {'y1'}
          OutputUnit: {''}
           InputData: [1000×1 double]
           InputName: {'u1'}
           InputUnit: {''}
              Period: Inf
         InterSample: 'zoh'
                  Ts: 0.1000
              Tstart: 0.1000
    SamplingInstants: [1000×1 double]
            TimeUnit: 'seconds'
      ExperimentName: 'Exp1'
               Notes: [0×1 string]
            UserData: []

查看 iddata 对象的属性。在对象创建期间和之后修改属性。

加载输入和输出数目据。

load dryer2_data input output

创建 iddata 对象。

data = iddata(output,input,0.08)
data = 
Time domain data set with 1000 samples.
Sample time: 0.08 seconds              
                                       
Outputs      Unit (if specified)       
   y1                                  
                                       
Inputs       Unit (if specified)       
   u1                                  
                                       
Data Properties

查看 iddata 对象的所有属性。

get(data)
ans = struct with fields:
              Domain: 'Time'
                Name: ''
          OutputData: [1000×1 double]
          OutputName: {'y1'}
          OutputUnit: {''}
           InputData: [1000×1 double]
           InputName: {'u1'}
           InputUnit: {''}
              Period: Inf
         InterSample: 'zoh'
                  Ts: 0.0800
              Tstart: 0.0800
    SamplingInstants: [1000×1 double]
            TimeUnit: 'seconds'
      ExperimentName: 'Exp1'
               Notes: [0×1 string]
            UserData: []

您可以在使用名称-值对组参量创建 iddata 对象时指定属性。从相同的数据输入创建 iddata 对象,但将试验名称从默认设置更改为 Dryer2

data = iddata(output,input,0.08,'ExperimentName','Dryer2')
data = 
Time domain data set with 1000 samples.
Sample time: 0.08 seconds              
                                       
Outputs      Unit (if specified)       
   y1                                  
                                       
Inputs       Unit (if specified)       
   u1                                  
                                       
Data Properties

要更改现有 iddata 对象的属性值,请使用圆点表示法。将采样时间属性 Ts 更改为 0.05 秒。

data.Ts = 0.05
data = 
Time domain data set with 1000 samples.
Sample time: 0.05 seconds              
                                       
Outputs      Unit (if specified)       
   y1                                  
                                       
Inputs       Unit (if specified)       
   u1                                  
                                       
Data Properties

属性名称不区分大小写。此外,如果前几个字母可以唯一辨识属性,则无需输入整个属性名称。

data.exp = "Dryer2 January 2015"
data = 
Time domain data set with 1000 samples.      
Sample time: 0.05 seconds                    
                                             
Outputs                   Unit (if specified)
   y1                                        
                                             
Inputs                    Unit (if specified)
   u1                                        
                                             
Data Properties

您可以使用 data.y 作为 data.OutputData 的简写形式来访问输出值,或者使用 data.u 作为 data.InputData 的简写形式来访问输入值。

y_data = data.y;
u_data = data.u;

版本历史记录

在 R2006a 之前推出

全部展开