システムとモデリング

SysML, Matlab/Simulink,他モデリング全般について。たまにプロジェクトマネジメント。

Modelicaプログラミング練習その2

こんにちは!Otepipiです。今回もModelicaを使ってプログラミングしていきたいと思います。 Modelicaの特徴である非因果的モデルを実装していきます。

例題としては下記教科書の、流通式完全混合槽モデルを作成していきたいと思います。

モデリング対象は下の流通式完全混合槽で、槽内の物質Aの濃度はシミュレーション開始時は0です。

f:id:Otepipi:20180224104814p:plain

シミュレーション開始時に流入してくる物質A濃度CAが0から1にステップ応答した場合の槽内物質A濃度Cの経時変化を求めます。 (槽内濃度ははじめは0ですが、時間が経つにつれ1に近づいていくことは直感的にわかります) 今回の対象を数理モデル化するには、物質Aについて物質収支の考え方を用います。

混合槽内の物質Aの変化量 = 流入する物質Aの量 ー 流出する物質Aの量 より

$$V \frac{dC}{dt}=F \times CA - F \times C$$

この基礎式をModelicaで実装します。

model example1

//流通式完全混合槽内ステップ応答;
Real C (start=0, unit="mol/m3") ; //混合槽内温度
parameter Real V(unit="m3")= 10;//混合槽体積
parameter Real F(unit = "m3/s") =1;//流量
parameter Real CA(unit = "mol/m3")=1; //流入濃度

equation
V*der(C) =  F * CA - F * C;


end example1;

これは非因果的モデルで記述されています。今求めたいのは混合槽内の濃度Cですが コードのどこにも" C=……" といった記述はありません。このように出力Cを明確に規定しなくても コンパイル時に判断してCを求めてくれます。そのため基礎式の形を保ったままコーティングすることが可能です。 これが非因果的モデリングの大きなメリットです。

結果として下のようなグラフが得られます。

f:id:Otepipi:20180224111150p:plain

また、非因果的モデルを構築していますので、先程のコードからC以外の値も求めることができます。 例としてCの時間微分der(C)を求めてみます。

f:id:Otepipi:20180224111429p:plain

このようにプロットできます。