Principles of Object-Oriented Modeling and Simulation with Modelica 3.3: A Cyber-Physical Approach
が素晴らしいです!
が素晴らしいです!
PythonとOpenModelicaがリンクできることを知り、簡単なモデルに挑戦してみました。
まずはOpenModelicaをインストールし、以下のフォルダにあるsetup.pyからOMPython libraryを追加します。
続いてModelicaで検証用のサンプルを作成。
単純に1次遅れのモデルを作成し、Python側で遅れ定数を変えたケーススタディを行って、結果をまとめてプロットします。
以下がModelicaのサンプル。
class Lag
Real x(start = 0);
Real t(start = 0);
input Real tau;
input Real inp ;
equation
tau*der(x) = inp-x;
der(t)=1;
end SRKEQ;
非常にシンプルです。
上記をLagSample.moといった形で拡張子.moにして保存し、Python側で読みに行きます。
Python側は以下の通り。
まず、ModelicaSystemをimport⇒作成済のmoファイル中にあるクラスであるLagを読み込む⇒モデル中の変数に値を設定するためにsetInputs関数を使用⇒計算開始はsimulate()関数⇒計算結果の取得はgetSolutions()関数を使う。
[Python] from OMPython import ModelicaSystem lagmodel = ModelicaSystem("LagSample.mo","Lag") lagmodel.setInputs(inp=1) lagmodel.setInputs(tau=1) lagmodel.simulate() x_1,t=lagmodel.getSolutions("x","t") lagmodel.setInputs(tau=2) lagmodel.simulate() x_2,t=lagmodel.getSolutions("x","t") [/Python]
τ=1,2,3[sec]について計算して出力した結果が以下です。
当然のことながら単位ステップを与えた際に、それぞれτ=1,2,3[sec]での出力が1-1/eとなっていることが確認できます。
これだけのモデルだとわざわざModelicaとPythonを連携する意味は無いですが、Modelicaでプロセスモデルを作成して、様々なケーススタディ、計算結果の視覚化、まとめをPythonで行うのは便利で、色々な活用方法がありそうです。
コメント