转载自了凡春秋USTChttps://chunqiu.blog.ustc.edu.cn/?p=334
命令行辨识状态空间模型
准备工作:
构造iddata对象(输入输出数据对象)或frd、idfrd对象(频率响应数据对象);
数据预处理,如对时域数据做去趋势;
选择阶次。
状态空间辨识有两种方式,决定于你对系统了解的先验知识。
黑箱辨识:
指定模型阶次,选择性的对一些模型矩阵结构属性进行配置。这种辨识方式,你可以使用ssest或n4sid函数以数据和模型阶次作为主要函数参数来辨识。额外的属性要以名字-值对的形式来指定,如指定模型模型采样时间、直通分量存在性、噪声成分是否存在等。你不能直接配置各系统矩阵的元素。
结构化辨识:
你需要首先创建一个包含系统矩阵初始值的idss模型结构,在此结构中,使用Structure属性来指定参数约束。如指定系统矩阵某个元素固定或设定其范围。详细参数化配置可以参考ssform函数说明。
在配置好约束后,就可以此idss模型作为ssest的输入进行辨识了。注意n4sid不能结构化辨识。
另外注意,这里的结构化辨识其实就是灰箱辨识,属于一种简单的一种,复杂的灰箱辨识可以使用idgrey和idnlgrey模型实现;结构化辨识中不能指定系统矩阵中各元素之间的关系,即各元素之间是独立的,对于元素之间有依赖性的结构化辨识属于复杂灰箱辨识,可尝试使用grayest估计器。
命令行辨识的实现:
使用ssest辨识
m = ssest(data,n,opt,Name,Value)
其中,data为估计的数据,n为系统阶次,opt包含了状态空间估计的配置参数,包括初始条件、输入偏移、估计中心、搜索方法等,其详细配置见ssest函数。
使用n4sid辨识
m = n4sid(data,n,opt,Name,Value)
除非指定采样时间,ssest默认辨识连续时间模型;而n4sid辨识离散模型。
连续模型与离散模型的选择:
默认情况下,ssest估计连续时间模型。如果使用非零采样周期的数据,可以使用如下命令估计离散模型
model = ssest(data,nx,'Ts',data.Ts);
如果使用的是连续时间频域数据,则不能辨识离散模型。
默认地,n4sid以数据的采样周期辨识离散时间模型,如果想辨识连续时间模型,可以用如下命令
model = n4sid(data,nx,'Ts',0);
对于状态空间辨识,你可以指定是否辨识 \(D\) 、 \(K\) 、 \(X0\) 矩阵,分别表示输入-输出直通分量、噪声模型和初始状态。
\(D\) :
默认情况下, \(D\) 矩阵是不辨识的,除静态模型外其值固定为0。
黑箱辨识中,使用Feedthrough名和值对输入参数来设置直通分量的存在与否。如两输入模型中,第二输入直通,则使用如下命令设置
model = n4sid(data,n,'Feedthrough',[false true]);.
结构辨识中,通过配置init_sys.Structure.d来设置,其中init_sys是一个代表理想模型结构的idss结构。如强制第 \(i\) 个输入为直通,则
init_sys.Structure.d.Value(:,i) = 0;
init_sys.Structure.d.Free = true;
init_sys.Structure.d.Free(:,i) = false;
第一行指定矩阵 \(D\) 的第 \(i\) 列的值为0;第二行指定 \(D\) 矩阵的所有元