JuliaでModelicaライクなシミュレーション
今回はJuliaのパッケージ"Modia.jl"を使用してModelicaのような非因果モデリングでシミュレーションしてみます。
Modelicaについては以前の記事を参照してください。
Modia.jlについて
Modia.jlはJulia言語による方程式ベースのシステムモデリング環境です。作者はModelicaを使用した経験をもとにこのライブラリを制作しており、Modelicaと非常に似た作りになっています。
https://modiasim.github.io/Modia.jl/slides/Systems-Modeling-and-Programming-Slides.pdf
https://modiasim.github.io/Modia.jl/slides/Modia-JuliaCon-2017.pdf
ModelicaではなくあえてModiaを使う理由として制作者は以下の点を挙げています。
- Modelicaの言語としての発展速度が衰えてきている。
- Modelicaの言語仕様は膨大で理解が難しい
- Modelicaはデータの取り扱いをはじめとしたアルゴリズム部分が弱い
Juliaは元から科学計算用に開発された高速な言語で今後も発展性が期待できるためこちらに乗り換えたほうが良いということでしょうか。
方程式ベースでモデリングできる点はモデリング時の式変形の負荷が少なく素晴らしいので試してみます。
実装
Modia.jlで捕食者ー非捕食者モデルのシミュレーションをしてみます。
$$\frac{dx}{dt}=x+y$$ $$\frac{dy}{dt}=-x+y$$ $$x………捕食者の個体数$$ $$y………非捕食者の個体数$$ $$初期値を下記のように仮定する。$$ $$x(0)=y(0)=1000$$
juliaでのコードは下記になります。
using Modia using Plots @model FirstOrder begin x = Variable(start=1000) # start means x(0) y = Variable(start=1000) # start means y(0) @equations begin der(x) = x + y # der() means time derivative der(y) = -x + y end end; result = simulate(FirstOrder, 1) # 1秒でシミュレーション停止 t=result["time"] x=result["x"] y=result["y"] plot(t,x,label="x") plot!(t,y,label="y")
グラフは以下のようになります。
本来なら描画にはModiaMath.plotを使うのですが、これにはPyPlotが必要でかつ今回の環境ではPyPlotがうまくインストールできなかったので代用としてPlotsを使用しました。 方程式ベースでシミュレーションできています。プログラムの書き方もModelicaとそっくりに見えますね。
なお、Modelicaで実装したコードは下記になります。
model TEST Real x (start = 1000); Real y (start = 1000); equation der (x) = x + y ; der(y) = -x + y ; end TEST ;
さらにこのプログラムをコンパイルして実行するには下記の命令が必要です。
simulate(TEST, stopTime=1)
最後に結果をプロットします。
plot({x,y})
結果は下図のようになります。
計算結果は同じですね。
今回はここまでにします。