# observer

オブザーバの設計

## 呼び出し手順

    Obs=observer(Sys,J)
                [Obs,U,m]=observer(Sys [,flag,alfa])

## パラメータ

Sys

  `syslin` リスト (線形システム)

J

  nx x ny 定数行列 (出力注入行列)

flag

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

alfa

  閉ループ極の位置 (オプションのパラメータ, デフォルト=-1)

Obs

  線形システム (`syslin` リスト), オブザーバ

U

  直交行列 ( `dt_ility`参照)

m

  整数 (不安定/不可観測(`st`)または 不可観測(`pp`)部分空間の次元)

## 説明

`Obs=observer(Sys,J)` は, `J`出力注入により`Sys`から得られた オブザーバ `Obs=syslin(td,A+J*C,[B+J*D,-J],eye(A))` を返します (td は`Sys`の時間領域). より一般的に,`observer`は, 線形システム`Sys`,つまり, `syslin`リストにより表された `dotx=A x + Bu, y=Cx + Du`, の可観測な部分に関するオブザーバ `Obs` を返します. `Sys` は `nx` 個の状態変数, `nu` 個の入力および `ny` 個の出力を有します. `Obs` は, 行列 `[Ao,Bo,Identity]`を有する線形システムです. ただし, `Ao` は `no x no`, `Bo` は `no x (nu+ny)`, `Co` は `no x no` および `no=nx-m`です.

`Obs`への入力は `[u,y]` そして `Obs` の出力は以下のようになります:

xhat=不可観測な部分空間の x modulo の推定値 (`flag='pp'`の場合)

または, xhat=不安定で不可観測な部分空間のx modulo の推定値 (`flag='st'`の場合)

`flag='st'`の場合: `H*U(:,1:m)=0`の場合に限り z=H*x は安定なオブザーバにより推定することができ, オブザーバで配置可能な極は`alfa(1),alfa(2),...`に 設定されます.

`flag='pp'`の場合: `H*U(:,1:m)=0`の場合に限り z=H*x は指定した誤差スペクトルで推定することができ, 全てのオブザーバの極は配置され,`alfa(1),alfa(2),...`に 設定されます.

H が以下の拘束条件を満たす場合: `H*U(:,1:m)=0` (ker(H) は Sysの不可観測な部分空間を含みます) H*U=[0,H2]となり, z=H*x のオブザーバはH2*Obs (ただし,H2=H*U(:,m+1:nx)) となります. すなわち, H*x のオブザーバの C行列である Co は Co=H2となります.

`Sys`の対`(A,C)`が可観測となる 場合,`m=0`となり, 線形システム `U*Obs` (または`H*U*Obs`) は`x`(または `Hx`)のオブザーバとなります. 誤差スペクトルは, `alpha(1),alpha(2),...,alpha(nx)`です.

## 例

    nx=5;nu=1;ny=1;un=3;us=2;Sys=ssrand(ny,nu,nx,list('dt',us,us,un));
    //nx=5 states, nu=1 input, ny=1 output,
    //un=3 unobservable states, us=2 of them unstable.
    [Obs,U,m]=observer(Sys);  //Stable observer (default)
    W=U';H=W(m+1:nx,:);[A,B,C,D]=abcd(Sys);  //H*U=[0,eye(no,no)];
    Sys2=ss2tf(syslin('c',A,B,H))  //Transfer u-->z
    Idu=eye(nu,nu);Sys3=ss2tf(H*U(:,m+1:$)*Obs*[Idu;Sys])
    //Transfer u-->[u;y=Sys*u]-->Obs-->xhat-->HUxhat=zhat  i.e. u-->output of Obs
    //this transfer must equal Sys2, the u-->z transfer  (H2=eye).

    //Assume a Kalman model
    //dotx = A x + B u + G w
    // y   = C x + D u + H w + v
    //with Eww' = QN, Evv' = RN, Ewv' = NN
    //To build a Kalman observer:
    //1-Form BigR = [G*QN*G'         G*QN*H'+G*NN;
    //               H*QN*G'+NN*G'   H*QN*H'+RN];
    //the covariance matrix of the noise vector [Gw;Hw+v]
    //2-Build the plant P21 : dotx = A x + B1 e ; y = C2 x + D21 e
    //with e a unit white noise.
    // [W,Wt]=fullrf(BigR);
    //B1=W(1:size(G,1),:);D21=W(($+1-size(C,1)):$,:);
    //C2=C;
    //P21=syslin('c',A,B1,C2,D21);
    //3-Compute the Kalman gain
    //L = lqe(P21);
    //4- Build an observer for the plant [A,B,C,D];
    //Plant = syslin('c',A,B,C,D);
    //Obs = observer(Plant,L);
    //Test example:
    A=-diag(1:4);
    B=ones(4,1);
    C=B'; D= 0; G=2*B; H=-3; QN=2;
    RN=5; NN=0;
    BigR = [G*QN*G'         G*QN*H'+G*NN;
            H*QN*G'+NN*G'   H*QN*H'+RN];
    [W,Wt]=fullrf(BigR);
    B1=W(1:size(G,1),:);D21=W(($+1-size(C,1)):$,:);
    C2=C;
    P21=syslin('c',A,B1,C2,D21);
    L = lqe(P21);
    Plant = syslin('c',A,B,C,D);
    Obs = observer(Plant,L);
    spec(Obs.A)

## 参照

- dt_ility
- unobs
- stabil