转载自了凡春秋USTC
https://chunqiu.blog.ustc.edu.cn/?p=329
状态空间辨识是一种很强大的系统辨识方法,matlab的系统辨识工具箱提供了函数实现基于此方法的辨识。这里把matlab帮助简单翻译一下。
状态空间模型
状态空间模型是一个快速辨识很不错的选择,因为它只需要一个用户输入,即模型阶次n。模型阶次是一个等于状态 \(x(t)\) 维数的整数,它与线性差分方程中输入输出的延迟相关,但不一定相等。
连续时间形式的状态空间模型如下
\[\dot x(t) = Fx(t) +Gu(t) + \tilde Kw(t)\]
\[y(t) = Hx(t) + Du(t) +w(t)\]
连续时间状态空间模型通常是比较容易定义的,因为它可以由物理微分方程而得来。
离散时间形式的状态空间模型与线性差分方程的ARX模型一致,但状态空间模型只有1个延迟。离散形式常常表示成如下更新模式innovations
form:
\[x(kT+T) = Ax(kT) + Bu(kT) + Ke(kT)\]
\[y(kT) = Cx(kT) + Du(kT) + e(kT)\]
其中 \(T\) 是采样间隔。
连续时间模型和离散时间状态空间模型矩阵之间的关系在piece-wise-constant输入的定义下如下
\[A = e^{FT} \\ B = \int_0^T{e^{F\tau}Gd\tau \\ C = H}\]
\(K\) 和 \(\tilde
K\) 之间的准确关系比较复杂,然而对于比较小的采样间隔 \(T\) ,下面的近似还是可以的
\[K = \int_0^T{e^{F\tau}\tilde Kd\tau}\]
对线性模型,通常的符号模型描述如下
\(G\) 、 \(H\) 是传递函数。
那么传递函数和离散时间状态空间矩阵之间的关系如下
\[G(q) = C(qI_{nx}-A)^{-1}B+D\]
\[H(q) = C(qI_{nx}-A)^{-1}K+I_{ny}\]
其中, \(I_{nx}\) 和 \(I_{ny}\) 是单位阵, \(ny\) 是 \(y\) 和 \(e\) 的维数。连续时间的状态空间表示类似。
支持的状态空间参数化形式
工具箱支持的状态空间参数化形式,即哪些参数需要辨识哪些是固定的:
自由参数化辨识
直接辨识各系统矩阵 \(A,B,C,D\) 和 \(K\) 。
规范型参数化辨识
规范型参数化表示矩阵规范化后系统矩阵参数减少, \(A,B,C\) 很多元素为0或1。需要辨识的参数出现在系统矩阵的一些行或列。
结构参数化辨识
允许用户指定一些参数是固定值,这些参数从待辨识参数中剔除。
完全任意映射参数化辨识
即灰箱辨识,也就是指定一些变量,这些变量通过函数关系形成系统矩阵,根据输入输出数据直接辨识这些变量。
状态空间模型阶次的选择
要辨识一个状态空间模型,首先要知道它的阶次。当你不知道阶次的时候,你可以通过下面的步骤选择一个阶次。
通过GUI选择阶次:
如下,Orders中设定1:10,Method选择N4SID,或可以通过点击Order
Selection来做如此设置
点击Estimate打开Model
Order Selection窗口,如下,显示了各状态对输入输出行为的贡献大小(协方差矩阵的奇异值取log)
根据上图选择代表下降最快的那个阶次,点击insert插入到辨识的模型中。红色柱条表示推荐的选择,如上图中,状态1和2给出了最重要的贡献,状态2后面的贡献快速下降。
为提高辨识的准确性,可以使用上面的模型最为后续辨识的初始猜测。
在命令行中选择阶次 :
上面中利用GUI选择阶次可以在命令行中实现,如下
m = n4sid(data,n1:n2);
上面语句会弹出Model Order Selection窗口。
除此之外,还可以使用ssest命令打开阶次选择窗口,如下
m = ssest(data, nn)
其中的nn = [n1,n2,...,nN]指定你想尝试的阶次。n4sid使用data数据的采样时间来估计模型,所以估计的是离散模型。而ssest默认估计的连续时间模型。可以通过指定Ts和其值的额外参数对来指定估计离散模型,如
model = ssest(data,nn,'Ts',data.Ts);
如果想不打开阶次选择窗口自动得到最优阶次,可以使用如下命令
m = n4sid(data,'best')
在GUI中辨识状态空间模型
使用GUI做系统辨识先要做如下准备:
将数据导入GUI;
对数据做一些预处理,如去趋势,这样能提高辨识的精度;
选择阶次,上面已经介绍过了。
准备工作做好后,选择Estimate>State
Space Models打开Polynomial and State Space Models对话框,如下
各选项的说明如下
Orders:
指定模型阶次。还可以使用下面的Order
Editor...来做更详细配置,如设置选项N4Weight和N4Horizon。
Method:
选择PEM或N4SID方法。N4SID为子空间方法,可以先用来估计得到一个初始模型;PEM为最小化预测误差迭代方法(得到最大似然估计),对应的函数为ssest,可以对初始估计进行改善。PEM会默认先运行N4SID得到初始估计矩阵再对初始估计矩阵进行迭代优化,所以它运行时间较长。
N4SID运行比SSEST快,但精度和鲁棒性均不如SSEST,需要指定额外的难于调整的参数。
Domain:
选择辨识连续时间模型还是离散模型。
Feedthrough:
指定模型是否有直通分量。通过输入一个与输入个数相同的布尔型向量来配置。如对于一个两输入模型,输入[true
false],表示第一个输入直通到系统输出,第二个不直通。这相当于设置状态空间模型的D矩阵。
Form:
设置辨识的参数化形式。有如下选项
对应自由参数化辨识、特征多项式伴随形式参数化辨识、模型分解形式参数化辨识(A是对角矩阵)、可观规范型形式参数化辨识。
Input delay:
指定输入延迟。通过输入一个与输入个数相同向量来配置。对于连续时间模型,延迟需要以秒为单位。对于离散模型,指定为整数的延迟量,即采样周期的倍数。
Name:
辨识模型的名字。
Focus:
选择如何衡量在不同频率处拟合的相对重要性。
Prediction:使用噪声模型H的逆来衡量不同频率范围内拟合的相对重要性。这与最小化一步前向预测相对应,适合于在一段短时间间隔的拟合。适合于输出预测应用。
Simulation:使用输入的频谱来衡量不同频率范围内拟合的相对重要性,而不使用噪声模型来衡量。适合于输出仿真应用。
Stability:估计最稳定的模型。
Filter:通过弹出Estimation
Focus对话框来指定一个用户滤波器,详见Defining a Custom
Filter章节做配置。这个预滤波只在估计从输入到输出的动态特性时应用。干扰模型由估计数据决定。
Initial state:
指定对待初始状态的方法。这个在使用PEM辨识时作为迭代的初始状态使用。如果辨识得到不精确的解,可以尝试指定特定的方法来处理初始状态而不是选择自动。
Auto:基于估计的数据自动选择Zero、Estimate或Backcast。如果初始状态对估计误差的效果微不足道,可以设置为0来最优化方法的效果。
Zero:设置初始状态为0。
Estimate:把初始状态作为一个未知的参数向量来对待,从数据中辨识初始状态。
Backcast:用后向滤波方法(最小二乘拟合)估计初始状态。
Covariancs:
如果想得到参数的不确定度,选择Estimate;否则选择None。不确定度会显示在模型置信区间的图中。对于复杂模型或大数据集问题,选择None可以减少计算时间。
Display progress:
对于选用PEM方法辨识时,勾选上复选框会弹出一个进程窗口显示估计的过程。
加载中,请稍候......