
制御素人老人がScilab/Xcosのデモを動かしながら「制御」を学ばんと無謀な試みを続けてます。前回はカルマンフィルタでした。カルマンという御名前にビビリながら動かしてみましたがサッパリ。別シリーズでもっと簡単なカルマンフィルタやって分かったような気になって今回の再挑戦です。今回は「離散」とな。どこが違う?
※「ブロックを積みながら」投稿順 index はこちら
※動作確認にはWindows 11の パソコン(64bit)上にインストールしたScilabの以下バージョンを使用しています。
Scilab 2024.0.0
別シリーズで「前回より簡単なモデル」やってみた
前回のカルマンフィルタのデモ、素人老人にはモデルが難しすぎて(なんてたって、状態変数が3個「も」ある)なのでサッパリでした。そこで前回終了後、以下別シリーズで「もっと簡単なモデル」を練習してみました。練習といっても、大先達『Logics of Blue』様の「カルマンフィルタの考え方」ページでご紹介いただいております「ローカルレベルモデル」(オリジナルはR言語記述)をScilabへ勝手移植してみただけであります。
ソフトな忘却力(74) R言語記述のカルマンフィルタ例をScilabへ移植
このレベルなら、ほんわか分かったような気がするんだが、錯覚か。また今回みたいな「ちょっと複雑な」モデルにあたるとサッパリだし。。。
今回は「離散な」モデルなので「そこだけ」確認してこう
今回も前回同様、状態変数は3つの「線形システム」なモデルです。どうせよくわからんので、今回は前回と異なる部分、「離散」というところに着目して差異を確認してみることにいたします。まずは全体のフローから。
前回のフロー同様、観測対象のSystemと、そこに接続されたカルマンフィルタともにSuper Blockの中で記述されており、Systemの前後に乱数ジェネレータが接続されていてそれぞれ状態と観測に「ノイズ」を加えています。それをフィルタに通して差分をとって「誤差」をグラフに表すみたい。おおまかなところは前回の「連続な」カルマンフィルタのフローと同じですな。しかし違いが赤丸のところに。Systemのところに赤線のクロックが入ってないかい。
SystemのSuper Blockの中を開いたところが以下に。
「状態空間」システム・ブロックが前回と異なっていることが分かります。前回の連続なシステムでは、CLSS(Continuous state-space system)
今回の離散システムでは、DLSS(Discrete state-space system)です。
見た目は「似ている」けれども、上に赤の▽(クロック信号)が必要。そして状態変数 x は演算子 「+=」 となってます。積和的な動作を暗示している? 知らんけど。
内部をみると、ポート1へ出ていくのが観測値yベクトルで、通常外部には出力されない状態変数xベクトルを求めるのに、Du引いて、Cで割って、ポート2へ出しているみたい。これは後で誤差を計算するのに使うためだよね。
すると、最上位のフローに書いてあるxという信号は、実はこのブロックのy出力なんではないかと。紛らわしいけど、そう解釈しないと辻褄があわんぜよ。
一方カルマンフィルタのSuper Blockの中身が以下に。
ほえほえ、すみません。私が悪うございました。万歳デス。ムツカシー、複雑。でもね、「離散」の実体は赤丸のところにしっかりありましたぞ。z変換ね。前回の連続なカルマンフィルタでは「積分」使ってました(積分はラプラス演算子で1/sね。)sかzか、連続か離散か。
前回の連続のデモでは、CLSSブロック内で計算に使っているABCDが、コンテキストで定義しているABCD(本来の意味)と途中データの取り出しの事情で異なる部分ありました。ちょっと混乱。今回の離散フローでは素直に使われております。
また、ノイズの定義が以下に。まずはシステムの状態変数ベクトルへの入力となるノイズ。
固定のSeedが与えられているので毎回同じ挙動っすね。
3要素のベクトルです。
シミュレーション結果
最初は大きく外れているけど、急速に0付近に収まっておりますな。時々ハズレとるけどなあ。なお、状態変数の値は、黒、緑、赤の順だと思います。何を想定しているのかは知らんけど。素人老人には抽象的な変数より、何か具体的な対象にしてくれた方が納得いく気がするんだが(どうせ理解できんから一緒か。)
なんだかなあ、スッキリせんのは前回と変わらんなあ。