Octave で見る現代制御
□ 可制御性・可観測性
システム
x'(t) = A x(t) + b u(t)
y(t) = c x(t)
A = [-2 , -1; -1, -2], b = [1; 1], c = [1, 0]
の可制御性と,可観測性を調べる.
octave: > A = [-2, -1; -1, -2]
octave: > b = [1; 1]
octave: > c = [1, 0]
octave: > Mc = [b, A*b]
octave: > det(Mc)
Mc の行列式が 0 なので可制御ではない.
octave: > Mo = [c; c*A]
octave: > det(Mo)
Mo の行列式が 0 でないので可観測である.
□ 対角化
システム
x'(t) = A x(t) + b u(t)
y(t) = c x(t)
A = [-2 , -1; -1, -2], b = [1; 1], c = [1, 0]
を対角化する.
octave: > A = [-2, -1; -1, -2]
octave: > b = [1; 1]
octave: > c = [1, 0]
octave: > [T, V] = eig(A)
octave: > Abar = inv(T)*A*T
octave: > bbar = inv(T)*b
octave: > cbar = c*T
この結果,システムが可制御ではないが可観測であることがわかる.
□ 可制御正準形
システム
x'(t) = A x(t) + b u(t)
y(t) = c x(t)
A = [-1 , 2; -1, -4], b = [1; 1], c = [1, 0]
を可制御正準形に変換する.
octave: > A = [-1, 2; -1, -4]
octave: > b = [1; 1]
octave: > c = [1, 0]
octave: > p = poly(A)
特性多項式が s^2 + 5 s + 6 となることがわかる.
octave: > T = [b, A*b]*[p(2), 1; 1, 0]
octave: > Abar = inv(T)*A*T
octave: > bbar = inv(T)*b
octave: > cbar = c*T
□ 安定性判別
システム
x'(t) = A x(t) + b u(t)
y(t) = c x(t)
A = [-1 , 2; -1, -4], b = [1; 1], c = [1, 0]
の安定性を判別する.
octave: > A = [-1, 2; -1, -4]
octave: > p = poly(A)
octave: > r = roots(p)
A の特性方程式の根 r の実部が全て負なので,システムは安定である.
□ 状態フィードバック制御の極配置
システム
x'(t) = A x(t) + b u(t)
y(t) = c x(t)
A = [-1 , -2; -1, -4], b = [1; 1], c = [1, 0]
の極を -1+2j, -1-2j に設定する状態フィードバックゲイン f を求める.
octave: > A = [-1, -2; -1, -4]
octave: > b = [1; 1]
octave: > c = [1, 0]
octave: > p1 = poly(A)
octave: > T = [b, A*b]*[p1(2), 1; 1, 0]
octave: > p2 = poly([-1+2j, -1-2j])
octave: > f = [p2(3) - p1(3), p2(2) - p1(2)]*inv(T)
初期値 x(0) = [1; -1] の場合の応答を確かめる.
octave: > global A; global b; global f;
octave: > function xdot = F(x, t)
global A; global b; global f;
xdot = (A-b*f)*x;
endfunction
octave: > x0 = [1; -1]
octave: > t = linspace(0, 5, 1000);
octave: > y = lsode("F", x0, t);
octave: > grid "on"
octave: > plot(t, y)
octave: > closeplot
□ 直接フィードバック制御における根軌跡
システム
x'(t) = A x(t) + b u(t)
y(t) = c x(t)
A = [-1, 0, 0; -1, -1, -1; -2, 1, -2], b = [1; 1; 1], c = [0, 0, 1]
に対して u(t) = -k y(t) という直接フィードバックを行ったときの根軌跡を
求める.
octave: > A = [-1, 0, 0; -1, -1, -1; -2, 1, -2]
octave: > b = [1; 1; 1]
octave: > c = [0, 0, 1]
octave: > global A; global b; global c;
octave: > function r = F(k)
global A; global b; global c;
p = poly(A-b*k*c);
r = roots(p);
endfunction
octave: > k = linspace(0, 30, 60);
octave: > [nr, nc] = size(k);
octave: > r = F(k(1));
octave: > for i = 2:nc
r = [r; F(k(i))];
endfor
octave: > plot(real(r), imag(r), 'x')
octave: > closeplot
□ 同一次元オブザーバの構成
システム
x'(t) = A x(t) + b u(t)
y(t) = c x(t)
A = [-1 , -2; -1, -4], b = [1; 1], c = [1, 0]
に対して,-4, -5 に極を持つ同一次元オブザーバ
z'(t) = A z(t) -k[c z(t) - y(t)] + b u(t) = (A - k c)z(t) + k y(t) + b u(t)
のゲイン k を決定する.
octave: > A = [-1, -2; -1, -4]
octave: > b = [1; 1]
octave: > c = [1, 0]
octave: > p1 = poly(A)
octave: > T = [c.', A.'*c.']*[p1(2), 1; 1, 0]
octave: > p2 = poly([-4, -5])
octave: > k = ([p2(3) - p1(3), p2(2) - p1(2)]*inv(T)).'
オブザーバの推定の様子を確かめる.初期値 x(0) = [0; 0], z(0) = [1; 1]
u(t) = 1 (単位ステップ入力)とする.
octave: > AA = [A, zeros(2, 2); k*c, A-k*c]
octave: > bb = [b; b]
octave: > global AA; global bb;
octave: > function xdot = F(x, t)
global AA; global bb;
xdot = AA*x + bb;
endfunction
octave: > x0 = [0; 0; 1; 1]
octave: > t = linspace(0, 5, 1000);
octave: > y = lsode("F", x0, t);
octave: > grid "on"
octave: > plot(t, y)
octave: > closeplot
□ 同一次元オブザーバとフィードバック制御の併合システム
システム
x'(t) = A x(t) + b u(t)
y(t) = c x(t)
A = [-1 , -2; -1, -4], b = [1; 1], c = [1, 0]
に対して,-4, -5 に極を持つ同一次元オブザーバ
z'(t) = A z(t) -k[c z(t) - y(t)] + b u(t) = (A - k c)z(t) + k y(t) + b u(t)
の推定値を用いて,極を -1+2j, -1-2j に配置したフィードバック制御を
行う.
octave: > A = [-1, -2; -1, -4]
octave: > b = [1; 1]
octave: > c = [1, 0]
octave: > p1 = poly(A)
octave: > T = [c.', A.'*c.']*[p1(2), 1; 1, 0]
octave: > p2 = poly([-4, -5])
octave: > k = ([p2(3) - p1(3), p2(2) - p1(2)]*inv(T)).'
octave: > T = [b, A*b]*[p1(2), 1; 1, 0]
octave: > p2 = poly([-1+2j, -1-2j])
octave: > f = [p2(3) - p1(3), p2(2) - p1(2)]*inv(T)
併合システムの応答を確かめる.
初期値 x(0) = [1; -1], z(0) = [0; 0] とする.
octave: > AA = [A, -b*f; k*c, A-b*f-k*c]
octave: > global AA;
octave: > function xdot = F(x, t)
global AA;
xdot = AA*x;
endfunction
octave: > x0 = [1; -1; 0; 0]
octave: > t = linspace(0, 5, 1000);
octave: > y = lsode("F", x0, t);
octave: > grid "on"
octave: > plot(t, y)
octave: > closeplot
Octave
naniwa@rbt.his.u-fukui.ac.jp