Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

オンラインの再帰的最小二乗推定

この例では、オンラインの再帰的最小二乗推定器を実装する方法を説明します。内燃エンジンの非線形モデルを推定し、再帰的最小二乗法を使用してエンジンの慣性の変化を検出します。

エンジン モデル

エンジン モデルは、スロットルとマニホールドのシステムと燃焼システムの非線形要素を含みます。モデルの入力はスロットル角で、モデルの出力はエンジンの速度 (単位は rpm) です。

open_system('iddemo_engine');
sim('iddemo_engine')

エンジン モデルは、スロットル角を開から閉まで駆動するパルス列で設定されています。エンジンの応答は非線形であり、特にスロットルが開の時点と閉の時点でエンジン速度の応答時間が異なります。

シミュレーション開始から 100 秒の時点でエンジンに障害が発生し、エンジンの慣性が増加します (エンジンの慣性 Jiddemo_engine/Vehicle Dynamics ブロックでモデル化)。慣性の変化により、スロットルの開閉位置でエンジンの応答時間が長くなります。オンラインの再帰的最小二乗法を使用して、慣性の変化を検出します。

open_system('iddemo_engine/trpm')

推定モデル

エンジン モデルは減衰 2 次システムであり、異なるスロットル位置で異なる応答時間を表すために入力と出力が非線形です。再帰的最小二乗ブロックを使用して、エンジンをモデル化した次の離散システムを同定します。

$y_n = a_1 u_{n-1} + a_2 u_{n-1}^2 + a_3 y_{n-1}$

推定モデルは慣性を明示的には含んでいないので、慣性の変化とともに $a$ の値が変化すると予測されます。$a$ の値を変化させることにより、慣性の変化を検出します。

エンジンの有意な帯域幅の上限は 16 Hz です。推定器のサンプリング周波数を 2*160 Hz に設定するか、サンプル時間を $T_s = 0.003$ 秒に設定します。

Recursive Least Squares Estimator ブロックの設定

推定モデルの $u_{n-1}, u_{n-1}^2, y_{n-1}$ の各項は "モデルのリグレッサー" であり、$a$ の値を推定する再帰的最小二乗ブロックへの入力です。iddemo_engine/Regressors ブロックに示すように、リグレッサーを実装できます。

open_system('iddemo_engine/Regressors');

Recursive Least Squares Estimator ブロックを次のように設定します。

  • Initial Estimate: None。既定では、値 1 が使用されます。

  • Number of parameters: 3。リグレッサーの係数 $a$ ごとに 1 つ。

  • Parameter Covariance Matrix: 1。初期推定を 1 とする、不確かさの量。具体的には、推定されるパラメーターを分散 1 の確率変数として扱います。

  • サンプル時間: $T_s$

[Algorithm and Block Options] をクリックして、次の推定オプションを設定します。

  • 推定法: Forgetting Factor

  • Forgetting Factor: 1-2e-4。推定される $a$ の値は慣性とともに変化することが予想されるため、忘却係数を 1 未満の値に設定します。$\lambda$ = 1-2e-4 を選択します。これは、記憶の時定数 $T_0 = \frac{T_s}{1-\lambda}$ である 15 秒に対応します。記憶の時間を 15 秒にすることにより、位置が 10 秒ごとに変化するときの推定に、スロットルが開と閉の両方の位置にあるときの有意なデータが確実に使用されます。

  • [Output estimation error] チェック ボックスをオンにします。このブロック出力を使用して推定を検証します。

  • [Output parameter covariance matrix] チェック ボックスをオンにします。このブロック出力を使用して推定を検証します。

  • [Add enable port] チェック ボックスをオフにします。

  • 外部リセット: None

推定モデルの検証

Recursive Least Squares Estimator ブロックの Error 出力は、推定モデルの 1 ステップ先の誤差です。この誤差は 5 % 未満であり、1 ステップ先の予測について推定モデルが正確であることを示します。

open_system('iddemo_engine/Error (%)')

パラメーターの共分散行列の対角は、パラメーター $a_n$ の分散となります。$a_3$ の分散はパラメーター値と比較して小さく、推定値の信頼度が良好であることを示します。これに対し、$a_1, a_2$ の分散はパラメーター値と比較して大きく、これらの値の信頼度が低いことを示します。

推定誤差と共分散が小さいことに基づくとモデルが正しく推定されているという信頼度が得られますが、誤差が 1 ステップ先の予測子であるという点で制限があります。より厳密な検査では、シミュレーション モデル内で推定モデルを使用し、実際のモデル出力と比較します。Simulink モデルの Estimated Model セクションでこれを実装します。

Regressors1 ブロックは、再帰的推定器で使用する Regressors ブロックと同じものです。唯一の違いは、信号 y はプラントの測定値ではなく、推定モデルの出力からフィードバックされることです。Regressors ブロックの出力に推定値 $a_n$ を乗算すると、エンジン速度の推定値 $\hat{y}_n$ が得られます。

open_system('iddemo_engine/trpm Est')

推定モデルの出力は、モデルの出力と非常によく一致します。定常値が近く、過渡動作はわずかに異なりますが有意ではありません。100 秒後にエンジンの慣性が変化すると、推定モデルの出力とモデル出力との差がわずかに大きくなることに注意してください。これは、慣性が変化した後、選択したリグレッサーはモデルの動作をうまく捉えられなくなるということです。これはまた、システムの動作に変化があったことも示唆します。

推定モデル出力と、小さい値をもつ 1 ステップ先の誤差とパラメーター共分散を合わせて、再帰的推定器の信頼度が得られます。

エンジン慣性の変化の検出

シミュレーション開始から 100 秒後に慣性の変化を導入するようにエンジン モデルを設定します。再帰的推定器を使用して、慣性の変化を検出できます。

再帰的推定器がパラメーター値の初期セットに収束するまで、約 50 秒かかります。慣性の変化を検出するために、推定モデルの $a_1 u_{n-1}$ 項に影響するモデルの係数 $a_1$ を調べます。

open_system('iddemo_engine/Detect Inertia Change')

$a_1$ の共分散 0.05562 はパラメーター値 0.1246 と比較して大きく、推定値の信頼度が低いことを示します。$a_1$ の時間プロットには共分散の大きい理由が示されています。具体的には、スロットル位置の変化に応じて $a_1$ が変化しています。これは、推定モデルが、異なるスロットル位置における異なる立ち上がり時間を十分に再現できず、$a_1$ の調整が必要であることを示します。ただし、慣性の変化につれて $a_1$ の平均値が変化するため、これを使用すると慣性の変化を特定できます。$a_1$ パラメーターの移動平均にしきい値検出器を使用すると、エンジンの慣性の変化を検出できます。

bdclose('iddemo_engine')