関数main()はパラメータと初期状態を設定して シミュレーションを行ない,結果をファイルcont.matに保存する。 diff_eqs()は動的要素の微分方程式を記述するための関数であり, link_eqs()は動的要素の接続関係を記述するための関数である。
関数Ode45Auto()とOde45HybridAuto()は陽の非線形関数の積分を行なう。 関数Ode45Auto()は連続時間制御のシュミレーションを行ない, 関数Ode45HybridAuto()はサンプル値系(ディジタルコントローラ による連続時間プラントの制御)のシュミレーションを行なう。
関数Ode45Auto()は,5個の引数をとる。
引数は,初期時刻(0.0),最終時刻
(5.0),初期状態ベクトル(x0),
微分係数ベクトル(dx)を計算する関数の参照(diff_eqs),
入力ベクトル(u)を計算する関数の参照(link_eqs)の5個である。
関数Ode45HybridAuto()は,上述の5個の引数に加えて,
一定入力(u)がプラントに与え続けられるサンプリング時間(dt)を
引数にとる。
微分係数ベクトルを計算する関数diff_eqs()と入力ベクトルを計算する関数
link_eqs()は,特別なフォーマットでなければならない。
関数diff_eqs()は4個の引数を持つ。
第1引数(dx)は,微分係数ベクトルを返すために使われ,状態ベクトル
(x)と同じ次元である。第2引数(t)は,現時刻を表す実数である。
第3引数(x)は,現時刻の状態ベクトルであり,第4引数(u)は,
動的要素への入力ベクトルである。
関数link_eqs()は3個の引数を持つ。
第1引数(u)は,入力ベクトルを返すために使われる。
第2引数(t)は,現時刻を表す実数である。
第3引数(x)は,現時刻の状態ベクトルである。
Func void main()
{
Real dt;
Matrix x0;
Array TC, XC, UC, TH, XH, UH;
void diff_eqs(), link_eqs();
dt = 0.01; // サンプリング時間
x0 = [1 1 1]'; // 初期状態
{TC,XC,UC} = Ode45Auto(0.0, 5.0, x0, diff_eqs, link_eqs);
x0 = [1 1 1]'; // 初期状態
{TH,XH,UH} =
Ode45HybridAuto(0.0, 5.0, dt, x0, diff_eqs, link_eqs);
print [[TC][XC][UC]] >> "cont.mat";
print [[TH][XH][UH]] >> "hybd.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;
}