Python + OpenModelicaでプロセスシミュレーションのケーススタディ

Pocket

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で行うのは便利で、色々な活用方法がありそうです。

Pocket

コメント

タイトルとURLをコピーしました