図に示す各ブロック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]]';
}