ui_observer — unknown input observer
[UIobs,J,N]=ui_observer(Sys,reject,C1,D1) [UIobs,J,N]=ui_observer(Sys,reject,C1,D1,flag,alfa,beta)
syslin list containing the matrices (A,B,C2,D2).
integer vector, indices of inputs of Sys which are unknown.
real matrix
real matrix. C1 and D1 have the same number of rows.
string 'ge' or 'st' (default) or 'pp'.
real or complex vector (loc. of closed loop poles)
real or complex vector (loc. of closed loop poles)
Unknown input observer.
Sys: (w,u) --> y is a (A,B,C2,D2) syslin linear system with
two inputs w and u, w being the unknown input.
The matrices B and D2 of Sys are (implicitly) partitioned as:
B=[B1,B2] and D2=[D21,D22] with B1=B(:,reject) and
D21=D2(:,reject) where reject = indices of unknown inputs.
The matrices C1 and D1 define z = C1 x + D1 (w,u),
the to-be-estimated output.
The matrix D1 is (implicitly) partitioned as D1=[D11,D12]
with D11=D(:,reject)
The data (Sys, reject,C1, D1) define a 2-input 2-output system:
xdot = A x + B1 w + B2 u z = C1 x + D11 w + D12 u y = C2 x + D21 w + D22 u
An observer (u,y) --> zhat is looked for the output z.
flag='ge' no stability constraints
flag='st' stable observer (default)
flag='pp' observer with pole placement
alfa,beta = desired location of closed loop poles (default -1, -2)
J=y-output to x-state injection.
N=y-output to z-estimated output injection.
UIobs = linear system (u,y) --> zhat such that:
The transfer function: (w,u) --> z equals the composed transfer function:
[0,I; UIobs
Sys]
(w,u) -----> (u,y) -----> zhat
i.e. transfer function of system {A,B,C1,D1} equals transfer function
UIobs*[0,I; Sys]
Stability (resp. pole placement) requires detectability (resp. observability) of (A,C2).
A=diag([3,-3,7,4,-4,8]);
B=[eye(3,3);zeros(3,3)];
C=[0,0,1,2,3,4;0,0,0,0,0,1];
D=[1,2,3;0,0,0];
rand('seed',0);w=ss2ss(syslin('c',A,B,C,D),rand(6,6));
[A,B,C,D]=abcd(w);
B=[B,matrix(1:18,6,3)];D=[D,matrix(-(1:6),2,3)];
reject=1:3;
Sys=syslin('c',A,B,C,D);
N1=[-2,-3];C1=-N1*C;D1=-N1*D;
nw=length(reject);nu=size(Sys('B'),2)-nw;
ny=size(Sys('C'),1);nz=size(C1,1);
[UIobs,J,N]=ui_observer(Sys,reject,C1,D1);
W=[zeros(nu,nw),eye(nu,nu);Sys];UIobsW=UIobs*W;
//(w,u) --> z=UIobs*[0,I;Sys](w,u)
clean(ss2tf(UIobsW));
wu_to_z=syslin('c',A,B,C1,D1);clean(ss2tf(wu_to_z));
clean(ss2tf(wu_to_z)-ss2tf(UIobsW),1.d-7)
/////2nd example//////
nx=2;ny=3;nwu=2;Sys=ssrand(ny,nwu,nx);
C1=rand(1,nx);D1=[0,1];
UIobs=ui_observer(Sys,1,C1,D1);