# abinv

AB 不変部分空間

## 呼び出し手順

    [X,dims,F,U,k,Z]=abinv(Sys,alpha,beta,flag)

## パラメータ

Sys

  行列`[A,B,C,D]`を含む `syslin` リスト.

alpha

  (オプション) 実数の数値またはベクトル (複素数の可能性もある閉ループ極の位置)

beta

  (オプション) 実数の数値またはベクトル (複素数の可能性もある閉ループ極の位置)

flag

  (オプション) 文字列 `'ge'` (デフォルト) または `'st'` または `'pp'`

X

  大きさ nx (状態空間の次元) の直交行列.

dims

  `dimR<=dimVg<=dimV<=noc<=nos`となる 整数行ベクトル `dims=[dimR,dimVg,dimV,noc,nos]`. `flag='st'`の場合, (resp. `'pp'`), `dims` は 4 (resp. 3) 個の要素となる.

F

  実数行列 (状態フィードバック)

k

  整数 (`Sys`のノーマルランク)

Z

  特異でない線形システム (`syslin` リスト)

## 説明

`Sys`の行列[A,B,C,D]を含む `Sys` = syslinリストで定義された線形システム に関する出力ゼロ部分空間 (不可観測となる最大部分空間). ベクトル `dims=[dimR,dimVg,dimV,noc,nos]` は 以下の区分に基づき `X`の列で定義される部分空間の次元を出力します. `X`の最初の`dimV`列,すなわち, `V=X(:,1:dimV)`は `Sys`のAB不変な部分空間 すなわち, `(A+B*F,C+D*F)`の不可観測な部分空間に 広がっています. (`C^(-1)(D)=X`の時に限り,`dimV=nx`).

`X`の最初の`dimR` 列, すなわち `R=X(:,1:dimR)`は, `V`, `(dimR<=dimV)`の中の `Sys`の可制御部を含んでいます. (左可逆システムの場合,`dimR=0`). `R` は`kernel(C)`の中の `Sys` の可制御な最大部分空間です.

`X` の最初の`dimVg`列は, `Sys`の`Vg`=AB-最大可安定部分空間 に広がっています.

`F`は非干渉化フィードバックです: `X=[V,X2] (X2=X(:,dimV+1:nx))` について, `X2'*(A+B*F)*V=0 および (C+D*F)*V=0`が満たされます.

`Sys` のゼロは以下のように取得できます : `X0=X(:,dimR+1:dimV); spec(X0'*(A+B*F)*X0)` すなわち, `dimV-dimR` 個の閉ループ固定モードがあります.

オプションのパラメータ `alpha` が入力として指定された場合, `dimR`個の`V`に含まれる `(A+BF)`の可制御モードが`alpha` (または`[alpha(1), alpha(2), ...]`)に設定されます. (`alpha` はベクトル (実数または複素数の組) または (実数の) 数値とすることができます). デフォルト値は `alpha=-1`です.

オプションの実数パラメータIr `beta` が入力に指定された場合, `noc-dimV` 個の`V`"以外の"`(A+BF)`の 可制御モードが`beta` (または`[beta(1),beta(2),...]`)に設定されます. デフォルト値は `beta=-1`です.

`X,U` に基づくと, 行列 `[X'*(A+B*F)*X,X'*B*U;(C+D*F)*X,D*U]` は以下のように表示されます:

    [A11,*,*,*,*,*]  [B11 * ]
    [0,A22,*,*,*,*]  [0   * ]
    [0,0,A33,*,*,*]  [0   * ]
    [0,0,0,A44,*,*]  [0  B42]
    [0,0,0,0,A55,*]  [0   0 ]
    [0,0,0,0,0,A66]  [0   0 ]

    [0,0,0,*,*,*]    [0  D2]

ただし,Xの分割は`dims`で定義され, Uの分割は`k`で定義されます.

`A11` は `(dimR x dimR)` 次で, `alpha(i)'s`の固有値を有しています. `(A11,B11)` の組は可制御で, `B11` は `nu-k` 列です. `A22` は安定な `(dimVg-dimR x dimVg-dimR)` 次の行列です. `A33` は不安定な `(dimV-dimVg x dimV-dimVg)` 行列です (`st_ility`参照).

`A44` は `(noc-dimV x noc-dimV)` 次であり, その固有値は`beta(i)`となります. `(A44,B42)` は可制御です. `A55` は安定な `(nos-noc x nos-noc)` 次の行列となります. `A66` は不安定な `(nx-nos x nx-nos)`次の行列 (`st_ility`参照).

`Z` は`Sys` の列圧縮です. `k` は`Sys`のランク, すなわち, `Sys*Z`は列圧縮された線形システムとなります. `k` は `B42,B52,B62` と `D2`の列の次元です. `[B42;B52;B62;D2]` は列フルランクでランク `k`を有しています.

