WOLFRAM

状態とイベント

状態一般的なアドバイス
イベント

連続時間状態とイベント処理の役割は,モデリングにおいて重要な部分を占める.以下では,これらがSystem Modelerでどのように処理されるかについて,System Modelerで作業する際に気を付けなければならない一般的な注意事項とともに,説明する.

状態

System Modelerでは,状態は,数値積分で計算されるようにSystem Modelerによって選ばれる変数である.これが起るには, System Modelerは変数の導関数について方程式がなければならない.しかし,モデルで導関数が発生する変数がどれも状態になるわけではない.シミュレーションの安定性のために,System Modelerは,一定数の変数が状態になるように選ぶ.これらの変数は,ある意味で,シミュレーションを動かす変数だと見なすことができる.

微分されるが,状態として選ばれない変数は,数値積分以外の方法でその実際の値が計算される.System Modelerはまた,モデルの変換中に,もとのモデルには存在しなかった新たな導関数を導入することもあり,新たに微分された変数が状態として選ばれることも可能である.

System Modelerは,「指数減少」という手法を使い,確立された数値メソッドを使って積分できる常微分方程式を得る.これは,選ばれた方程式一式を微分することによって行う.どの方程式が微分されるかは,オプション変換で「指数減少」のログをオンにすることによって見ることができる.同じウィンドウで「選択された状態」のログをオンにすることもできる.「指数減少」のログと「選択された状態」のログは,Simulation Centerのビルドログタブで見ることができる.

動的状態選択

System Modelerがモデルの変換中に適切な状態の集合を見付けることができないこともある.その場合,いくつかの状態の候補が選ばれ,シミュレーション時にどの変数を状態にすべきかが決定される.このことは,1つの状態がシミュレーションの一部で使われ,別の状態がシミュレーションの別の部分で使われるということもあることを意味する.これは「動的状態選択」と呼ばれる. 動的状態選択が選ぶことができる変数の候補は「動的状態」と呼ばれ,動的ではない状態は「静的状態」と呼ばれる.

モデルによっては,動的状態選択が必要なものもある.Pendulumのモデルの例がそうである.他のモデルについても,必要ではなくても,System Modelerが動的状態選択を使う場合もある.そのようなモデルについては,以下で説明するように,stateSelect属性で何を選ぶかをSystem Modelerにヒントとして与えることもできる.

model Pendulum
parameter Real m = 1;
parameter Real L = 1;
parameter Real g = 9.82;
Real vx;
Real vy;
Real F;
Real x(start = L / sqrt(2));
Real y(start = L / sqrt(2));
equation
m * der(vx) = -(x / L) * F;
m * der(vy) = -(y / L) * F - m * g;
x * x + y * y = L * L;
der(x) = vx;
der(y) = vy;
end Pendulum;

「選択された状態」のログがオンになっている場合には,ログに静的状態とは別に,動的状態の候補が含まれ,候補から実際にいくつの状態が選ばれたのかが表示される.Pendulumモデルでは,System Modelerはvyvxの候補から1つの状態を,そしてyxの候補から1つの状態を選ぶ.

Simulation Centerオプションの動的状態の変更について「出力のデバッグ」をオンにすると,シミュレーション中にいつモデルが切り替わるかを見ることができる.メッセージは「シミュレーションログ」タブに表示される.Pendulumモデルで選択された状態は,10秒のシミュレーションの間に数回切り換ることが分かる.

StateSelect属性

ある変数が静的状態として適することが分かっている場合には,stateSelect=StateSelect.alwaysを修飾子として変数の宣言に加えることができる.こうすると,System Modelerがチェックを行わずに,その変数を静的状態として選ぶ.モデルForceStateでは,System Modelerは1つの状態を選択する必要があり,StateSelect.alwaysを使ってSystem Modelerにxの選択を強制している.

model ForceState
Real x(stateSelect = StateSelect.always);
Real y;
initial equation
y = 1.0;
equation
x - y = sin(time);
der(x) + der(y) = 1.0;
end ForceState;

stateSelect=StateSelect.preferを追加して,System Modelerにどの変数がおそらく適切な状態であることを示唆することもできる.これを使って,動的状態の候補を減らすこともできる.動的状態選択を利用するモデルがあり,それがあまりにも多くの候補から選択を行うという場合には,選択すべき変数の集合にStateSelect.preferを設定することで,選択範囲を狭めることができる.

Reinit演算子

reinit演算子をwhen方程式内で使って,when条件が起るときの状態の値を変更することができる.モデルSawtoothは,それを示す簡単な例である.再度初期化されている変数は状態でなければならないので,そのような変数は陰的にStateSelect.alwaysの設定を持つ.

model Sawtooth
Real x;
initial equation
x = 0.0;
equation
der(x) = 1.0;
when sample(1.0, 1.0) then
reinit(x, 0.0);
end when;
end Sawtooth;

イベント

イベントはシミュレーション中,例えば,if方程式のブール式がその値を変更するときに,生成される.イベントが起ると,ソルバが停止し,反復適用されてイベントの厳密な時点を求める.これらの反復には時間がかかるので,可能であれば,最小限にとどめることが望ましい.

不要な反復を避ける1つの方法に,組込みの演算子noEventを使って,ソルバにイベント生成が必要ではないことを示唆することがある.

model EventTest
Real x1;
Real x2;
equation
x1 = if time < 3 then time else 3 "Event generated at time = 3";
x2 = noEvent(if time < 5 then 4 else 5) "No event generated at time = 5";
annotation(experiment(Interval = 2));
end EventTest;

noEvent演算子は,不法な評価から守るためにも使える.次の例では,sin(x)/xが計算される.ゼロで割られることがないように,noEventabs(x)>0で使い,x=0のときにsin(x)/xが評価されないようにする.

model GuardEval
Real x;
Real y;
equation
x = time - 1;
y = if noEvent(abs(x) > 0) then sin(x) / x else 1;
end GuardEval;

一般的なアドバイス

以下に,よくある問題を避けるのに役立つかも知れない一般的なヒントを挙げる.