Dsl (Digital Simulation Library) for .Net

Dsl では「変数間の因果関係」と「実際の計算式」を分けて定義します。つまり、「因果関係」と「実際の計算式」は別々にプログラミングされます。

このトピックスは以下のセクションを含みます。

因果関係の定義

「変数間の因果関係」とは単純に左辺変数と右辺変数の関係です。 グラフ処理は「変数間の因果関係」のみを扱います。

左辺(Y)と右辺(X1,X2)のグラフ表現
例えば、上図の Y = f(X1,X2) という関数関係は、因果関係でいえば「Y は X1 と X2 から計算される」ということで、 「どのように計算」されるかは問いません(実際の計算式がグラフ処理時に参照されることはありません)。

プログラミングでは

 コピー イメージコードをコピー
// 因果関係 Y = f(X1,X2) の定義
Processor pr = new Processor();
Variable Y = new Variable(pr,"Y");  // Variable Y を作成すると同時に Processor pr に Y を登録します。
Variable X1= new Variable(pr,"X1"); //  同上
Variable X2= new Variable(pr,"X2"); //  同上
Y.SetRightSideVariables(X1,X2);     // SetRightSideVariables() で Y の右辺に X1 と X2 を設定。
という形で定義されます。

参照:SetRightSideVariables(array<Variable>[]()[][])ProcessorVariable

先頭へ

計算式の定義

もちろん、実際に計算しなければ意味がないので、例えば「Y = X1 + X2」という計算式ならば

 コピー イメージコードをコピー
// f(X1,X2) の定義(delegate で計算式を定義する)
Y.ComputeValueAt = delegate(Processor pr, Variable self,double time,double step)
{
   List<Variable> rhsvs = self.RightSideVariables; // selfは Y、rhsvsは Y の右辺変数の配列。
   return rhsvs[0].Value + rhsvs[1].Value; // X1 + X2 の値を返す( rhsvs[0]は X1、rhsvs[1]は X2)。
};
と定義されます。 Y.ComputeValueAt() はグラフ処理(計算順序決定などの処理)ではなく、実際の計算段階で実行されます。 右辺変数の配列要素はY.SetRightSideVariables(X1,X2)の引数の順に設定されます。

Y = f(X1,X2) の計算をいつ実行するのかは Processor が決定し、Y の値が必要な時に Processor が Y.ComputeValueAt() を呼び出し、Y の Value プロパティに計算値を代入します。

Y の値を計算するには、X1 と X2 の値が確定していなければなりません。 そして X1 または X2 が別な変数から計算されるのなら、さらに右辺変数の右辺変数を辿って...と計算順序は決められていきます。

注意事項:

Processor が計算実行中に、利用者が、変数の Value プロパティに値を代入してはいけません(予期せぬ結果が生ずる可能性があります)。

参照:OnComputeValueAt(Processor, Variable, Double, Double)

先頭へ

Processor に登録

実際のグラフ処理や計算の実行は Processor オブジェクトが実行しますので、 作成した Variable は Processor オブジェクトに登録する必要があります(登録しないと予測できない結果になります)。 登録にはいくつかの方法がありますが、以下のように Variable 作成と同時に登録する方法をお奨めします。

 コピー イメージコードをコピー
// 作成した Variable を登録する。
Processor pr = new Processor("Test"); // Processorオブジェクトの作成(名前は"Test")
Variable Y = new Variable(pr,"Y"); // Y を作成すると同時に Processor に登録します。
その他の方法については Processor のメソッドを参照してください。

計算順序、連立方程式、常微分方程式の組み立てと計算の実行は

 コピー イメージコードをコピー
// 計算順序や連立方程式の組み立て等のグラフ処理を実行する。
if (gr.DeterminateOrder() == RESULT.OK)
{
   // グラフ処理が成功すれば、シミュレーション計算を開始する。
   gr.Run(0.0, 2.0, 0.01);
}
のように、 Processor オブジェクトの DeterminateOrder()()()()Run()()()() メソッドを用います(詳細は後述)。

先頭へ

参照

先頭へ