Main Content

predict

拡張カルマン フィルター、アンセンテッド カルマン フィルター、または粒子フィルターを使用した次のタイム ステップにおける状態および状態推定誤差の共分散の予測

説明

predictコマンドは、次のタイム ステップでextendedKalmanFilterオブジェクト、unscentedKalmanFilterオブジェクトまたはparticleFilterオブジェクトの状態および状態推定誤差の共分散を予測します。拡張カルマン フィルター アルゴリズムまたはアンセンテッド カルマン フィルター アルゴリズムを実装するには、predictコマンドとcorrectコマンドを一緒に使用します。現在の出力測定値が存在する場合、predictcorrectを使用できます。測定値がない場合は、predictのみを使用できます。コマンドの使用順序の詳細については、predict コマンドと correct コマンドの使用を参照してください。

このpredictコマンドを使用して、リアルタイム データを使ったオンライン状態推定を行います。リアルタイムのデータが使用できない場合、同定されたモデルの K ステップ先の出力を計算するにはpredictを使用してオフラインの推定を行います。

[PredictedState,PredictedStateCovariance] = predict(obj)は、次のタイム ステップで拡張カルマン フィルター オブジェクト、アンセンテッド カルマン フィルター オブジェクト、または粒子フィルター オブジェクトobjの状態推定および状態推定誤差の共分散を予測します。

extendedKalmanFilterコマンド、unscentedKalmanFilterコマンド、またはparticleFilterコマンドを使用してobjを作成します。非線形システムの状態遷移関数と測定関数をobjに指定します。また、これらの関数においてプロセス ノイズ項と測定ノイズ項が加法性であるか非加法性であるかを指定します。オブジェクトのStateプロパティには最新の推定状態値が格納されます。タイム ステップkで、obj.State x ^ [ k | k ] であると仮定します。この値は、時間kの状態推定であり、時間kまでに測定された出力を使用して推定されます。predictコマンドを使用すると、PredictedState出力に x ^ [ k + 1 | k ] が返されます。 x ^ [ k + 1 | k ] は時間k+1の状態推定であり、時間kまでに測定された出力を使用して推定されます。コマンドは x ^ [ k + 1 | k ] の状態推定誤差の共分散をPredictedStateCovariance出力に返します。ソフトウェアはまた、これらの修正された値をもつobjStateプロパティとStateCovarianceプロパティを更新します。

obj.StateTransitionFcnで指定した状態遷移関数 f が次のいずれかの形式をとる場合、この構文を使用します。

  • x(k) = f(x(k-1))— 加法性プロセス ノイズの場合。

  • x(k) = f(x(k-1),w(k-1))— 非加法性プロセス ノイズの場合。

ここでxwはシステムの状態とプロセス ノイズです。f への入力は、状態とプロセス ノイズのみです。

システムの状態遷移関数にこれらの入力が必要な場合、[PredictedState,PredictedStateCovariance] = predict(obj,Us1,...Usn)は追加の入力引数を指定します。複数の引数を指定できます。

状態遷移関数 f が次のいずれかの形式をとる場合、この構文を使用します。

  • x(k) = f(x(k-1),Us1,...Usn)— 加法性プロセス ノイズの場合。

  • x(k) = f(x(k-1),w(k-1),Us1,...Usn)— 非加法性プロセス ノイズの場合。

すべて折りたたむ

アンセンテッド カルマン フィルター アルゴリズムと測定出力データを使用して、ファン デル ポール振動子の状態を推定します。振動子には 2 つの状態と 1 つの出力があります。

振動子のアンセンテッド カルマン フィルター オブジェクトを作成します。前に記述して保存した状態遷移関数vdpStateFcn.mと測定関数vdpMeasurementFcn.mを使用します。これらの関数は、1 と等しい非線形パラメーター mu を使用して、ファン デル ポール振動子への離散近似を記述します。これらの関数は、システム内の加法性プロセスと測定ノイズを仮定します。2 つの状態の初期状態の値を [1;0] と指定します。これは、時間k-1までのシステム出力に関する情報を使用して、初期時間kにおける状態を推定した値 x ˆ [ k | k - 1 ] です。

obj = unscentedKalmanFilter(@vdpStateFcn,@vdpMeasurementFcn,[1;0]);

