目录

  • 一、由来
  • 二、滤波方程


java实现一阶卡尔曼滤波算法_算法阵是病态阵的情况,利用矩阵三角分解法进行平方根滤波的技术足够解决这一问题了。可作为矩阵分解的另一项技术java实现一阶卡尔曼滤波算法_算法_02分解法,跟三角分解法有异曲同工之妙。那么相对应的也就必然产生一种新的滤波算法,也就是java实现一阶卡尔曼滤波算法_算法_02分解滤波算法。所以,为了知识的系统完整性,我觉得还是把这方面的内容写出来吧。

一、由来

java实现一阶卡尔曼滤波算法_算法阵是病态阵导致计算误差增大,滤波发散的问题。
       还记得平方根滤波那篇文章里,是将java实现一阶卡尔曼滤波算法_算法java实现一阶卡尔曼滤波算法_矩阵_06进行三角分解,分解成java实现一阶卡尔曼滤波算法_java实现一阶卡尔曼滤波算法_07java实现一阶卡尔曼滤波算法_java实现一阶卡尔曼滤波算法_08,在让java实现一阶卡尔曼滤波算法_java实现一阶卡尔曼滤波算法_09java实现一阶卡尔曼滤波算法_java实现一阶卡尔曼滤波算法_10在滤波方程中代替java实现一阶卡尔曼滤波算法_算法java实现一阶卡尔曼滤波算法_矩阵_06的作用,从而获得平方根滤波的算法。
       其实对于正定矩阵,还有另一种矩阵分解方法可以达到类似的目的,就是java实现一阶卡尔曼滤波算法_算法_02分解法。简单来说,就是一个正定的矩阵可以分解成java实现一阶卡尔曼滤波算法_算法_02这样的形式,其中U是对角线上都是1的上三角矩阵,D是对角阵(除了对角线,其他元素都是0)。
所以,我们就要把java实现一阶卡尔曼滤波算法_算法java实现一阶卡尔曼滤波算法_矩阵_06分解成java实现一阶卡尔曼滤波算法_算法_02的形式:
java实现一阶卡尔曼滤波算法_java实现一阶卡尔曼滤波算法_18java实现一阶卡尔曼滤波算法_矩阵_19
       为了便于描述,我们把这些符号重新定义一下:
java实现一阶卡尔曼滤波算法_矩阵_20java实现一阶卡尔曼滤波算法_java实现一阶卡尔曼滤波算法_21java实现一阶卡尔曼滤波算法_ide_22
       跟平方根滤波类似,java实现一阶卡尔曼滤波算法_算法_02滤波就是把卡尔曼滤波基本方程里的java实现一阶卡尔曼滤波算法_算法_24java实现一阶卡尔曼滤波算法_线性代数_25之间的迭代更新换成java实现一阶卡尔曼滤波算法_ide_26java实现一阶卡尔曼滤波算法_ide_27之间的迭代更新。

