(線形)カルマンフィルターは、おそらくあなたの場合に最適なオプションです(最初のアプリケーションの1つは、実際には、月に適切に当たるようにアポロ宇宙船の位置を追跡することでした!)。したがって、まさにこの問題に関するチュートリアルがたくさんあります。たとえば、このかわいい小さなロボットの例を参照してください。実際には、5行のコードです(永続変数を使用する必要があることに注意してください)。共分散行列(多くの場合、 P、R、Q)の調整は、知識に基づいた推測です。Pを対角行列Pとして初期化し、状態ベクトルxまたは測定値y= eye(length(x))*1e3
とほぼ同じ順序でノイズ行列R、Qを選択します。それぞれ。
ノイズ行列のファジーが気に入らない場合は、再帰的近似を使用できます。RLS(recursive-least-squares)は標準の識別方法ですが、カルマンフィルターとして統計を使用しません。つまり、傾向があります。測定のノイズに。それはさらに少ないコード行で構成されていますが、永続変数も使用しています。
function [x_est] = RLS(y,x0,mk,fnc)
% (non)linear recursive-least-square
%
% y measurements
% x0 initial value of the to-be-identified state vector
% mk measurement matrix, so that y = mk'*x
% fnc function handle, if the system is non-linear and when mk is the
% linearized version of this function
persistent x P
if isempty(x)
x = x0;
P = eye(length(x)) * 1e3;
end
% adaption factor (usually [0.9 1))
AdaptFct = .995;
%% nonlinear prediction
if nargin > 4
y_sim = fnc(x);
else
y_sim = mk*x;
end
e = y_sim - y;
%% RLS
% Kalman gain
G = P*mk / (AdaptFct + mk'*P*mk);
% Update
% state
x = x + G*e;
% covarianve matrix
I = eye(length(P));
P_new = (I - G*mk')*P;
P = P_new/AdaptFct;
%% output
x_est = x;
end
すべてを再起動する場合は、関数の永続変数をクリアする必要があることに注意してください。clear RLS