振動子から測定出力データyを読み込みます。この例では、説明のためにシミュレーションされた静的データを使用します。データは、vdp_data.matファイルに保存されています。

loadvdp_data.maty

振動子のプロセス ノイズ共分散と測定ノイズ共分散を指定します。

obj.ProcessNoise = 0.01; obj.MeasurementNoise = 0.16;

配列を初期化して、推定の結果を取得します。

residBuf = []; xcorBuf = []; xpredBuf = [];

アンセンテッド カルマン フィルター アルゴリズムを実装し、correctコマンドとpredictコマンドを使用して振動子の状態を推定します。最初に、時間kにおける測定値を使用して x ˆ [ k | k - 1 ] を修正し、 x ˆ [ k | k ] を取得します。次に、時間kまでの測定値を使用して推定されたタイム ステップkにおける状態推定 x ˆ [ k | k ] を使用して、次のタイム ステップにおける状態値 x ˆ [ k + 1 | k ] を予測します。

リアルタイムのデータ測定をシミュレートするには、一度に 1 つのタイム ステップの測定データを使用します。予測値と実際の測定値の残差を計算して、フィルターの実行と収束がどの程度適切であるか評価します。残差の計算はオプションのステップです。residualを使用する場合は、correctコマンドの直前にこのコマンドを置きます。予測が測定値と一致した場合、残差はゼロです。

タイム ステップのリアルタイム コマンドを実行した後に、結果をバッファー処理して、実行が完了した後に結果をプロットできます。

fork = 1:size(y) [Residual,ResidualCovariance] = residual(obj,y(k)); [CorrectedState,CorrectedStateCovariance] = correct(obj,y(k)); [PredictedState,PredictedStateCovariance] = predict(obj); residBuf(k,:) = Residual; xcorBuf(k,:) = CorrectedState'; xpredBuf(k,:) = PredictedState';end

correctコマンドを使用すると、obj.Stateおよびobj.StateCovarianceは、タイム ステップkでの修正済み状態値CorrectedStateと修正済み状態推定誤差の共分散値CorrectedStateCovarianceで更新されます。predictコマンドを使用すると、obj.Stateおよびobj.StateCovarianceは、タイム ステップk+1での予測値PredictedStatePredictedStateCovarianceで更新されます。

この例では、初期状態値が x ˆ [ k | k - 1 ] (つまり、時間k-1までのシステム出力を使用した初期時間kでの状態推定値) であったため、predictの前にcorrectを使用しました。初期状態の値が x ˆ [ k - 1 | k - 1 ] (つまり、k-1までの測定値を使用した前の時間k-1での値) である場合は、最初にpredictコマンドを使用します。predictcorrectの使用順序の詳細については、predict コマンドと correct コマンドの使用を参照してください。

修正後の値を使用して、推定状態をプロットします。

plot(xcorBuf(:,1), xcorBuf(:,2)) title('Estimated States')

Figure contains an axes object. The axes object with title Estimated States contains an object of type line.

実際の測定値、修正された推定測定値、および残差をプロットします。vdpMeasurementFcnの測定関数の場合、測定値が最初の状態になります。

M = [y,xcorBuf(:,1),residBuf]; plot(M) gridontitle('Actual and Estimated Measurements, Residual') legend(“测量”,'Estimated','Residual')

Figure contains an axes object. The axes object with title Actual and Estimated Measurements, Residual contains 3 objects of type line. These objects represent Measured, Estimated, Residual.

推定値は測定値に近接して追跡します。初期の過渡状態の後、残差は実行全体で比較的小さく維持されます。

ファン デル ポールの ODE データを読み込み、サンプル時間を指定します。

vdpODEdata.matには、非線形パラメーター mu=1 で、ode45 を使用し、初期条件[2;0]をもつファン デル ポール ODE のシミュレーションが含まれています。実際の状態はサンプル時間dt = 0.05で抽出されたものです。

load ('vdpODEdata.mat','xTrue',“dt”) tSpan = 0:dt:5;

測定値を取得します。この例では,センサーが,標準偏差0.04のガウス ノイズをもつ最初の状態を測定します。

