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というファイルに書き出されます。ファイルの出力形式は転置し てから出力されますので,ファイルの中では列毎に各成分が並びます。