Octave Control Systems Toolbox を使う
Octave ver.2.1 以降では Contol Systems Toolbox が強化され,制御系のシミュ
レーションや,制御系の表現同士の変換が容易になっている.ここでは Debian Etch
で配布されている ver.2.9.9 版をベースにしているが,Debian Sarge の ver.2.1.69
でもほぼ同様に動作する.
□ 2次系の過渡応答
2次系
y''(t) + 2ζω y'(t) + ω^2 y(t) = x(t)
で ζ = 0.2, ω = 1, x(t) = 1 (単位ステップ入力)の場合の過渡応答を求める.
このとき,伝達関数は
1
G(s) = --------------
s^2 + 0.4s + 1
で与えられる.
octave: > sys = tf([1],[1, 0.4, 1], 0);
octave: > sysout(sys)
octave: > step(sys)
あるいは,次のようにして応答と時間を変数に保存する事ができる.
octave: > [y, t] = step(sys);
octave: > grid "on"
octave: > plot(t, y)
計算の精度をあげるには終了時間と分割数を明示すると良い.
octave: > [y, t] = step(sys, 1, 30, 300);
octave: > plot(t, y)
octave: > closeplot
□ ベクトル軌跡(ナイキスト線図)
伝達関数が
1
G(s) = -----------------
(1+s)(1+2s)(1+3s)
で与えられる制御系のベクトル軌跡を描く.
octave: > sys = zp([],[-1, -1/2, -1/3], 1/6);
octave: > sysout(sys)
octave: > nyquist(sys)
octave: > closeplot
□ ボード線図
伝達関数が
(1+3s)
G(s) = ------------
(1+s)(1+2s)
で与えられる制御系のボード線図を描く.
octave: > sys = zp([-1/3], [-1, -1/2], 3/2);
octave: > sysout(sys)
octave: > bode(sys)
octave: > closeplot
□ 根軌跡
前向き伝達関数が
K
G(s) = -------------
s(s+1)(s+2)
で与えられるユニティフィードバック制御系の根軌跡を描く.
octave: > sys = zp([], [0, -1, -2], 1);
octave: > sysout(sys)
octave: > rlocus(sys, 1/60, 0, 30)
octave: > closeplot
ver.2.1.69 では途中でエラーが出て計算が止まるが,ver.2.9.9 では表示される.
尚,ver.2.1.69 では OCST のデモ(rldemo)でもエラーが発生している.
□ 伝達関数で与えられるシステムの状態変数表示
伝達関数が
s+2
G(s) = ------------
s^2 + 5 s + 2
で与えられる制御系の状態変数表示を求める.
octave: > sys = tf([1, 2], [1, 5, 2]);
octave: > sysout(sys)
octave: > [A, b, c, d] = sys2ss(sys)
□ 状態変数表示されたシステムの取り扱い.
システム
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: > sys = ss(A, b, c);
octave: > sysout(sys)
伝達関数の分子多項式と分母多項式の係数を求める.
octave: > [n, d] = sys2tf(sys)
octave: > tfout(n, d)
ステップ応答を求める.
octave: > [y, t] = step(sys, 1);
octave: > grid("on");
octave: > plot(t, y)
octave: > closeplot
□ ユニティフィードバック制御系の伝達関数の計算
前向き伝達関数が
s+1
G(s) = ------------
s^2 + 2 s + 2
で与えられるユニティフィードバック制御系の伝達関数を求める.
octave: > G = tf([1, 1], [1, 2, 2]);
octave: > sys = buildssic([1, -1],[],[1],[1],G);
octave: > sysout(sys)
octave: > [n, d] = sys2tf(sys)
octave: > tfout(n, d)
buildssic の代わりに,sysdup, sysscale, sysconnect, sysprune を使
う方法もある.
octave: > G0 = sysdup(G, [], [1]);
octave: > G1 = sysscale(G0, [], diag([1, -1]));
octave: > G2 = sysconnect(G1, [1], [2]);
octave: > sys = sysprune(G2, 1, 1);
octave: > sysout(sys)
octave: > [n, d] = sys2tf(sys)
octave: > tfout(n, d)
□ フィードバック制御系の伝達関数の計算
前向き伝達関数が
1
G(s) = ------------
s^2 + 3 s + 2
で,フィードバック要素の伝達関数が
1
H(s) = ---------
1 + 2 s
で与えられるフィードバック制御系の伝達関数を求める.
octave: > G = tf([1], [1, 3, 2]);
octave: > H = tf([1], [2, 1]);
octave: > sys = buildssic([1, -2; 2, 1],[],[1],[1], G, H);
octave: > sysout(sys)
octave: > [n, d] = sys2tf(sys)
octave: > tfout(n, d)
buildssic の代わりに,sysgroup, sysdup, 他を使う方法もある.
octave: > GH = sysgroup(G, H);
octave: > GH0 = sysdup(GH, [], [1]);
octave: > GH1 = sysscale(GH0,[],diag([1, 1, -1]));
octave: > GH2 = sysconnect(GH1,[1, 2],[2, 3]);
octave: > sys = sysprune(GH2, 1, 1);
octave: > sysout(sys)
octave: > [n, d] = sys2tf(sys)
octave: > tfout(n, d)
Octave
naniwa@rbt.his.u-fukui.ac.jp