sqrtR = 0.04; yMeas = xTrue(:,1) + sqrtR*randn(numel(tSpan),1);

粒子フィルターを作成して、状態遷移関数と測定尤度関数を設定します。

myPF = particleFilter(@vdpParticleFilterStateFcn,@vdpMeasurementLikelihoodFcn);

粒子フィルターを状態[2; 0]で単位共分散を使って初期化し、1000個の粒子を使用します。

initialize(myPF,1000,[2;0],eye(2));

mean状態推定法とsystematicリサンプリング法を選択します。

myPF.StateEstimationMethod ='mean'; myPF.ResamplingMethod ='systematic';

correctコマンドとpredictコマンドを使用して状態を推定し、推定された状態を保存します。

xEst = zeros(size(xTrue));fork=1:size(xTrue,1) xEst(k,:) = correct(myPF,yMeas(k)); predict(myPF);end

結果をプロットして、推定された状態と実際の状態を比較します。

figure(1) plot(xTrue(:,1),xTrue(:,2),'x',xEst(:,1),xEst(:,2),'ro') legend('True','Estimated')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent True, Estimated.

次の状態遷移方程式と測定方程式に従って状態xと測定値yが変化するような入力uをもつ、非線形システムについて考えます。

x [ k ] = x [ k - 1 ] + u [ k - 1 ] + w [ k - 1 ]

y [ k ] = x [ k ] + 2 * u [ k ] + v [ k ] 2

システムのプロセス ノイズwは加法性で、測定ノイズvは非加法性です。

システムの状態遷移関数と測定関数を作成します。追加入力uを使用して関数を指定します。

f = @(x,u)(sqrt(x+u)); h = @(x,v,u)(x+2*u+v^2);

fhは状態遷移関数と測定関数をそれぞれ保存する無名関数に対する関数ハンドルです。測定関数では、測定ノイズが非加法性であるため、vも入力として指定されます。追加入力uの前に、vが入力として指定されることに注意してください。

指定した関数を使用して、非線形システムの状態を推定するために拡張カルマン フィルター オブジェクトを作成します。状態の初期値を 1、測定ノイズを非加法性として指定します。

obj = extendedKalmanFilter(f,h,1,'HasAdditiveMeasurementNoise',false);

測定ノイズ共分散を指定します。

obj.MeasurementNoise = 0.01;

これで、predictコマンドとcorrectコマンドを使用して、システムの状態を推定できます。uの値をpredictcorrectに渡すと、状態遷移関数と測定関数にそれぞれ渡されます。

タイム ステップkで測定値y[k]=0.8と入力u[k]=0.2を使用して状態推定値を修正します。

correct(obj,0.8,0.2)

次のタイム ステップでu[k]=0.2が与えられた場合の状態を予測します。

predict(obj,0.2)

予測値と測定値の誤差、つまり "残差"を取得します。

[Residual, ResidualCovariance] = residual(obj,0.8,0.2);

入力引数

すべて折りたたむ

オンライン状態推定のための拡張カルマン フィルター オブジェクト、アンセンテッド カルマン フィルター オブジェクト、または粒子フィルター オブジェクト。次のいずれかのコマンドを使用して作成されます。

状態遷移関数への追加の入力引数。任意の型の入力引数として指定します。状態遷移関数 f はオブジェクトのStateTransitionFcnプロパティで指定します。状態値とプロセス ノイズ値の他に、関数で入力引数が必要な場合、これらの入力をpredictコマンド構文で指定します。

たとえば、状態遷移関数が状態x(k-1)の他にシステム入力u(k-1)と時間k-1を使用し、タイム ステップkで予測された状態xを計算すると仮定します。

x(k) = f(x(k-1),u(k-1),k-1)

タイム ステップkでオンライン状態推定を実行するとき、これらの追加の入力をpredictコマンド構文で指定します。

[PredictedState,PredictedStateCovariance] = predict(obj,u(k-1),k-1);

出力引数

すべて折りたたむ

サイズが M のベクトルとして返される、予測された状態推定。ここで、M はシステムの状態の数です。objの初期状態を列ベクトルとして指定する場合、M は列ベクトルとして返されます。そうでない場合、M は行ベクトルとして返されます。

