【问题标题】:Is it possible that kalman-filter algorithm result in a singular variance matrix?卡尔曼滤波器算法是否可能导致奇异方差矩阵?
【发布时间】:2012-11-22 06:07:27
【问题描述】:

在卡尔曼滤波器实现中,“预测估计协方差”P(k|k-1), (see the wiki here) 是否有可能是奇异矩阵?如果不是,是不是我的代码有问题?

这是状态空间模型

%    y{t}=Z{t} b{t} +  eps{t},                  eps{t} ~ N(0,H{t})
%              b{t} = Pi{t} b{t-1} + tao{t}     tao{t} ~ N(0,Q{t})
%                                               b{1} ~ N(b0,P0)
%                                               t=1,...,T

这是作为卡尔曼滤波器算法主要部分的后向递归:

for t=1:T

    v{t} = y{t} - Z{t} * b_tt_1{t};
    M{t} = P_tt_1{t} * Z{t}';
    F{t} = Z{t} * M{t} + H{t};

       F_{t}= inv(F{t});
       MF_{t}= M{t} * F_{t};

    b_tt{t}=b_tt_1{t} + MF_{t} * v{t};
    P_tt{t}=P_tt_1{t} - MF_{t} * M{t}';

    b_tt_1{t+1} = Pi{t} * b_tt{t};
    P_tt_1{t+1} = Pi{t} * P_tt{t} * Pi{t}' + Q{t};

end

这发生在我使用实际数据时。为了查看问题可能出在哪里,我编写了一些代码来生成随机状态空间模型(如果需要,我可以提供代码)。

当 T 很大时,经过一些 t0,P_tt_1{t0} 是奇异的并且状态 (b{t0}) 发散。

编辑: 我使用了协方差更新方程的“约瑟夫形式”(参见维基百科)。它有所帮助,但是当状态空间模型很大时(就方程或状态的数量而言),结果仍然存在差异。我认为这意味着问题与数值稳定性有关。有没有办法解决这个问题?

【问题讨论】:

  • 如果是 Matlab 代码,您提供的代码应该立即失效。您正在使用花括号 {} 进行索引,表明您的变量都是元胞数组,但在 Matlab 中没有为元胞数组定义算术!?!
  • @colin T Bowers:A{p}=B 将 A 中的 B 矩阵设置为 (1,p) 元素。

标签: algorithm matlab kalman-filter


【解决方案1】:

你的矩阵唯一可以变成单数的地方是:

F_{t}= inv(F{t});

您可以改用pseudo-inverse `pinv'。

或者如果你重写这些行会更好:

F_{t}= inv(F{t});
MF_{t}= M{t} * F{t};

MF_{t}= M{t} / F{t};

Matlab 将求解线性方程:MF_{t} * F{t} = M{t} - 即使 F_{t} 是奇异的,它也可能有解——或者如果它仍然是奇异的,则通过伪逆求解。

【讨论】:

    【解决方案2】:

    问题在于 inv 或 pinv 函数的反转过程。矩阵很大,但它们也是正定的。所以我使用cholesky分解进行反演。 功能是:

    function A_=inversePD(A)
    %A:positive definite matrix
    M=size(A,1);
    [R b] = chol(A);
    if b~=0
        return
    end
    R_ = R \ eye(M);
    A_ = R_ * R_';
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      相关资源
      最近更新 更多