モデルの初期化
モデルシミュレーションの開始時には,モデルを初期化する必要がある.初期化では,未知の値について,通常積分問題よりも大きな問題を解くことが関わってくる.例えば,積分問題では,連続時間状態変数すべての導関数について解く必要があるが,初期化問題ではそれらの状態の初期値についても解く必要がある.同様に,離散時間変数については,そのpre値も,fixed=falseのパラメータの値も,初期化問題では未知の値である.
Modelica Specificationへの参照に加えて,背景情報を下に挙げる.Modelicaモデルの初期化問題がどのように定義されるかについての詳細は,Modelica Specificationを参照されたい.モデルの初期化におけるよくある問題にどのように対処するかについてのチュートリアルスタイルのプレゼンテーションは,モデルの初期化のトラブルシューティングを参照されたい.
優決定と劣決定の初期化
System Modelerは,3つの異なる種類の初期化を検知する:
初期化の際に使われる方程式は,すべての通常の方程式とアルゴリズム(方程式と命令文が特別な場合.この詳細については,後述のセクションを参照)に加えて,モデルのすべての初期方程式と初期アルゴリズムである.fixed=trueである任意の変数も1つの方程式として数えられる(fixed属性についてのセクションを参照).
使用される初期化の種類は,モデルの初期化設定による.System Modelerがコンフリクトを見付けず,開始値からどの変数を初期化すべきかを選ばなくてよいので,平衡決定の初期化がモデルの望ましい結果である.
劣決定の初期化では,変数の部分集合に含まれる方程式の数が少なすぎるので,System Modelerは開始値からどの変数を初期化するかを選ばなければならない.この初期化では,Simulation Centerの「ビルドログ」に通知が表示され,System Modelerがどの変数を選んだかを見ることができる.
優決定の初期化では,初期化問題における変数の部分集合は,変数よりも多い数の方程式によって決定される.これは,余分な方程式が他の方程式と一貫性を持っている場合に削除することによって,過剰の方程式が削除できる場合にだけ可能である.この初期化では,Simulation Centerの「ビルドログ」で警告が発せられる.優決定の初期化は使わず,この問題があるモデルの修正を行うことが推奨される.
劣決定あるいは優決定は初期化問題における変数の部分集合の特性であるので,モデルが劣決定の部分と優決定の部分の両方を含むということもあり得る.
Start属性
Start属性(事前定義されたすべてのModelicaタイプの属性.例えば,Realを参照)は,2つのことに使われる.変数を厳密にその値で初期化するために使う,あるいは推測値として使う(例えば,変数が非線形系で解かれた場合)ことができる.startが帰すると考えられる変数とそれらがどのように使われるかについては,SimulationCenterの変数タブで見ることができる.
変数に対してstart属性を指定しないと,変数はそのタイプによって異なるデフォルトのデフォルト値(Realは0.0, Integerは0,Booleanはfalse )を持つが,明示的に属性を提供すると,デフォルトに頼るよりも強い効果がある..
モデルが劣決定の初期化を行う場合には,方程式の数が足りないので,System Modelerはその開始値から初期化する変数を選ばなければならない.System Modelerは,モデルの方程式構造から判断して,どの変数がstart属性から初期化できるかをチェックして,最も適切だと判断された変数を選ぶ.System Modelerは,明示的に指定されたstart値を持つ変数がより適切であり,状態が他の変数よりも適切であると考える.モデルAでは, System Modelerはxをそのstart属性に初期化することを選択する.
model A
Real x(start = 1);
equation
der(x) = -x + 1;
end A;
start属性が推測値として使われる場合,希望する解を得ることができる.z=2とz=3の2つの解を持つ方程式z2-6=zについて考えてみよう.B1とB2のモデルを見れば,startの設定によって,異なる解になることが分かる.
model B1
Real z(start = 4);
equation
z^2 = 6 - z;
end B1;
model B2
Real z(start = -5);
equation
z^2 = 6 - z;
end B2;
初期の方程式とアルゴリズム
開始時に変数値を設定する最も基本的な方法は,初期方程式か初期アルゴリズムを使う方法である.
model C
Real x;
initial equation
x = 1;
equation
der(x) = -x + 1;
end C;
モデルCでは, xは常に1に等しい値で始まるが,モデルAでは,xの開始値はSimulationCenterの変数タブから簡単に変更できる.修正で初期方程式のセクションを変更することはできない.初期方程式セクションはある意味でstart属性よりも強力である.完全な方程式を使って初期の制約条件を表現することができるからである.例えば,モデルDでは,der(x)=0が初期方程式として使われているので,変数xは定常状態で始まる.
model D
Real x;
Real y(start = 3);
initial equation
der(x) = 0;
equation
der(x) = -x + y + 1;
der(y) = -y +2;
end D;
Fixed属性
fixed属性(Modelicaの指定を参照) を変数の宣言に追加して,変数が厳密にそのstart属性で初期化されるようにすることができる.これは,初期方程式を追加することと同じ効果がある.しかし,fixed=trueが使われ,start値が直定数である場合には,シミュレーションが構築された後,SimulationCenterの変数タブでその値を変更することができる.以下のHelloWorldとHelloWorldInitialEquationの例はその違いを示す.
model HelloWorld
Real x(fixed = true, start = 1.0);
equation
der(x) = -x;
end HelloWorld;
model HelloWorldInitialEquation
Real x;
initial equation
x = 1.0;
equation
der(x) = -x;
end HelloWorldInitialEquation;
パラメータについては,fixed=falseと設定して,パラメータが提供された初期方程式や初期アルゴリズムとは別に計算すべきであることを示すことができる.HelloWorldParameterのモデルでは,指数減衰定数が初期化の際に計算されるパラメータである.ここでは,xの開始値の2倍の値である.
model HelloWorldParameter
Real x(start = 1.0, fixed = true);
parameter Real k(fixed = false);
initial equation
k = 2*x;
equation
x = -k*der(x);
end HelloWorldParameter;
Whenの節と初期化
Whenの方程式と命令文は,初期化の際に特別の規則を持つ.whenの節は,条件の一つが initial()である場合には,初期化中のみアクティブである.したがって,initial()を持たないwhenの方程式と命令文については,割り当てられた変数に対して,初期方程式を加える必要があることもある.
model WhenExample
Integer x;
equation
when sample(2.01, 5.0) then
x = 1;
elsewhen sample(0.5, 0.1) then
x = pre(x) + 1;
end when;
end WhenExample;
モデルWhenExampleでは,System Modelerは,初期化が劣決定であり,xがそのstart(Integerのデフォルト値が0である)から初期化することが選択されていることを示す.
model WhenExampleInitial
Integer x;
equation
when {initial(), sample(2.01, 5.0)} then
x = 1;
elsewhen sample(0.5, 0.1) then
x = pre(x) + 1;
end when;
end WhenExampleInitial;
モデルWhenExampleInitialでは,initial()を最初のwhenの条件リストに加えることで,劣決定の初期化が修正されている.初期方程式を追加するか,fixed=trueをxの宣言に追加するかすることによっても,修正が可能である.