忘却の微分方程式(3) Xcos、積分2つ、どっち?

JosephHalfmoon
JosephHalfmoon

初回前回と2回続けて、コロナなどの伝染病の流行モデルの中で一番簡単そうなSIRモデルの微分方程式を、Scilab/Xcosのブロックダイアグラムで「解いて」みました。そして、前回は3つも存在するゲインブロックの「もやもや」を解消しました。今回は積分ブロックの「もやもや」に決着つけたいと思います。なかなかSIRモデルから抜け出せませぬ。

さて、前回は、信号を定数倍する「ゲイン」ブロックが、3つもあるのだけれど、そちらが機能的には皆等価であり、なにやら歴史的な経緯なのか、何なのか、そのうちの2つは今後の使用は非推奨ということでありました。

今回、気になっているのは、初回、前回と積分のために使った

INTEGRAL_m、まさに積分記号で積分にきっと間違いなし

と、

INTEGRAL_f、ラプラス演算子sで割るのは積分だったっけ?

という2つのブロックであります。以下のXcosのパレットブラウザを御覧ください。

だいたい、_fと_m、どういう使い分けをしているのでしょう。(実はFortranで実装されているのが_fなどと勝手仮説をたてたのですが、反例相次ぎ破綻。どこかに書いていないのか?)

こうしてみると、ブロックの見た目は全く異なります。1/sなどと書かれると、ラプラス変換でしょ、伝達関数用?みたいな印象を受けるのですが、

どちらも普通に時間に関する関数を積分できる

ブロックであります。本当にラプラス演算子 s を使って伝達関数で記述できるブロックは、1行上にある

CLR

というブロックの方です。分子が1、分母が1+sになっているので上のような見た目になっている。

さて、積分に戻ります。実は気になったのが、Xcosの利用例をいろいろ眺めていて、「1/s」 の方で描かれているものと「積分記号」の方で描かれているものの両方があり、混在させているような例は見当たらなかった、ということがあります。まさに

1/s「流派」 と 積分記号「流波」

私は、図らずも積分記号で始めてしまいました。後で離散的なモデルを扱う場合には、sに対してzが登場します。2つのモデルの対比など考えるとsで書く方が良いような気もする。でも、実際に時間に対する関数を積分しているという点では、積分記号の方が直感的でおおいに分かり易い気もする。。。

論より証拠、前回のSIRモデルの積分ブロックの1個を1/sで書き換えてみました。流派逸脱、見苦しいこと間違いない。

しかし、上のお見苦しいブロックダイアグラムでも、これを実行すれば、前回とまったく同じ結果が得られます(グラフは省略)。なお、積分初期値を前回と同じ値にしておくことを忘れずに。これを忘れると、とてもつまらないグラフになります。人口0人、誰にも感染する訳はない。

さてしかし、実際に2つを並べてみると、その違いも明らかです。1/sのブロックの方のパラメータは以下のように初期値のみ。

これに対するに、積分記号の方のブロックには、初期値以外のパラメータも多数。明らかに実装が異なります。

調べてみると、1/sの方の実装はFortran、積分記号の方はCでした。なお、前回も参照した、

Xcos deprecated blocks

を再び参照してみると、

  1. 昔、INTEGRALという名のブロックがあったが、現在ではパレットから除去されている。(今のINTEGRAL_mと同等。なぜ削除されたのかは不明。)
  2. よりシンプルな積分がINTEGRAL_f(1/s)として実装された。
  3. 1の積分記号の見た目と機能は、多機能なINTEGRAL_mという名で継承された。

ということのように想像されます(間違っていたらごめんなさい。)

まあ、結論は、シンプルな積分するだけなら、どちらでも良い(でも実装がシンプルな分、1/sの方が速いのかも??)、上限サチらせたりとか、より高機能な実装が欲しい場合は、積分記号の方を選択、という感じでしょうかね。

Xcos、なにげに奥が(闇が)深いな。次回あたり、別な微分方程式に進みたいのだけれど。

忘却の微分方程式(2) XcosのSIRモデルを手直し に戻る

忘却の微分方程式(4) Xcos、Modelica、RC回路に手こずる に進む