可制御を求める方法
状態空間表現からA、Bを使用する
A = 任意の行列
B = 任意の行列
Vc = ctrb(A,B)
rank(Vc) %この結果がVcの行サイズと同じなら可制御
[n,m] = size(Vc) % n:行サイズ, m:列サイズ
rank(Vc) == n %結果が1なら可制御,0なら不可制御
det(Vc) %この値が0でなければ可制御(1入力の場合)
ctrb(A,B)
: 可制御行列を求める A,Bは状態空間表現のA行列、B行列
rank(行列)
: 行列のランクを求められる => 行フルランクなら可制御(行列の行数とランクが同じ場合)
%行列の定義-----------------------
A = [-3 1;2 -2];
B = [2;0];
%変数(シンボリック)の定義---------
syms lambda k1 k2 p1 p2
----------------------------------
%ゲイン行列Kと併合システムのAcl行列の定義----
K = [k1, k2];
Acl = A + B*K;
%--------------------------------------------
%特性多項式(|λI-Acl|を求める[k1,k2]を利用したパターン)
eq1 = det(lambda*eye(2) - Acl); %行列式
eq1 = collect(eq1,lambda) %lambdaのべき乗で係数をまとめる
coe1 = coeffs(eq1,lambda) %lambdaの係数をすべて返す(次元の低いものから返される)
%--------------------------------------------
%多項式((λ-p1)(λ-p2))のパターン
eq2 = (lambda - p1)*(lambda - p2);
eq2 = collect(eq2,lambda)
coe2 = coeffs(eq2,lambda)
%--------------------------------------------
%方程式を指定したシンボリックに対して解く------------------
[k1,k2] = solve([coe1(1)-coe2(1),coe1(2)-coe2(2)],[k1,k2])
%----------------------------------------------------------
%k1,k2の関数内のp1とp2に指定の極を与えてそれに当てはまるk1,k2を求める---
K = subs([k1,k2],{p1,p2},{-8+4j,-8-4j})
%-----------------------------------------------------------------------
%Aclの固有値を求める----
eig(A+B*K)
%-----------------------
collect(方程式,シンボリック)
: 指定したシンボリックに関してべき乗で方程式内の係数をまとめる(今回の場合lambdaを指定しているのでlambdaのべき乗の式になる) >lambda^2 +(係数)*lambda のような形になる(デフォルトのシンボリックはx)
coeffs(方程式,シンボリック)
: 指定した方程式のシンボリックの係数を次元の低いものから配列にして返す(通常みる多項式の後ろからということ)
solve(数式,シンボリック)
: 数式について指定したシンボリックで解を求める(数式とシンボリック)を複数やる場合は対応するもの同士を同じ配列の場所に入れることで複数の解を求めることができる
eig(行列)
: 行列の固有値を求める
極配置(2)[可制御標準形に基づく方法(1入力システム)]
%ステップ1---------------------------
coe = poly(A) %特性多項式det(λI-A)の係数(高次から低次の順で返される)
a1 = coe(2); a0 = coe(3);
%------------------------------------
%ステップ2---------------------------
Mc = [a1 1;1 0] %正則行列Mcの計算
Vc = ctrb(A,B) %可制御行列の計算
%ステップ3---------------------------
Tc = inv(Vc*Mc) %可制御標準形への変換行列
%ステップ4---------------------------
p1 = -8+4j; p2=-8-4j;
Delta = conv([1 -p1],[1 -p2]) %多項式の計算(因数分解されたものの展開)
d1 = Delta(2); d0 =Delta(3);
%------------------------------------
%ステップ5---------------------------
Kc = [a0-d0 a1-d1]
K = Kc*Tc
%A+B*Kの固有値を
eig(A + B*K)
%-----------------------------------
poly(行列)
: 引数に行列を与えた場合、特性多項式(|λI-A|)の係数を返す=>λ^2+係数*λのような形(λの先頭の係数から返されるため今回の場合先頭のλ^2の1から順に返される) 順番は高次から低次となっている
inv(行列)
: 行列の逆行列を求める
conv(配列, 配列)
: 畳み込みおよび多項式の乗算をする(多項式の分配法則的なこと) 配列には計算をする多項式の係数が入った配列を与える
極配置(3)[アッカーマンの極配置アルゴリズム(1入力システム)]
A = [-3 1;2 -2];
B = [2;0];
p = [-8+4j;-8-4j];
K = - acker(A,B,p)
eig(A+B*K)
acker(A,B,p)
: 1入力システムのみ対応 A,B行列と指定したい極pを配列で渡す
注意
ackerから返ってくるゲインはu=-Kxを想定しているのでKに代入する際に負の値をかける必要がある
A = [0 1 0 0; -1 -1 1 1; 0 0 0 1;2 2 -2 -2];
B = [0 0 ;1/2 0; 0 0; 0 1];
p(1) = -2; p(2) = -2;
p(3) = -4; p(4) = -4;
K = -place(A,B,p)
eig(A+B*K)
place(A,B,p)
: 多入システムに対応 基本的にackerと同じ
注意
ackerと同様でKに代入する際にマイナスをかける(符号を反対にする)必要がある
基本的にacker
とplace
で極配置できるという認識でOK