オブジェクトの初期状態を指定する方法の詳細については、extendedKalmanFilterunscentedKalmanFilter、およびparticleFilterのリファレンス ページを参照してください。

M 行 M 列の行列として返される、予測された状態推定誤差の共分散。ここで、M はシステムの状態の数です。

詳細

すべて折りたたむ

predictコマンドとcorrectコマンドの使用

拡張カルマン フィルター オブジェクト、アンセンテッド カルマン フィルター オブジェクト、または粒子フィルター オブジェクトobjを作成した後で、推定アルゴリズムを実装するには、correctコマンドとpredictコマンドを一緒に使用します。

タイム ステップkで、correctコマンドは、同じタイム ステップにおいて測定されたシステム出力y[k]を使用して、状態と状態推定誤差の共分散の修正値を返します。測定関数に追加の入力引数Umがある場合、これらの引数をcorrectコマンドへの入力として指定します。これらの値は、コマンドによって測定関数に渡されます。

[CorrectedState,CorrectedCovariance] = correct(obj,y,Um)

correctコマンドは、オブジェクトのStateプロパティとStateCovarianceプロパティを推定値CorrectedStateCorrectedCovarianceで更新します。

predictコマンドは、次のタイム ステップで状態と状態推定誤差の共分散の予測結果を返します。状態遷移関数に追加の入力引数Usがある場合、これらの引数をpredictコマンドへの入力として指定します。これらの値は、コマンドによって状態遷移関数に渡されます。

[PredictedState,PredictedCovariance] = predict(obj,Us)

predictコマンドは、オブジェクトのStateプロパティとStateCovarianceプロパティを予測値のPredictedStatePredictedCovarianceで更新します。

現在の出力測定値が所定のタイム ステップに存在する場合は、correctpredictを使用できます。測定値がない場合は、predictのみを使用できます。これらのコマンドによるアルゴリズムの実装方法の詳細については、オンライン状態推定のための拡張カルマン フィルター アルゴリズムおよびアンセンテッド カルマン フィルター アルゴリズムを参照してください。

コマンドを実装する順序は、システムの測定データyUsおよびUmを使用できるかどうかによって変わります。

  • correctの次にpredict— タイム ステップkにおいてobj.Stateの値は x ^ [ k | k 1 ] であると仮定します。この値は、時間k-1までに測定された出力を使用して推定された時間kにおけるシステムの状態です。また,同じタイムステップで測定された出力y[k]と入力Us[k]およびUm[k]もあります。

    この場合、測定されたシステム データy[k]と追加入力Um[k]を指定してcorrectコマンドを最初に実行します。このコマンドはobj.Stateの値を x ^ [ k | k ] に更新します。これは、時間kまでに測定された出力を使用して推定された時間kの状態推定です。これで,入力Us[k]を指定してpredictコマンドを実行すると、obj.State x ^ [ k + 1 | k ] が保存されます。アルゴリズムはこの状態値を次のタイム ステップにおけるcorrectコマンドへの入力として使用します。

  • predictの次にcorrect— タイム ステップkにおいてobj.Stateの値は x ^ [ k 1 | k 1 ] であると仮定します。同じタイム ステップで測定された出力y[k]と入力Um[k]もありますが、前回のタイム ステップからのUs[k-1]があります。

    その場合、入力Us[k-1]を指定してpredictコマンドを最初に実行します。このコマンドはobj.Stateの値を x ^ [ k | k 1 ] に更新します。次に入力引数y[k]およびUm[k]を指定してcorrectコマンドを実行すると、obj.State x ^ [ k | k ] で更新されます。アルゴリズムはこの状態値を次のタイム ステップにおけるpredictコマンドへの入力として使用します。

したがって、いずれの場合も、時間kの状態推定 x ^ [ k | k ] は同じですが、時間kにおいて現在の状態遷移の関数入力Us[k]にアクセスできず、代わりにUs[k-1]がある場合は、predictを最初に使用してからcorrectを使用します。

predictコマンドとcorrectコマンドを使用して状態を推定する例については、アンセンテッド カルマン フィルターを使用したオンラインでの状態の推定または粒子フィルターを使用したオンラインでの状態の推定を参照してください。

バージョン履歴

R2016b で導入