MatLab中的数值不稳定性卡尔曼滤波器
Posted
技术标签:
【中文标题】MatLab中的数值不稳定性卡尔曼滤波器【英文标题】:Numerical Instability Kalman Filter in MatLab 【发布时间】:2015-04-05 15:55:16 【问题描述】:我正在尝试运行标准卡尔曼滤波器算法来计算似然度,但在计算法线密度时,我不断遇到非正定方差矩阵的问题。 我进行了一些研究,发现实际上可能存在一些数值不稳定;尝试了一些数值方法来避免非正定矩阵,同时使用 Choleski 分解及其变体 LDL' 分解。 我正在使用 MatLab。 有人建议什么吗? 谢谢。
【问题讨论】:
贴一个最小的例子(代码) 在更新噪声协方差时,您使用的是(I-KH)P
还是(I-KH)P(I-KH)*P*(I-KH)' + K*R*K'
? (其中P
是校正前的噪声协方差,K
是卡尔曼增益,H
是观测模型,R
是观测噪声协方差)参见 en.wikipedia.org/wiki/… 处的“约瑟夫形式”
您的系统是否可观察?检查你的误差协方差矩阵 P 的奇异值。如果系统是不可观察的,它们将从一开始就无限增长。如果确实是数值不稳定的问题,P的最大奇异值会先减小,然后开始增大。当然,不多描述问题是不可能的。您是否将其应用于线性系统?非线性系统?
我会尽快更新我的问题,提供更多细节,但有件事引起了 Fegur cmets 先生的注意:我系统的观测方程只是与过渡方程的一个恒等式;也就是说,我观察到所有变量都没有测量误差。您认为这可能会导致问题吗?系统是线性的。
【参考方案1】:
在我需要长时间运行卡尔曼滤波器但随着时间的推移我的协方差矩阵会退化时,我遇到过可能是相同的问题。这可能只是由于数值误差而失去对称性的问题。强制协方差矩阵(我们称之为P
)保持对称的一种简单方法是:
P = (P + P')/2 # where P' is transpose(P)
估计P
之后。
【讨论】:
使用约瑟夫的形式将确保对称协方差矩阵 P 以及修复其他数值错误。 @NirRegev 我从未见过约瑟夫的表格;多亏了你,我查到了。我看到协方差矩阵总是半正定的。谢谢。【参考方案2】:发布您的代码。
根据经验,如果模型不准确并且正则化(即模型噪声矩阵 Q)不够“大”,则会发生欠拟合,并且估计器的协方差矩阵将是病态的。尝试微调您的 Q 矩阵。
【讨论】:
稍微调整 Q 对我来说有很大的不同(由于 GPU 编程而被限制为 float32)。谢谢你的提示!【参考方案3】:众所周知,使用约瑟夫形式实现的卡尔曼滤波器在数值上是不稳定的,任何曾经使用过单精度滤波器实现的老手都可以看出这一点。这个问题是在数亿年前发现的,并促使大量研究以稳定的方式实现过滤器。最著名的实现可能是 UD,其中协方差矩阵被分解为 UDU',并且使用特殊公式更新和传播这两个因子(参见 Thoronton 和 Bierman)。 U是对角线上有“1”的上对角矩阵,D是对角矩阵。
【讨论】:
以上是关于MatLab中的数值不稳定性卡尔曼滤波器的主要内容,如果未能解决你的问题,请参考以下文章
MATLAB应用实战系列(七十六)-仿真应用卡尔曼滤波在雷达目标跟踪中的应用仿真(附matlab代码)
MATLAB应用实战系列(七十六)-仿真应用卡尔曼滤波在雷达目标跟踪中的应用仿真(附matlab代码)
滤波跟踪基于matlab不变扩展卡尔曼滤波器对装有惯性导航系统和全球定位系统IMU+GPS进行滤波跟踪含Matlab源码 2232期