Func void main() { Real dt; Matrix x0; Array TC, XC, UC; Matrix diff_eqs(), link_eqs(); dt = 0.01; x0 = [1 1 1]'; // 初期状態 {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というファイルに書き出されます。ファイルの出力形式は転置し てから出力されますので,ファイルの中では列毎に各成分が並びます。