上一篇讲了卡尔曼滤波器延伸出来的次优滤波器中的一种手段,降阶处理。这回,我就再介绍一些次优滤波器的其他思路,常增益次优滤波和解耦次优滤波。讽刺的是,我的文章虽然把降阶处理放在前面详细讲解了一下,但降阶处理在工程上却用得不多,反而是这篇文章要讲的这两种方法更具有工程应用价值。
常增益次优滤波
看过前面的文章的朋友应该都了解了,卡尔曼滤波起到关键作用的参数就是那个K,也就是滤波增益,如果设计的合适,滤波器是稳定的。尤其是对于定常系统(也就是状态方程和量测方程里的系数
Φ
k
,
k
−
1
\Phi_{k,k-1}
Φk,k−1、
H
k
H_k
Hk啥的都是常量)K随着递推就会收敛到一个值。
好了,思路来了,既然K会收敛到一个值,那还费这么大劲干嘛!直接把K写成常值不就好了吗,毕竟卡尔曼滤波器中
K
k
K_k
Kk的迭代计算量还是很大的。
说得没错,这就是常增益滤波的思想来源。把
K
k
K_k
Kk写成一个常值K,这样计算
K
k
K_k
Kk的那个方程就不需要了,尤其是矩阵求逆不需要了,这对减少计算量的贡献可不是一点半点。那么下面的问题就是:这个常值怎么取?
很好办呐,这个常值就取滤波器稳定状态下的
K
k
K_k
Kk不就好了。说得没错,就这么办。
K
=
P
‾
H
T
(
H
P
‾
H
T
+
R
)
−
1
K=\overline PH^T(H\overline PH^T+R)^{-1}
K=PHT(HPHT+R)−1
P
‾
\overline P
P就是稳态一步预测方差阵可以从下面这个方程计算出来。
P
‾
=
Φ
P
‾
Φ
T
−
Φ
P
‾
H
T
[
H
P
‾
H
T
+
R
]
−
1
H
P
‾
Φ
T
+
Γ
Q
Γ
T
\overline P=\Phi\overline P\Phi^T-\Phi\overline PH^T[H\overline PH^T + R]^{-1}H\overline P\Phi^T+\Gamma Q\Gamma^T
P=ΦPΦT−ΦPHT[HPHT+R]−1HPΦT+ΓQΓT
K取的常值就是卡尔曼滤波器稳态时的K的最优值,但这个常值却不是滤波器达到稳态前的最优值。这点很好理解吧。所以采用常增益方法的滤波器在达到稳态前,滤波器是次优的。所以,这种滤波方法达到稳态的时间要比最优滤波达到稳态的时间要长。
好了,常增益次优滤波器讲完了,是的,就是这么简单。。。好吧,还是拿个例子更能说明问题。这个例子,很熟悉。
系统状态方程:
X
k
+
1
=
X
k
+
W
k
X_{k+1}=X_k+W_k
Xk+1=Xk+Wk
量测方程:
Z
k
=
X
k
+
V
k
Z_k=X_k+V_k
Zk=Xk+Vk
所有量都按标量考虑。状态方差
Q
k
=
1
Q_k=1
Qk=1,量测方差
R
k
=
1
R_k=1
Rk=1且
E
[
X
0
]
=
0
E[X_0]=0
E[X0]=0,
V
a
r
[
X
0
]
=
10
Var[X_0]=10
Var[X0]=10。
作为对比,先按最优滤波算法来一遍。
K
k
=
P
k
/
k
−
1
(
P
k
/
k
−
1
+
1
)
−
1
K_k=P_{k/k-1}(P_{k/k-1}+1)^{-1}
Kk=Pk/k−1(Pk/k−1+1)−1
P
k
=
(
1
−
K
k
)
P
k
/
k
−
1
=
K
k
P_k=(1-K_k)P_{k/k-1}=K_k
Pk=(1−Kk)Pk/k−1=Kk
P
k
+
1
/
k
=
(
1
−
K
k
)
P
k
/
k
−
1
+
1
=
K
k
+
1
P_{k+1/k}=(1-K_k)P_{k/k-1}+1=K_k+1
Pk+1/k=(1−Kk)Pk/k−1+1=Kk+1
初值也有
X
0
=
0
X_0=0
X0=0,
P
0
=
10
P_0=10
P0=10,手算迭代7次。
k | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
P k / k − 1 P_{k/k-1} Pk/k−1 | 11 | 1.917 | 1.657 | 1.624 | 1.619 | 1.618 | 1.618 |
P k = K k P_k=K_k Pk=Kk | 0.917 | 0.657 | 0.624 | 0.619 | 0.618 | 0.618 | 0.618 |
然后按常增益次优滤波器在来一遍。
套前面的公式就行了。先计算稳态一步预测方差。
P
‾
2
−
P
‾
−
1
=
0
\overline P^2-\overline P-1=0
P2−P−1=0
P
‾
=
1
2
(
1
±
5
)
\overline P=\frac{1}2(1\pm\sqrt5)
P=21(1±5)
取正值,
P
‾
=
1.618
\overline P=1.618
P=1.618。然后是K
K
=
P
‾
(
P
‾
+
1
)
−
1
=
0.618
K=\overline P(\overline P+1)^{-1}=0.618
K=P(P+1)−1=0.618
还是迭代7次。
k | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
P k / k − 1 P_{k/k-1} Pk/k−1 | 11 | 2.987 | 1.818 | 1.647 | 1.622 | 1.619 | 1.618 |
P k P_k Pk | 1.987 | 0.818 | 0.647 | 0.622 | 0.619 | 0.618 | 0.618 |
看出来了没?次优滤波器的收敛速度要慢一些。但是最终两种滤波器会重合。
常增益滤波是一种最简单的次优滤波方法。而且,它还可以灵活应用。比如分段常增益,也就是在不同的时间段选用不同的K。这样的效果是几乎跟最优滤波的效果一样的。
系统解耦次优滤波
还是回想一下卡尔曼滤波器所使用的模型。有关于
X
k
X_k
Xk状态方程的状态方程,还有关于
Z
k
Z_k
Zk的量测方程。还记得我们在聊序贯处理时说过,量测量
Z
k
Z_k
Zk的每一个量如果都是不相关的,那么可以把高维
Z
k
Z_k
Zk看成多次独立的低维量测量。这样虽然计算的次数增加了,但是总体的计算量却下降了。那如果
X
k
X_k
Xk里每个状态量也是独立的呢。说实话,这基本不可能。更有可能的是
X
k
X_k
Xk里面可以分成几组,每组内部的状态量相互影响,但是不同组之间的关系却很小。这时就可以考虑解耦了。
如果两组之间完全没有联系,那么问题就简单了,可以建立两个状态方程,分别设计滤波器就可以了。而如果还是有那么一点联系,但是联系很弱呢,那就要具体问题具体分析了。
怎么来判断两组状态量之间的联系是紧密还是稀疏呢?方便讨论就按两组来讨论吧。状态方程和量测方程为:
(
X
k
+
1
1
X
k
+
1
2
)
=
(
Φ
k
+
1
,
k
11
Φ
k
+
1
,
k
12
Φ
k
+
1
,
k
21
Φ
k
+
1
,
k
22
)
(
X
k
1
X
k
2
)
+
(
Γ
k
1
0
0
Γ
k
2
)
(
W
k
1
W
k
2
)
\begin{pmatrix}X_{k+1}^1\\X_{k+1}^2\end{pmatrix}=\begin{pmatrix}\Phi_{k+1,k}^{11}&\Phi_{k+1,k}^{12}\\\Phi_{k+1,k}^{21}&\Phi_{k+1,k}^{22}\end{pmatrix}\begin{pmatrix}X_{k}^1\\X_{k}^2\end{pmatrix}+\begin{pmatrix}\Gamma_k^1&0\\0&\Gamma_k^2\end{pmatrix}\begin{pmatrix}W_{k}^1\\W_{k}^2\end{pmatrix}
(Xk+11Xk+12)=(Φk+1,k11Φk+1,k21Φk+1,k12Φk+1,k22)(Xk1Xk2)+(Γk100Γk2)(Wk1Wk2)
(
Z
k
1
Z
k
2
)
=
(
H
k
1
0
0
H
k
2
)
(
X
k
1
X
k
2
)
+
(
V
k
1
V
k
2
)
\begin{pmatrix}Z_{k}^1\\Z_{k}^2\end{pmatrix}=\begin{pmatrix}H_k^1&0\\0&H_k^2\end{pmatrix}\begin{pmatrix}X_{k}^1\\X_{k}^2\end{pmatrix}+\begin{pmatrix}V_{k}^1\\V_{k}^2\end{pmatrix}
(Zk1Zk2)=(Hk100Hk2)(Xk1Xk2)+(Vk1Vk2)
状态方程里面的
Φ
k
+
1
,
k
12
\Phi_{k+1,k}^{12}
Φk+1,k12和
Φ
k
+
1
,
k
21
\Phi_{k+1,k}^{21}
Φk+1,k21就是
X
k
1
X_{k}^1
Xk1和
X
k
2
X_{k}^2
Xk2之间的耦合矩阵。如果
X
k
1
X_{k}^1
Xk1和
X
k
2
X_{k}^2
Xk2完全不相关,那么
Φ
k
+
1
,
k
12
\Phi_{k+1,k}^{12}
Φk+1,k12和
Φ
k
+
1
,
k
21
\Phi_{k+1,k}^{21}
Φk+1,k21就等于0。如果
Φ
k
+
1
,
k
12
\Phi_{k+1,k}^{12}
Φk+1,k12和
Φ
k
+
1
,
k
21
\Phi_{k+1,k}^{21}
Φk+1,k21中的每个元素都非常小,那么就意味着
X
k
1
X_{k}^1
Xk1和
X
k
2
X_{k}^2
Xk2之间的耦合非常弱,可以忽略。这样原系统就会编程1和2两个系统,就可以分别针对两个系统设计两个独立的滤波器了。虽然滤波器数量多了,但是每个滤波器的阶数其实是降低了的。实际的计算量通常会降下来。
耦合弱也是有耦合的,解耦就是忽略了弱耦合的状态量,这显然是做了近似的,所以这样处理的滤波方法不是最优,也只能是次优滤波器。
最后要说的是,系统能否解耦成若干个子系统,以及如何解耦,不但与系统的结构和估计性能的要求有关,而且还要对系统物理过程有充分了解,并且还需要进行必要的误差分析和实际工程实践才能确定下来。