Please note that the recommended version of Scilab is 2025.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 >> |