本章解决这样一个问题:对于一个 LTI 离散状态空间方程模型(注意与系统建模中的区别)
{xk+1yk=Axk+Buk=Cxk+Duk
给定系统若干个输入 u0,⋯,us−1 和对应的 s 个输出 yk(输入为 m 维列向量、输出为 l 维列向量),求出:
- 系统的阶数 n
- 四个矩阵 A、B、C、D(相似变换意义下等价即可)
子空间方程#
假定当前时刻 k=i. 取 k=0∼(i−1) 这 i 个下标,也就是相对于当前时刻的所有“过去状态”:
x1x2x3xi=Ax0+Bu0=Ax1+Bu1=A2x0+ABu0+Bu1=Ax2+Bu2=A3x0+A2Bu0+ABu1+Bu2⋯=Aix0+k=0∑(i−1)A(i−1)−kBuk y0y1y2yi−1=Cx0+Du0=Cx1+Du1=CAx0+CBu0+Du1=Cx2+Du2=CA2x0+CABu0+CBu1+Du2⋯=CAi−1x0+k=0∑(i−2)CA(i−2)−kBuk+Dui−1
把 y 的部分写成矩阵形式
y0y1⋮yi−2yi−1=CCA⋮CAi−2CAi−1x0+DCB⋮CAi−3BCAi−2B0D⋮CAi−4BCAi−3B⋯⋯⋱⋯⋯00⋮DCB00⋮0Du0u1⋮ui−2ui−1
记 Γi 为 x0 前面的那一坨大矩阵、记 Hi 为 u 前面的那一坨系数矩阵. 于是可将表达式压缩为
y0y1⋮yi−1=Γix0+Hiu0u1⋮ui−1
刚才我们的 k 是从 0∼(i−1). 如果我们把下标整体往后移一位,即 k 从 1∼i,这样等号左边的 y 矩阵就是 y1∼yi,右边就是 x1,u 矩阵就是 u1∼ui. 很巧妙的在于,Γi 和 Hi 并不会变,因为这两个系数矩阵实际上表达的是“相对于第一项的关系”,而量的个数没有变(都是 i),也就是说相对于 x1,后面的 i 个数都有相同的矩阵表示. 同理,整体移动两位、三位……,两个系数矩阵都是一样的. 因此,把多个 y 矩阵横着拼到一起时,系数矩阵可以提取出来.
从 0 拼到 j−1(j 只是一个参数,表示我们将使用多少数据进行分析. 有点像以前的迭代次数)
y0y1⋮yi−1y1y2⋮yi⋯⋯⋱⋯yj−1yj⋮yi+j−2=Γi[x0x1⋯xj−1]+Hiu0u1⋮ui−1u1u2⋮ui⋯⋯⋱⋯uj−1uj⋮ui+j−2
我们再次压缩表达式为
Yp=ΓiXp+HiUp
这里的 p 就是 past“过去状态”的意思。
现在考虑“未来状态”,特别地,是未来状态相对于当前状态(即 k=i)的情况,因此下标又要整体移动 i,也即从 i 拼到 i+j−1:
yiyi+1⋮y2i−1yi+1yi+2⋮y2i⋯⋯⋱⋯yi+j−1yi+j⋮y2i+j−2=Γi[xixi+1⋯xi+j−1]+Hiuiui+1⋮u2i−1ui+1ui+2⋮u2i⋯⋯⋱⋯ui+j−1ui+j⋮u2i+j−2
压缩表达式为
Yf=ΓiXf+HiUf
这里的 f 就是 future 的意思。
过去和未来的情况都有了,我们使用一开始算出来的各个 x 的表达式,在过去与未来之间建立联系. 将 i 时刻和 0 时刻之间的关系 xi=Aix0+k=0∑(i−1)A(i−1)−kBuk 写成矩阵形式、并压缩表达式为:
xi=Aix0+[Ai−1BAi−2B⋯ABB]u0u1⋮ui−2ui−1=Aix0+Δiu0u1⋮ui−1
同样地,依然可以把下标整体移动,而两个系数矩阵不变. 然后再把 0 到 j−1 拼到一起:
[xixi+1⋯xi+j−1]=Ai[x0x1⋯xj−1]+Δiu0u1⋮ui−1u1u2⋮ui⋯⋯⋱⋯uj−1uj⋮ui+j−2
自然地,过去与未来 x 被分别打包在一起了,因此可以再次压缩表达式为
Xf=AiXp+ΔiUp
最后一步. 我们实际上只想知道输入 Y 和输出 U,状态变量可以进一步消去
- 第①式移项后代入第③式消 Xp,压缩表达式为
XfXf=AiΓi†(Yp−HiUp)+ΔiUp=[AiΓi†,Δi−AiΓi†Hi][YpUp]=LpWp
- 相应地第②式改为 Yf=ΓiXf+HiUf=ΓiLpWp+HiUf
对一个 m 维输入、l 维输出的状态空间方程模型
{xk+1yk=Axk+Buk=Cxk+Duk
我们有三条子空间辨识方程:
其中
XpXf=[x0x1⋯xj−1]=[xixi+1⋯xi+j−1]
Yp=y0y1⋮yi−1y1y2⋮yi⋯⋯⋱⋯yj−1yj⋮yi+j−2Yf=yiyi+1⋮y2i−1yi+1yi+2⋮y2i⋯⋯⋱⋯yi+j−1yi+j⋮y2i+j−2
Up=u0u1⋮ui−1u1u2⋮ui⋯⋯⋱⋯uj−1uj⋮ui+j−2Uf=uiui+1⋮u2i−1ui+1ui+2⋮u2i⋯⋯⋱⋯ui+j−1ui+j⋮u2i+j−2
Γi=CCA⋮CAi−2CAi−1Hi=DCB⋮CAi−3BCAi−2B0D⋮CAi−4BCAi−3B⋯⋯⋱⋯⋯00⋮DCB00⋮0D
Δi=[Ai−1BAi−2B⋯ABB]
消去状态变量的形式:
其中
Lp=[AiΓi†,Δi−AiΓi†Hi]Wp=[YpUp]
三条假设与两条推论#
为了让辨识算法有效,需要假定系统足够好,即满足:
若系统满足上述三个条件,有两个推论
证:Xf=AiXp+ΔiUp=[AiΔi][XpUp]
由第二条,r(Up)=im 行满秩;由第三条,两行空间不交,故 [XpUp] 亦行满秩,故
r(Xf)=r([AiΔi])≥r(Δi)=n
最后一步是因为 Δi 行满秩
又 span(Xf) 是 n 维状态空间的子空间,于是 r(Xf)≤n. 故 r(Xf)=n
证:(1) 证明 span(Xf)⊆span(Wp)∩span(Wf)
由于系统是可达和可观测,系统的状态 Xf 可以由输入输出数据唯一确定。因此,Xf 必定是 Wp 和 Wf 张成空间中的一个元素,所以 Xf∈span(Wp) 且 Xf∈span(Wf),也即
span(Xf)⊆span(Wp)∩span(Wf)
(2) 证明 span(Wp)∩span(Wf)⊆span(Xf)
∀v∈span(Wp)∩span(Wf),∃a,b s.t.
v=Wp⋅a=Wf⋅b
而 Wp 和 Wf 都是由 Xf 以及他们自身线性组合得到的,所以交集中的向量 v 必定可表示为 Xf⋅c,所以 v∈span(Xf),也即 、
span(Wp)∩span(Wf)⊆span(Xf)
确定性子空间辨识#
N4SID#
Numerical algorithm for Subspace State Space System IDentification 子空间状态空间系统辨识的数值算法
使用消去状态变量的形式 Yf=ΓiLpWp+HiUf,做斜交投影:
Yf/UfWp=ΓiLpWp/UfWp+HiUf/UfWp=ΓiLpWp=ΓiXf
对 O=Yf/UfWp 做 SVD
O=[U1U2][Σr000][V1TV2T]=U1ΣrV1T(=ΓiXf)
为了得到 ΓiXf,从 Σr 中间劈成两个矩阵相乘,劈开处乘上相似变换阵(非奇异即可):
- Γi=U1Σr1/2T
- Xf=T−1Σr1/2V1T
下面就可以进行辨识了。由于 T、V1 都满秩,得 n=r(Xf)=r(Σr),也即系统维数为 O 矩阵非零奇异值的个数。
然后就是求 ABCD。我们知道 Xf=[xi,xi+1,⋯,xi+j−1],把所有涉及这些 x 的状态空间方程都写出来,写成矩阵形式并压缩表达式为
[Xi+1,j−1Yi,j−1]=[ACBD][Xi,j−1Ui,j−1]
其中大写的 X、Y、U 表示把小写打包,下角标两个数,第一个数表示打包的起点,第二个数表示打包的个数,即
Xi+1,j−1Yi,j−1Xi,j−1Ui,j−1=[xi+1,⋯,xi+j−1]=[yi,yi+1,⋯,yi+j−2]=[xi,xi+1,⋯,xi+j−2]=[ui,ui+1,⋯,ui+j−2]
既然 Xf 都算出来了,那刚才定义的这四个东西就都是已知的,因此 ABCD 可以用最小二乘法解出(注意这里是估系数矩阵,所以和传统的最小二乘在结论上有一些区别,但推导是一样的)
y=Θx
∂Θ∂∥y−Θx∥2Θ^=2(y−Θx)xT=0=yxT(xxT)−1
==现在剩下一个没弄明白的点:为什么要在 Σr 中间劈开??==
MOESP#
Multivariable Output Error State sPace 多变量输出误差状态空间
做LQ分解
[UpYp]=[L11L210L22][Q1TQ2T]
⇒{UpYp=L11Q1T=L21Q1T+L22Q2T
由子空间方程之“过去状态拼一起”:Yp=ΓiXp+HiUp,把 Yp 和 Up 的 LQ 表达式代进去:
ΓiXp+HiL11Q1T=L21Q1T+L22Q2T(1)
两边右乘 Q2 得
ΓiXpQ2=L22
和 N4SID 类似,为了得到 ΓiXpQ2,只需对 L22 做奇异值分解:
L22=[U1U2][Σr000][V1TV2T]=U1ΣrV1T (=ΓiXpQ2)
然后从 Σr 中间劈开得(==同样的,没懂,为啥这样劈开??==)
- Γi=U1Σr1/2
- XpQ2=Σr1/2V1T
然后就可以开始辨识了:n=r(Xp)=r(Σr)(因为 Q2 正交,即满秩)
而 Γi=CCA⋮CAi−1,于是可以解 A 和 C:
- Γi 的开头 l 行就是矩阵 C
- (Γi 去掉开头 l 行)=(Γi 去掉最后 l 行)×A,解方程即得 A
至于 B 和 D,我们再次回到 (1) 式,两边同时左乘 U2T;因为 Γi 和 L22 都是以 U1 开头的,由 U 正交性得,左乘 U2T 时整个项都变成 0,于是
U2TΓiXp+U2THiL11Q1T=U2TL21Q1T+U2TL22Q2T
去掉 Q1T,L11 移到右边去,把 Hi 的具体表达式代入:
U2TDCB⋮CAi−3BCAi−2B0D⋮CAi−4BCAi−3B⋯⋯⋱⋯⋯00⋮DCB00⋮0D=U2TL21L11−1
中间这个大矩阵 Hi 就是待求的,其他东西都是已知的。我们把左边 U2T 每 l 列分块、右边每 m 列分块(以匹配 Hi 的分块模式),可以分成 i 块
U2TU2TL21L11−1=[L1,L2,⋯,Li]=[M1,M2,⋯,Mi]
分块之后,实际上是阶梯型,而且 B 和 D 可以彻底分开
M1M2Mi−1Mi=L1D+(L2C+⋯+Li−1CAi−3+LiCAi−2)B=L2D+(L3C+⋯+LiCAi−3)B ⋮=Li−1D+(LiC)B=LiD
注意到括号里面很像 Γi,于是记 Lkˉ=[Lk,Lk+1,⋯,Li],就可以写成矩阵表达式
M1M2⋮Mi−1Mi=L1L2⋮Li−1LiL2ˉΓi−1L3ˉΓi−2⋮LiˉΓ10[DB]
然后只需要使用最小二乘法(传统的就行了)就能解 B 和 D
==BD这一段的构造,逻辑还是不够丝滑==
随机子空间辨识#
问题描述#
在状态空间方程中引入一个随机偏移
{xk+1yk=Axk+Buk+wk=Cxk+Duk+vk
其中 wk 和 vk 是均值为 0 的白噪向量,它们的协方差如下定义
QRS=E[wkwkT]=E[vkvkT]=E[wkvkT]
注意中括号里头,两个角标必须一致,角标不一致时协方差为零(因为白噪的意思就是不同时刻互相独立)。并且进一步假定 E[xkwkT]=E[xkvkT]=0
考试只考没有 B 和 D 的情形,也即只考虑
{xk+1yk=Axk+wk=Cxk+vk
定义:
- 状态协方差 Σ=E[xkxkT]
- 输出协方差 Λi=E[yk+iykT](相差 i 时间的)
- 状态输出协方差 G=E[xk+1ykT]
这些协方差应当与 k 无关,表示系统足够稳定。于是:
Σ=E[xk+1xk+1T]=E[(Axk+wk)(Axk+wk)T]=AE[xkxkT]AT+E[wkwkT]=AΣAT+Q
G=E[xk+1ykT]=E[(Axk+wk)(Cxk+vk)T]=AE[xkxkT]CT+E[wkvkT]=AΣCT+S
Λ0=E[ykykT]=E[(Cxk+vk)(Cxk+vk)T]=CE[xkxkT]CT+E[vkvkT]=CΣCT+R
现在考虑 Λi,先把前面一个 y 用 Cx+v 转成 x,再用 Ax+w 一直向前递归直到 xk+1:
Λi=E[yk+iykT]=E[(Cxk+i+vk+i)ykT]=CE[xk+iykT]+0=CE[(Axk+i−1+wk+i−1)ykT]=CAE[xk+i−1ykT]+0=CAE[(Axk+i−2+wk+i−2)ykT]=CA2E[xk+i−2ykT]+0= ⋯ =CAi−1E[xk+1ykT]+0=CAi−1G
核心原理#
说穿了其实就是“用样本均值代替期望”。也即,只要观测的次数 j 足够大,我就可以认为
E[X]=j1k=0∑j−1xk
用这个思路,有如下观察:
Λi=E[yk+iykT]=j1k=0∑j−1yk+iykT=j1[yiyi+1⋯yi+j−1]y0Ty1T⋮yj−1T=j1Yi,jY0,jT
其中大写 Y 的含义和 N4SID 中提到的是一样的,下角标第一个数表示打包的起点,第二个数表示打包的个数
此时我定义:
Φ[A,B]=j1ABT
那么
Λi=Φ[Yi,j,Y0,j]