WOLFRAM

モデルの初期化

優決定と劣決定の初期化Fixed属性
Start属性Whenの節と初期化
初期の方程式とアルゴリズム

モデルシミュレーションの開始時には,モデルを初期化する必要がある.初期化では,未知の値について,通常積分問題よりも大きな問題を解くことが関わってくる.例えば,積分問題では,連続時間状態変数すべての導関数について解く必要があるが,初期化問題ではそれらの状態の初期値についても解く必要がある.同様に,離散時間変数については,そのpre値も,fixed=falseのパラメータの値も,初期化問題では未知の値である.

Modelica Specificationへの参照に加えて,背景情報を下に挙げる.Modelicaモデルの初期化問題がどのように定義されるかについての詳細は,Modelica Specificationを参照されたい.モデルの初期化におけるよくある問題にどのように対処するかについてのチュートリアルスタイルのプレゼンテーションは,モデルの初期化のトラブルシューティングを参照されたい.

優決定と劣決定の初期化

System Modelerは,3つの異なる種類の初期化を検知する:

Start属性

Start属性(事前定義されたすべてのModelicaタイプの属性.例えば,Realを参照)は,2つのことに使われる.変数を厳密にその値で初期化するために使う,あるいは推測値として使う(例えば,変数が非線形系で解かれた場合)ことができる.startが帰すると考えられる変数とそれらがどのように使われるかについては,SimulationCenterの変数タブで見ることができる.

変数に対してstart属性を指定しないと,変数はそのタイプによって異なるデフォルトのデフォルト値(Realは0.0, Integerは0,Booleanfalse )を持つが,明示的に属性を提供すると,デフォルトに頼るよりも強い効果がある..

モデルが劣決定の初期化を行う場合には,方程式の数が足りないので,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=2z=3の2つの解を持つ方程式z2-6=zについて考えてみよう.B1B2のモデルを見れば,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の変数タブでその値を変更することができる.以下のHelloWorldHelloWorldInitialEquationの例はその違いを示す.

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がそのstartIntegerのデフォルト値が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=truexの宣言に追加するかすることによっても,修正が可能である.