Please note that the recommended version of Scilab is 2026.0.0. This page might be outdated.
See the recommended documentation of this function
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)
| Report an issue | ||
| << obscont | Controllability Observability | obsv_mat >> |