# ddp

外乱デカップリング

## 呼び出し手順

    [Closed,F,G]=ddp(Sys,zeroed,B1,D1)
                [Closed,F,G]=ddp(Sys,zeroed,B1,D1,flag,alfa,beta)

## パラメータ

Sys

  行列 `(A,B2,C,D2)`を含む`syslin` リスト

zeroed

  整数ベクトル, ゼロ化する`Sys`の出力の添え字.

B1

  real matrix

D1

  実数行列. `B1` および `D1` は同数の列を有します.

flag

  文字列 `'ge'` または `'st'` (デフォルト) または `'pp'`.

alpha

  実数または複素数のベクトル (閉ループ極の位置)

beta

  r実数または複素数のベクトル (閉ループ極の位置)

## 説明

完全な外乱デカップリング(出力ゼロ化アルゴリズム). 線形システムとゼロ化する出力の部分集合 z を指定すると, wからzへの伝達関数がゼロとなるようなSysの入力wを 明らかにします. `Sys` は, 1入力,2出力の線形システム {A,B2,C,D2} ( すなわち Sys: u-->(z,y) ), `Sys` および`B1,D1`で定義される以下のシステムの一部です:

    xdot =  A x + B1  w + B2  u
       z = C1 x + D11 w + D12 u
       y = C2 x + D21 w + D22 u

Sysの出力は(z,y)に分割され,zはゼロ化されます. すなわち, 行列 CとD2は次のようになります:

    C=[C1;C2]         D2=[D12;D22]
    C1=C(zeroed,:)    D12=D2(zeroed,:)

行列 `D1` は同様に `D11=D1(zeroed,:)`として `D1=[D11;D21]`のように分割されます. 制御則は u=Fx+Gw で, 閉ループシステム w-->z は以下のように定義されます.

    xdot= (A+B2*F)  x + (B1 + B2*G) w
      z = (C1+D12F) x + (D11+D12*G) w

この式は,ゼロ伝達関数を有します.

`flag='ge'`は安定性拘束条件を有しません. `flag='st'` : 安定な閉ループシステムを探します (A+B2*F 安定). `flag='pp'` : A+B2*Fの固有値を `alfa` および `beta`に割付ます.

閉ループは閉ループしすてむ`w-->y`の実現です.

    xdot= (A+B2*F)  x + (B1 + B2*G) w
      y = (C2+D22*F) x + (D21+D22*G) w

安定性 (resp. 極配置) は(A,B2)が可安定(もしくは可制御性)であることを必要とします.

## 例

    rand('seed',0);nx=6;nz=3;nu=2;ny=1;
    A=diag(1:6);A(2,2)=-7;A(5,5)=-9;B2=[1,2;0,3;0,4;0,5;0,0;0,0];
    C1=[zeros(nz,nz),eye(nz,nz)];D12=[0,1;0,2;0,3];
    Sys12=syslin('c',A,B2,C1,D12);
    C=[C1;rand(ny,nx)];D2=[D12;rand(ny,size(D12,2))];
    Sys=syslin('c',A,B2,C,D2);
    [A,B2,C1,D12]=abcd(Sys12);  //Sys12の行列.
    my_alpha=-1;my_beta=-2;flag='ge';
    [X,dims,F,U,k,Z]=abinv(Sys12,my_alpha,my_beta,flag);
    clean(X'*(A+B2*F)*X)
    clean(X'*B2*U)
    clean((C1+D12*F)*X)
    clean(D12*U);
    //アドホックに B1,D1を計算
    G1=rand(size(B2,2),3);
    B1=-B2*G1;
    D11=-D12*G1;
    D1=[D11;rand(ny,size(B1,2))];

    [Closed,F,G]=ddp(Sys,1:nz,B1,D1,'st',my_alpha,my_beta);
    closed=syslin('c',A+B2*F,B1+B2*G,C1+D12*F,D11+D12*G);
    ss2tf(closed)

## 参照

- abinv
- ui_observer