Modelica

Modelica（モデリカ）とは、オブジェクト指向のマルチドメイン・モデリング言語である。多分野に跨る複雑なシステム（例えば、機械、電気、電子、油圧、熱、制御、電力、プロセス指向のサブコンポーネントを含むシステム）のモデリングに適しており、特に物理現象を表現するモデルの構築で使われている。
オープンソースである為、特定のツールに依存することなく資産の共有や開発が出来る。言語仕様やメンテナンスは非営利国際組織のModelica協会によって行われており、標準ライブラリとしてフリーで公開されている。
特徴.
Modelicaはオブジェクト指向プログラミング言語（例えば、C++またはJava）と似ている点があるが、次の2点において顕著に異なる。
まず、Modelicaはプログラミング言語というよりはモデリング言語である。Modelicaで作成されたモデルは、普通にコンパイルされるのではなく、シミュレーションエンジンで解釈できるよう翻訳される。つまりシミュレーションエンジンは実行の順序を決定する為に、式を操作する事がある（シンボリック処理）。
次に、モデルの作成では、プログラミング言語に類似した予約語を含むアルゴリズムのコンポーネントが含まれているかもしれないが、主にモデルの表現においては方程式とのセットで構成される。
典型的な代入文は、以下のように表現する。下記式では、左辺(x)に右辺の式(2+y)から算出された値が代入される。
x := 2+y;
方程式を表現するには、以下のように表現する。下記式では、左辺と右辺の式が等しいことを表現する。
f = m * a;
歴史.
Modelicaの構想･設計は1996年9月にHilding Elmqvist氏より考案され、1997年9月にModelica仕様ver1.0がリリースされた。これをベースにプロトタイプ版の商用ソフトウェア に実装され、2000年にはModelica言語とフリーのModelica標準ライブラリの発展を管理する為に、非営利国際組織のModelica協会が設立された。
ライブラリ.
Modelica協会では、Molelica標準ライブラリ(MSL:Modelica Standard Library)をはじめ、フリーのライブラリを公開している。標準ライブラリやフリーのライブラリのほとんどは、Modelicaのライセンスに基づいて商用製品に使用できる。
実装.
Modelicaをシミュレーションする環境ツール（商用・フリー）としては、CATIA Systems、Dymola、LMS AMESim、JModelica、、MathModelica、、、がある。
サンプル.
下記に単純な formula_1 システムを表現したサンプルモデルを示す。
model FirstOrder
 parameter Real c=1 "Time constant";
 Real x "An unknown";
equation
 der(x) = -c*x "A first order differential equation";
end FirstOrder;
この例では、'parameter'修飾子を使用し変数が時不変であることを示し、'der'演算子で変数の微分を表現する。
Modelicaは主に物理領域システムを表現する為に設計された。以下に電気ドメインを例に基本構築概念を示す。
ユーザー定義の派生型.
modelicaでは4つのタイプ(Real,Integer,Boolean,String)の組込み型を持っている。ユーザー定義型は関連付ける物理量、単位、公称値とで他の属性を派生させられる。
type Voltage = Real(quantity="ElectricalPotential", unit="V");
type Current = Real(quantity="ElectricalCurrent", unit="A");
コネクタの定義.
他のコンポーネントとコンポーネントの相互作用は、物理ポートと呼ばれるコネクタなどで定義されている。例えば、電気端子の場合は以下のように定義される。
connector Pin "Electrical pin"
 Voltage v "Potential at the pin";
 flow Current i "Current flowing into the component";
end Pin;
接頭辞に"flow"が定義されている変数（ここでは変数:i）はフロー変数と呼ばれ、コネクタ変数の合計値がゼロに定義される。
基本モデルコンポーネント.
基本的なモデルコンポーネントは、モデルによって定義されており、コネクタ変数と関係を定義した方程式とで構成されている。途中経過の計算式を記載する必要はない。
model Capacitor
 parameter Capacitance C;
 Voltage u "Voltage drop between pin_p and pin_n";
 Pin pin_p, pin_n;
equation
 0 = pin_p.i + pin_n.i;
 u = pin_p.v - pin_n.v;
 C * der(u) = pin_p.i;
end Capacitor;