Scilab Home page | Wiki | Bug tracker | Forge | Mailing list archives | ATOMS | File exchange
Please login or create an account
Change language to: English - Français - Português -

Please note that the recommended version of Scilab is 6.0.1. This page might be outdated.
See the recommended documentation of this function

Scilab help >> CACSD > observer

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 を返します. Sysnx 個の状態変数, nu 個の入力および ny 個の出力を有します. Obs は, 行列 [Ao,Bo,Identity]を有する線形システムです. ただし, Aono x no, Bono x (nu+ny), Cono 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)

参照

作者

F.D.

Scilab Enterprises
Copyright (c) 2011-2017 (Scilab Enterprises)
Copyright (c) 1989-2012 (INRIA)
Copyright (c) 1989-2007 (ENPC)
with contributors
Last updated:
Thu Mar 03 11:00:55 CET 2011