ここでは,制御対象と制御器のパラメータを大域変数として宣言する プログラムとパラメータを静的な局所変数として宣言するプログラムを 示す。
ファイルから読み込みやキーボードから入力でパラメータを変更しながら シミュレーションを繰り返す場合は,大域変数を用いる方が都合が良い。 しかし,大域変数はプログラム中の任意の場所で修正される可能性が あり,変数名が衝突するなどの問題があるので, 大規模なプログラムには用いない方が良い。 一方,静的変数はそれが定義された関数内でのみ有効なので,他の関数 の局所変数や大域変数と衝突することがないので大規模プログラムに 有効である。
Matrix Ap, bp, cp; // 制御対象のパラメータ Matrxi Ac, bc, cc, dc; // 制御器のパラメータ Func void init_params() { // 制御対象のパラメータ Ap = [[0 1] [2 1]]; bp = [0 1]'; cp = [-1, 1]; // 制御器のパラメータ Ac = [5]; bc = [1]; cc = [54]; dc = [9]; } Func void main() { Matrix x0; Array TC, XC, UC; void diff_eqs(), link_eqs(), init_params(); init_params(); x0 = [1 0 0]'; {TC, XC, UC} = Ode45Auto(0.0, 20.0, x0, diff_eqs, link_eqs); print [[TC][XC][UC]] >> "cont.mat"; }
Func void diff_eqs(DX, t, X, UY) Real t; Matrix X, DX, UY; { Matrix dxp, dxc, xp, xc, up, uc; xp = X(1:2,1); // 制御対象の状態 xc = X(3:3,1); // 制御器の状態 up = UY(1:1,1); // 制御対象への入力 uc = UY(2:2,1); // 制御器への入力 dxp = Ap*xp + bp*up; // 制御対象の状態方程式 dxc = Ac*xc + bc*uc; // 制御器の状態方程式 DX = [[dxp][dxc]]; } Func void link_eqs(UY, t, X) Real t; Matrix UY, X; { Matrix xp, up, yp, xc, yc, uc; xp = X(1:2,1); // 制御対象の状態 xc = X(3:3,1) // 制御器の状態 yp = cp*xp; // 制御対象の出力 uc = yp; // yp を uc に接続 yc = cc*xc + dc*uc; // 制御器の出力 up = - yc; // yc を up に接続 UY = [up uc]'; }
Func void main() { Matrix x0; Array TC, XC, UC; void diff_eqs(), link_eqs(); x0 = [1 0 0]'; {TC, XC, UC} = Ode45Auto(0.0, 20.0, x0, diff_eqs, link_eqs); print [[TC][XC][UC]] >> "cont.mat"; } Func void diff_eqs(DX, t, X, UY) Real t; Matrix X, DX, UY; { static Integer init; static Matrix Ap, bp, Ac, bc; Matrix dxp, dxc, xp, xc, up, uc; if (init == 0) { init = 1; Ap = [[0 1] // 制御対象のパラメータ [2 1]]; bp = [0 1]'; Ac = [5]; // 制御器のパラメータ bc = [1]; } xp = X(1:2,1); // 制御対象の状態 xc = X(3:3,1); // 制御器の状態 up = UY(1:1,1); // 制御対象への入力 uc = UY(2:2,1); // 制御器への入力 dxp = Ap*xp + bp*up; // 制御対象の状態方程式 dxc = Ac*xc + bc*uc; // 制御器の状態方程式 DX = [[dxp][dxc]]; }
Func void link_eqs(UY, t, X) Real t; Matrix UY, X; { static Integer init; static Matrix cp, cc, dc; Matrix xp, up, yp, xc, yc, uc; if (init == 0) { init = 1; cp = [-1, 1]; // 制御対象のパラメータ cc = [54]; // 制御器のパラメータ dc = [9]; } xp = X(1:2,1); // 制御対象の状態 xc = X(3:3,1) // 制御器の状態 yp = cp*xp; // 制御対象の出力 uc = yp; // yp を uc に接続 yc = cc*xc + dc*uc; // 制御器の出力 up = - yc; // yc を up に接続 UY = [up uc]'; }