前回は、「OpenModelicaのモデリングの心を学ぶべく」などと書きながら、OMNotebookのウインドウ性懲りもねー、とブー垂れて終わっておりました。ま、それでも付き合っていれば、段々分かってくることもあります。どうも普通のプログラム言語のイメージが、OpenModelicaのコードを理解するときの妨げになっていた、ということにふと気がついたんであります。
※「忘却の微分方程式」投稿順 index はこちら
シリーズタイトルにしておりますように、OpenModelicaで解くモデルというものは、多くは微分方程式で記述されているようなシステム、なんであります。しかし「普通の」代数方程式も当然解ける。ついでに言えば、
小学生の鶴亀算が解けないことはない
筈であります。日本語の問題を入力して解を得るとなるとまた別な世界の課題ですが、こっそり連立方程式にすればOpenModelicaで解けないことはない。例えば、
- 鶴と亀の足の数を足したら12
- 鶴と亀の頭の数を足したら4
鶴は2.0羽、亀は2.0匹などと浮動小数で求めてしまった上に、鶴の数の「プロット」などまで描いてしまいました。鶴の数をプロットしたって2匹に決まっておるやんけ、ボケー!
しかし、ここにこそOpenModelicaの「心」があるように思うんであります。変数の値を読み取るval()関数、上の例では引数は一つですが、本来は、
val(Tsuru, 0.2)
などと書くべきなのです。第2引数の0.2は時刻。「普通の」プログラミング言語用に「固まった」頭では、
Real Tsuru;
などと書くと、浮動小数点型の変数Tsuruと思ってしまうのですが、さにあらず。それは「時系列データ」と呼ぶべきものです。シミュレーションには時間の概念があり、時間に対する値が求まってくるのでした。代数方程式ならば時刻0で値が決まり、その後はフラットになってしまうにせよ。実際にOMNotebookの上で動かしてみたコードはこちら。
鶴と亀、初期値は1で動かして解を求めておりました。一度決まれば後はそのまま。
まずは「変数宣言」するときに、これは時系列データなんだ、と肝に銘ずる、というのが最初の「心」でしょうかね。まあ、MATLAB/simulinkとか、Scilab/xcosとか、GUIでブロック線図を描くときには「この結線の中を時系列データがながれる」イメージを持ちやすいです。ついつい、言語記述すると忘れてしまう。。。
しかしね、普通のプログラミング言語における変数みたいな挙動をするものがないわけじゃないのでした。
このようにした X は何処で呼び出そうと、ちゃんと値3が返ってきます。ところが、こういう書き方するとエラーです。
つまり、
Pascal風の := なら「代入」、= は「等号」
であります。右辺と左辺が「釣り合う」方程式なら=で書けるけれども、代入するのならば違う、と。このことはモデリングのやり方をも2分していて、
- Equation
- Algorithm
この2つのセクションがモデルの中に現れてくるのでした。上記の例は、Equationの例になります。Equationは宣言的なモデリング。=記号を使って書き表した方程式(微分方程式やら、代数方程式やら)をセクションの中に置く。それに対してAlgorithmというのは、「手順」を記述するもの。代入の:=記号を使う。if then elseやらforやら御馴染みの奴らが登場する、と。勿論、2つの「ハイブリッド」なモデルなどというスタイルもあり、数学同様 Function などというものも登場するのでした。
次回は、Algorithmのスタイルだな。