Dsl では「変数間の因果関係」と「実際の計算式」を分けて定義します。つまり、「因果関係」と「実際の計算式」は別々にプログラミングされます。
このトピックスは以下のセクションを含みます。
因果関係の定義
「変数間の因果関係」とは単純に左辺変数と右辺変数の関係です。 グラフ処理は「変数間の因果関係」のみを扱います。
例えば、上図の 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>[]()[][])、Processor、Variable
先頭へ計算式の定義
もちろん、実際に計算しなければ意味がないので、例えば「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 = 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 に登録します。 |
計算順序、連立方程式、常微分方程式の組み立てと計算の実行は
コードをコピー | |
---|---|
// 計算順序や連立方程式の組み立て等のグラフ処理を実行する。 if (gr.DeterminateOrder() == RESULT.OK) { // グラフ処理が成功すれば、シミュレーション計算を開始する。 gr.Run(0.0, 2.0, 0.01); } |