1

カルマンフィルターの実装では、「予測された推定共分散」、P(k | k-1)(ここのwikiを参照)が特異行列である可能性はありますか?そうでない場合、私のコードに何か問題がありますか?

これは状態空間モデルです

%    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})は発散します。

編集:共分散更新方程式の「ジョセフ形式」を使用しました(ウィキペディアを参照)。それは役に立ちましたが、状態空間モデルが大きい場合(方程式または状態の数の意味で)、結果は依然として発散します。これは、問題が数値安定性に関係していることを意味していると思います。これを解決する方法はありますか?

4

2 に答える 2

1

行列が特異になることができる唯一の場所は、次の行です。

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

代わりに、疑似逆行列の`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}が特異である場合でも、解が得られる可能性があります-または、疑似逆行列を介して特異解である場合。

于 2012-11-22T09:40:32.913 に答える
0

問題は、invまたはpinv関数の反転プロセスにあります。行列は大きいですが、正定値でもあります。そのため、反転にはコレスキー分解を使用しました。関数は次のとおりです。

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
于 2012-11-27T03:31:11.587 に答える