図に示す各ブロックP,D,C,Fはプラント,プラントの不確定要素,
前置コントローラ,フィードバックコントローラを表し,各ブロックは線形状態
方程式と線形出力方程式で記述され,その係数は
(Ap, Bp, Cp),
(Ad, Bd, Cd),
(Ac, Bc, Cc),
(Af, Bf, Cf)であるとする。
Matrix Ap, Bp, Cp; // 制御器のパラメータ Matrix Ad, Bd, Cd; // 不確定要素のパラメータ Matrix Ac, Bc, Cc; // 制御器1のパラメータ Matrix Af, Bf, Cf; // 制御器2のパラメータ List state_idx; // 状態の指数のリスト List input_idx; // 入力の指数のリスト Func void main() { Matrix xp0, xd0, xc0, xf0, x0; Matrix up0, ud0, uc0, uf0, u0; Array TC, XC, UC; void diff_eqs(), link_eqs(); read Ap, Bp, Cp <- "plant"; read Ad, Bd, Cd <- "uncertainty"; read Ac, Bc, Cc <- "controller-1"; read Af, Bf, Cf <- "controller-2"; read xp0, xd0, xc0, xf0 <- "init-states"; read up0, ud0, uc0, uf0 <- "init-inputs"; {x0, state_idx} = VecCont({xp0, xd0, xc0, xf0}); {u0, input_idx} = VecCont({up0, ud0, uc0, uf0}); {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, U) Real t; Matrix X, DX, U; { Matrix xp, xd, xc, xf; Matrix dxp, dxd, dxc, dxf; Matrix up, ud, uc, uf; {xp, xd, xc, xf} = VecChop(X, state_idx); {up, ud, uc, uf} = VecChop(U, input_idx); dxp = Ap*xp + Bp*up; dxd = Ad*xd + Bd*ud; dxc = Ac*xc + Bc*uc; dxf = Af*xf + Bf*uf; DX = [[dxp][dxd][dxc][dxf]]; } Func void link_eqs(U, t, X) Real t; Matrix U, X; { Matrix xp, xd, xc, xf; Matrix up, ud, uc, uf; Matrix yp, yd, yc, yf; {xp, xd, xc, xf} = VecChop(X, state_idx); yp = Ap*xp; yd = Ad*xd; yc = Ac*xc; yf = Af*xf; up = yc - yf; ud = up; uc = u; uf = yp + yd; U = [[up][ud][uc][uf]]'; }