二、滤波方程

       以下过程仍然限定量测为标量,如果量测是矢量,还是要用序贯处理的。
       整个过程分两个步骤,第一步叫做量测更新,也就是卡尔曼基本方程里通过当前步骤获得java实现一阶卡尔曼滤波算法_矩阵_06去求java实现一阶卡尔曼滤波算法_算法的更新步骤。在java实现一阶卡尔曼滤波算法_算法_02滤波过程中就是根据java实现一阶卡尔曼滤波算法_算法_31java实现一阶卡尔曼滤波算法_ide_32。推导过程相当麻烦。还是不写了,写了也估计没人看的,直接上结论吧。java实现一阶卡尔曼滤波算法_线性代数_33java实现一阶卡尔曼滤波算法_ide_34或者写成java实现一阶卡尔曼滤波算法_矩阵_35java实现一阶卡尔曼滤波算法_ide_36或者写成递推形式java实现一阶卡尔曼滤波算法_java实现一阶卡尔曼滤波算法_37java实现一阶卡尔曼滤波算法_ide_38java实现一阶卡尔曼滤波算法_矩阵_39java实现一阶卡尔曼滤波算法_线性代数_40java实现一阶卡尔曼滤波算法_矩阵_41java实现一阶卡尔曼滤波算法_线性代数_42java实现一阶卡尔曼滤波算法_ide_43
       如此操作,就完成了从java实现一阶卡尔曼滤波算法_算法_31java实现一阶卡尔曼滤波算法_ide_32的计算。看上去好复杂。可你要知道,由于量测是标量,上面这些式子有一部分是标量计算而不是矩阵计算。比如java实现一阶卡尔曼滤波算法_java实现一阶卡尔曼滤波算法_46不管下标是几,都是一个标量,f和g都是一个n维的列向量,所以java实现一阶卡尔曼滤波算法_java实现一阶卡尔曼滤波算法_47java实现一阶卡尔曼滤波算法_ide_48表示列向量里的元素。H是一个n维的行向量,java实现一阶卡尔曼滤波算法_java实现一阶卡尔曼滤波算法_49也是一个n维的列向量。
       一定要注意,D是对角线矩阵,也就是除了对角线上有数其他都是0,所以java实现一阶卡尔曼滤波算法_矩阵_50就表示对角线上的第i个元素。而U是一个对角线上为1的上三角矩阵,它的下三角部分都是0。
       以上即为量测更新,接下来需要进行时间更新,在卡尔曼基本方程里,时间更新就是根据上一步获得的java实现一阶卡尔曼滤波算法_ide_51来求这一步的java实现一阶卡尔曼滤波算法_矩阵_06。到了java实现一阶卡尔曼滤波算法_算法_02滤波里,就是已知java实现一阶卡尔曼滤波算法_算法_54来求java实现一阶卡尔曼滤波算法_矩阵_55
       还是直接写公式吧。先定义两个矩阵:java实现一阶卡尔曼滤波算法_ide_56java实现一阶卡尔曼滤波算法_矩阵_57
然后就是:java实现一阶卡尔曼滤波算法_矩阵_58java实现一阶卡尔曼滤波算法_java实现一阶卡尔曼滤波算法_59java实现一阶卡尔曼滤波算法_算法_60java实现一阶卡尔曼滤波算法_线性代数_61
       这里面符号的定义我就不用讲了吧。另外要注意,这里面的java实现一阶卡尔曼滤波算法_ide_27java实现一阶卡尔曼滤波算法_ide_26跟量测更新那里有些区别,应该理解为上一步到这一步的时间更新,也就是java实现一阶卡尔曼滤波算法_线性代数_64java实现一阶卡尔曼滤波算法_java实现一阶卡尔曼滤波算法_65
       好了,交叉进行量测更新和时间更新就可以实现java实现一阶卡尔曼滤波算法_算法_02滤波了。还有个问题,就是java实现一阶卡尔曼滤波算法_ide_26的初值问题。很简单,还记得java实现一阶卡尔曼滤波算法_算法的初值吗,是一个对角线矩阵,那么java实现一阶卡尔曼滤波算法_java实现一阶卡尔曼滤波算法_69的初值就是单位矩阵I,java实现一阶卡尔曼滤波算法_算法_70的初值则就是java实现一阶卡尔曼滤波算法_矩阵_71
       到这里,所谓的java实现一阶卡尔曼滤波算法_算法_02滤波就是这样了,由于利用了java实现一阶卡尔曼滤波算法_矩阵_73java实现一阶卡尔曼滤波算法_算法_02分解形式,所以如果P阵是病态阵的时候,分解后的U阵和D阵病的程度就没那么重了。不过,说实话,这么多年,我还没见过哪个工程应用场景用到过这个滤波器。甚至连平方根滤波都很少遇到。所以,还是重点关注基本的卡尔曼滤波吧。