`flag='st'` が指定された場合, 行列の5個のブロック区画が返され,`dims`は4個の要素を有します. `flag='pp'` が指定された場合, 5個のブロック区画が返されます. `flag='ge'` の場合, `dims=[dimR,dimVg,dimV,dimV+nc2,dimV+ns2]` となります. ここで where `nc2` (resp. `ns2`) は可制御 (resp. stabilizable)対 `(A44,B42)` (resp. (`[A44,*;0,A55],[B42;0])`)の次元です. `flag='st'`の場合, `dims=[dimR,dimVg,dimVg+nc,dimVg+ns]`となり, `flag='pp'`の場合, `dims=[dimR,dimR+nc,dimR+ns]`となります. `nc` (resp. `ns`) は ブロック数3から6(resp. 2 to 6)の 可制御(resp. stabilizable) 部分空間の次元です.

この関数は(正確な)外乱非干渉化問題に使用することができます.

    DDPS:
       Find u=Fx+Rd=[F,R]*[x;d] which rejects Q*d and stabilizes the plant:

        xdot = Ax+Bu+Qd
           y = Cx+Du+Td

    Im(Q)がVg + Im(B)に含まれる場合,DDPS は解を有し,可安定性の仮定は満たされます.

    Let G=(X(:,dimVg+1:$))'= left annihilator of Vg i.e. G*Vg=0;
    B2=G*B; Q2=G*Q; DDPS solvable iff [B2;D]*R + [Q2;T] =0 has a solution.

    G=(X(:,dimVg+1:$))'= Vgの左零化イデアル, すなわち G*Vg=0 とおくと,
    B2=G*B; Q2=G*Q; DDPS が可解であることは,
    [B2;D]*R + [Q2;T] =0が解を有することと必要十分の関係にあります.

    対 F,R  (F=abinvの出力)は解です.

    Im(B2)の中にあるIm(Q2)は,B2の列圧縮=>Q2の列圧縮を意味します.
    これにより, C*[(sI-A-B*F)^(-1)+D]*(Q+B*R) =0   (<=>G*(Q+B*R)=0)

## 例

    nu=3;ny=4;nx=7;
    nrt=2;ngt=3;ng0=3;nvt=5;rk=2;
    flag=list('on',nrt,ngt,ng0,nvt,rk);
    Sys=ssrand(ny,nu,nx,flag);my_alpha=-1;my_beta=-2;
    [X,dims,F,U,k,Z]=abinv(Sys,my_alpha,my_beta);
    [A,B,C,D]=abcd(Sys);dimV=dims(3);dimR=dims(1);
    V=X(:,1:dimV);X2=X(:,dimV+1:nx);
    X2'*(A+B*F)*V
    (C+D*F)*V
    X0=X(:,dimR+1:dimV); spec(X0'*(A+B*F)*X0)
    trzeros(Sys)
    spec(A+B*F)   //nr=2 evals at -1 and noc-dimV=2 evals at -2.
    clean(ss2tf(Sys*Z))

    nx=6;ny=3;nu=2;
    A=diag(1:6);A(2,2)=-7;A(5,5)=-9;B=[1,2;0,3;0,4;0,5;0,0;0,0];
    C=[zeros(ny,ny),eye(ny,ny)];D=[0,1;0,2;0,3];
    sl=syslin('c',A,B,C,D);//sl=ss2ss(sl,rand(6,6))*rand(2,2);
    [A,B,C,D]=abcd(sl);  //The matrices of sl.
    my_alpha=-1;my_beta=-2;
    [X,dims,F,U,k,Z]=abinv(sl,my_alpha,my_beta);dimVg=dims(2);
    clean(X'*(A+B*F)*X)
    clean(X'*B*U)
    clean((C+D*F)*X)
    clean(D*U)
    G=(X(:,dimVg+1:$))';
    B2=G*B;nd=3;
    R=rand(nu,nd);Q2T=-[B2;D]*R;
    p=size(G,1);Q2=Q2T(1:p,:);T=Q2T(p+1:$,:);
    Q=G\Q2;   //a valid [Q;T] since
    [G*B;D]*R + [G*Q;T]  // is zero
    closed=syslin('c',A+B*F,Q+B*R,C+D*F,T+D*R); // closed loop: d-->y
    ss2tf(closed)       // Closed loop is zero
    spec(closed('A'))   //The plant is not stabilizable!
    [ns,nc,W,sl1]=st_ility(sl);
    [A,B,C,D]=abcd(sl1);A=A(1:ns,1:ns);B=B(1:ns,:);C=C(:,1:ns);
    slnew=syslin('c',A,B,C,D);  //Now stabilizable
    //Fnew=stabil(slnew('A'),slnew('B'),-11);
    //slnew('A')=slnew('A')+slnew('B')*Fnew;
    //slnew('C')=slnew('C')+slnew('D')*Fnew;
    [X,dims,F,U,k,Z]=abinv(slnew,my_alpha,my_beta);dimVg=dims(2);
    [A,B,C,D]=abcd(slnew);
    G=(X(:,dimVg+1:$))';
    B2=G*B;nd=3;
    R=rand(nu,nd);Q2T=-[B2;D]*R;
    p=size(G,1);Q2=Q2T(1:p,:);T=Q2T(p+1:$,:);
    Q=G\Q2;   //a valid [Q;T] since
    [G*B;D]*R + [G*Q;T]  // is zero
    closed=syslin('c',A+B*F,Q+B*R,C+D*F,T+D*R); // closed loop: d-->y
    ss2tf(closed)       // Closed loop is zero
    spec(closed('A'))

## 参考

- cainv
- st_ility
- ssrand
- ss2ss
- ddp