前回、今更ながら、微分方程式をScilab、Xcosのブロックダイアグラムで解く題材として伝染病の流行モデルの中で最も簡単そうなSIRモデルを使わせていただきました。しかし、久しぶりで触るScilab、そしてまともに使ったことがなかったXcosということで、とりあえず解けた感はするものの、いろいろ不満あり。今回は細かいところにちょっと手を入れてみた報告でございます。
※「忘却の微分方程式」投稿順 index はこちら
前回、書き忘れてしまいましたが、今回、使用させていただいているのは、
scilab 6.1.0 Windows用 64bit版
であります。以前、同じ機械に5.4.0をインストールし、ちょこっと使ったのですが、既にその使用経験は忘却の彼方にあります。
まず、前回モデルの不満事項としては、S, I, Rの3つの関数がバラバラなグラフとして表示されていたことです。前回、参照させていただいた、カシオの計算サイトのtonagai様の投稿モデルの結果のように、1つのグラフに色を変えてS,I,Rの3本の線を表示したい。
次に、登場する定数のBetaとかGammaとか、前回は即値をブロックに入力していました。これは如何にも汚いし、応用がきかない。外のプログラムで設定可能にしておきたい。
さらに、三角の「ゲイン」ブロックを4個ほど使っているのですが、実はXcosのパレットには複数の種類の「ゲイン」ブロックが存在しておりました。たまたま選択したもので意図通りに動いているので、適当に良し、としていたのですが、これが引っかかる。Helpみても違いが分からないし。。。
そのようなモヤモヤを元に前回のブロックダイアグラムに手を入れましたのがこちらでございます。
大差ない、といえば、大差ありません。まず、グラフの表示部分。前回は複数の入力に対応可能なCMSCOPEというブロックを使ったのですが、今回は、CSCOPEという単一入力用のものに取り換えました。しかし、表示しなければならない関数は3つあるので、これをMUXブロックで1本にまとめてからCSCOPEに入力するようにしました。こうすることでCSCOPEの入力は時間に対してベクトル値(3要素)からなるようになります。1個のベクトルには、同じ時刻の、S,I,Rが要素としてはいっておると。こうすることで、以下のような所望のグラフとなりました。
- CSCOPEとか、CMSCOPEとかグラフ用のブロックは、ブロックを置いた数だけウインドウが現れる
- 一つのデータ入力(黒色)は時間に対するベクトル。ベクトルの各要素毎に時系列でグラフ化される。(1要素ならスカラのグラフ)
- 複数の入力を設定すると、一つのウインドウ内に複数のグラフ軸が現れる
といったところです。
さて、2番目は、パラメータをどこか1カ所で、計算可能な形で設定したい、とい言い換えれるかと思います。これができないと条件変えたとき、毎度手入力でシミュレーションをやりなおすことになります。そのためにXcosにはちゃんと用意がありました。
コンテキスト設定
というメニューコマンドです。Scilab言語で初期設定が書けます。開くとこんな感じ。
説明を読んでいただいたらその通りで、記号パラーメータが定義できました。後は、実際に記号パラメータを参照している場所に、BetaとかGammaとか書いてやれば完了。多少は記述が綺麗になりました。
最後の、複数あるゲインブロックですが、Xcosのパレットを開くと、こんな感じでならんでいます。(下の図の三角のブロック)
- GAINBLK_f
- GAINBLK
- GAIN_f
どれも同じに見えるけれど、どう違うの?
これに関して言えば、Scilabの以下のページへ行って、その背景を理解?いたしました。
名前の付け方には歴史的な経緯があるようですが、今となっては、ゲインブロックは皆同じ。どれ使っても同じ動作、のようです。ただ、推奨されるのは
GAINBLK
ということであります。他の2つは非推奨とのこと。
ついでにもう一つ、コンパイラ
Xcosのモジュールの中には、Cで書かれていて、実行時にCコンパイラでコンパイルされて実行されるものがあるのでした。今回のSIRモデルでは登場しませんが、そのうち使うやもしれませぬ。そこで Scilab上でhaveacompiler()関数でしらべたところ、T(真)とでました。今回インストールでは何もしていないのですが、古いバージョンのときの功徳なのか、どうなのか。実際に、Xcos上でちょっとカッコイイアニメーションをするデモを動かしてみたところ、以下のようにコンパイル成功!ちゃんと動きました。
たまには、こういうラッキーなこともあるですか。Cで定義されたブロックをコンパイルして実行可能ということは、自分でも作れる、ということですかね。そのうち、そのうち。。。