システムとモデリング

エンジニアリング, DSM, Julia, SysML, Matlab/Simulink,他モデリング全般について。

JuliaでModelicaライクなシミュレーション

今回はJuliaのパッケージ"Modia.jl"を使用してModelicaのような非因果モデリングでシミュレーションしてみます。

Modelicaについては以前の記事を参照してください。

otepipi.hatenablog.com

Modia.jlについて

Modia.jlはJulia言語による方程式ベースのシステムモデリング環境です。作者はModelicaを使用した経験をもとにこのライブラリを制作しており、Modelicaと非常に似た作りになっています。

github.com

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")

グラフは以下のようになります。 f:id:Otepipi:20190210125211p:plain

本来なら描画には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})

結果は下図のようになります。 f:id:Otepipi:20180221194825p:plain

計算結果は同じですね。

今回はここまでにします。