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