这是一个非常好的问题,涉及到卡尔曼滤波中协方差更新的两种不同形式:标准形式和对称/等效形式。你提到的两个公式:
P = (I - K @ H) @ P @ (I - K @ H).T + K @ R @ K.T
P = (I - K @ H) @ P
它们看似不同,但实际上在理论正确性、数值稳定性、适用场景上有重要区别。下面我们详细分析。
✅ 正确的协方差更新公式(理论完整版)
🟩 完整对称形式(更精确):
Pk∣k=(I−KkHk)Pk∣k−1(I−KkHk)T+KkRkKkT
Pk∣k=(I−KkHk)Pk∣k−1(I−KkHk)T+KkRkKkT
这是从协方差传播定律直接推导出的完整表达式,它考虑了两个噪声源的影响:
预测误差(通过 (I−KH)P(⋅)T(I−KH)P(⋅)T 传播)
测量噪声引入的新不确定性(通过 KRKTKRKT 加入)
✅ 优点:
数学上最严谨
保持协方差矩阵的对称性和正定性更好(尤其在浮点计算中)
更适合平方根滤波或数值稳定性要求高的场景
⚠️ 缺点:
计算量稍大(多一次矩阵乘法)
🟨 简化形式(常用标准形式)
标准教科书形式:
Pk∣k=(I−KkHk)Pk∣k−1
Pk∣k=(I−KkHk)Pk∣k−1
这个公式是上面完整形式的一个代数简化结果,前提是在卡尔曼增益取最优值(即卡尔曼增益)时,两个表达式在数学上是等价的!
🔍 为什么可以简化?
因为在最优卡尔曼增益下,有如下恒等式成立:
(I−KH)Pk∣k−1=Pk∣k−1HT(HPk∣k−1HT+R)−1(HPk∣k−1)
(I−KH)Pk∣k−1=Pk∣k−1HT(HPk∣k−1HT+R)−1(HPk∣k−1)
经过一系列代数变换(涉及矩阵逆引理),可以证明:
(I−KH)Pk∣k−1(I−KH)T+KRKT=(I−KH)Pk∣k−1
(I−KH)Pk∣k−1(I−KH)T+KRKT=(I−KH)Pk∣k−1
✅ 所以,在卡尔曼增益是按标准公式计算的前提下,这两个公式是数学等价的。
🔍 二者对比总结
特性 公式1:完整对称形式
P = (I-KH)@P@(I-KH).T + K@R@K.T 公式2:简化形式
P = (I-KH)@P
数学正确性 ✅ 完全正确 ✅ 在最优K下等价
对称性保持 ✅ 更好(显式对称结构) ❌ 可能因数值误差失去对称性
正定性 ✅ 更稳定 ⚠️ 可能出现微小负特征值
计算开销 ⬆️ 稍高(多矩阵乘) ⬇️ 更低
推荐使用场景 高精度、鲁棒性要求高、平方根滤波 一般应用、教学、快速实现
🛠 实际建议
一般情况下:使用简化形式 P = (I - K@H) @ P 即可,这是绝大多数教材和代码库(如 filterpy)采用的形式。
高精度或稳定性敏感场景(如航天、惯导):
推荐使用对称形式,或进一步使用平方根卡尔曼滤波(用Cholesky分解维护协方差矩阵的平方根)。
数值实现技巧:
即使使用简化形式,也建议最后对 PP 做对称化处理:
深色版本
P = (P + P.T) / 2
以强制保持对称性。
✅ 示例代码对比(Python)
python
深色版本
import numpy as np
假设已有
P_pred = np.array([[4.0, 1.0], [1.0, 3.0]])
H = np.array([[1.0, 0.0]])
R = np.array([[1.0]])
K = P_pred @ H.T @ np.linalg.inv(H @ P_pred @ H.T + R) # K shape: (2,1)
KH = K @ H # (2,2)
方法1:完整对称形式
P1 = (np.eye(2) - KH) @ P_pred @ (np.eye(2) - KH).T + K @ R @ K.T
方法2:简化形式
P2 = (np.eye(2) - KH) @ P_pred
检查是否接近
print("P1 ≈ P2:", np.allclose(P1, P2)) # 应该为 True
✅ 结论
两个公式在理论最优条件下是等价的。
P = (I - KH) @ P 是标准简化形式,推荐日常使用。
P = (I-KH)@P@(I-KH).T + K@R@K.T 更严谨,适合高精度或稳定性要求高的系统。
实际编程中,无论用哪个,都建议最后对 PP 进行对称化处理。
卡尔曼滤波协方差更新的两种形式对比

被折叠的 条评论
为什么被折叠?



