Func void main() { Real dt; Matrix x0; Array TC, XC, UC; Matrix diff_eqs(), link_eqs(); dt = 0.01; x0 = [1 1 1]'; // Initial State {TC, XC, UC} = Ode(0.0, 5.0, x0, diff_eqs, link_eqs); print [[TC][XC][UC]] >> "cont.mat" }
Func Matrix diff_eqs(t, x, u) Real t; Matrix x, u; { Matrix dx, A, b; A = [[ 0, 1, 0] [ 0, 0, 1] [-2, -3, -4]]; b = [0 0 1]'; dx = A * x + b * u; return dx; }
Func Matrix link_eqs(t, x) Real t; Matrix x; { Matrix u, f; f = [ -1, -1, -1]; u = f * x; return u; }
関連する変数としては,状態x,入力u,時間t,状 態の微分dxとが必要です。これらは関連関数の link_eqs, diff_eqsに必要です。
積分関数(Odeなど)は基本的に引数として5個必ずとります。最初 から開始時間,終了時間,初期状態,diff_eqs,link_eqs となります。
このdiff_eqsはシステムの状態の微分値を返す関数です。言い変え れば, 時間tと状態xと入力uから, 状態の微分dxを返す関数のことです。それぞれの変数はdiff_eqsの引 数の欄を書き換えると,変えることが出来ます。例えば Ode(0.0, 5.0, x0, diff, link)と書くならば, diff, linkというのがそれぞれの関数となります。
diff_eqsの型がMatrixであることに注意して下さい。 diff_eqsの引数の3つが重要です。 それぞれの変数はOdeが渡していると思って下さい。
link_eqsはシステムへの入力を返す関数です。言い変えれば, 時間tと状態xからシステムへの入力uを決める 関数のことです。link_eqsの型もMatrixです。このlink_eqsの2つの引数もOdeが渡していると思って構いません。
Odeの返す値は例をみると{TC, XC, UC}となっています。こ れはArrayで宣言されていますが,それぞれ,時間,状態,入力の時 系列データとなっています。したがって,最後の文の
print [[TC][XC][UC]] >> "cont.mat"では3個の状態と1個の入力を持つシステムなので,1行目に時間が,2行目 から5行目までに状態が,6行目に入力があるデータが行列としてcont.matというファイルに書き出されます。ファイルの出力形式は転置し てから出力されますので,ファイルの中では列毎に各成分が並びます。