SDといえばソフトウェアデザイン その3

さて、SDモデルを元に連立方程式を立てれば、あとは計算機がやってくれるところまでできました。

次にやっつけるべきは、モデルから連立方程式を立てる部分でしょうか。

SDモデルを構成する要素というか部品というか、ここでは要素と呼びましょう。カタカナではエレメントです。エレ怖い~。

  1. ストック
  2. フロー
  3. ソース/シンク
  4. 式/定数
  5. 時間関数

こいつらを自動的などの処理に割り当てるか、およびどないな風に処理したらええかをイジッテ・イジッテ・イジリ倒していきましょう。

ストック:
これは、連立方程式の変数にそのまま相当します。つまりストックが5つあるモデルは式が5変数で5つの方程式になります。

方程式は、ストック番号を0~i~n-1として、

dx_i/dt = R_i

と表現します。

フロー:
フローはR_iそのものです。ただし、フローは二つのストックを結びますから、片方のR_iではマイナス符号、もう片方ではプラス符号となるでしょう。え?何を言ってるかわからない?

かっこよく言えば保存則です。

とにかくひとつのフローが、ふたつのストックに関係があるということです。

ソース/シンク:
これは何も処理する必要がありません。モデル全体のつじつま合わせで必要です。具体的にはフローは必ず二つのストックと結ばなければなりませんが、最初と最後はストックがありませんから仮想のストック(ソース/シンク)が必要なのでしょう。
実現するのに何もする必要はありません。モデルの妥当性検査に関係するくらいでしょう。

式/定数:
フローR_iを構成する項です。式や定数は任意の数式で表現可能です。非線形でも構いません。ストックの値を用いる時には、x_iを直接参照できます。
例:

2*x_0 – 3*x_1

こいつを実現するには、簡単な数式処理系が必要となります。まったく面倒なことです。しかも実用的にするには、sin/cosなどの関数をプリミティブとして用意してやらなきゃなりません。するって~と、エラー処理やらえらい大変ですわな。

でもまぁ、関数電卓作ったことあるなら、大したことはありませんやね。変数対応するだけのことで。変数といっても、数値解析ですから、即値で置換できますからね。

時間関数:
これはたとえば、周期的に変動する需要のようなモデルの外部を表現するのに必要です。天候変動とかですね。

式/定数とどこがちがうねん、という貴兄はスルドイ。時間関数はf(t)であって、f(x)ではないのです。つまりxに依存しないんです。じゃぁ式/定数はtを含んでええのかよ、という話になります。さぁどうなんでしょうかね。

実在の表形式のデータを取り込んでモデルを叩いたりするにも、これを使えばいいのかもしれません。「過去の在庫データをモデルに適用した結果、以下のような・・・」なんてカッコヨスギ。

とまぁざっとこんな感じです。ここに書いたルールを意識すれば手書きのモデルから、機械的に方程式を立てられるようになります。

つまり機械的に方程式を求めるプログラムが書けるということですな。こないだ作ったルンゲクッタプログラムと組み合わせるまでもないですな。