function [Y,degY] = rypol(F,Hb,Hc,mes) % to find polynomial matrix from state-space condition % [Y0 Y1...]*observ(Hb,F) = Hc % % Y ... pol.matrix Y(z)=Y0+Y1*z+Y2*z^{2}+... % degY . degree of Y % F ... state-feedback matrix % Hb ... input matrix % Hc ... input matrix % mes (=0,1,2)...message and interrupt level % % Call: [Y,degY]=rypol(F,Hb,Hc,mes) to = 1e-6; [rHb,cHb] = size(Hb); [rHc,cHc] = size(Hc); [rF,cF] = size(F); if (rF ~= cF)|(cHb ~= cHc)|(cF ~= cHb) error('contr: F,Hb,Hc not compatible with assumptions') end observ = Hb; for i = 1:cHb-1, observ = [Hb; observ*F]; end normS = norm([observ; Hc]',inf); ub = rHb*cHb; sel=1:ub; Y=zeros(rHc,ub); degY=cHb-1; unsolvable = 0; for l=1:rHc if unsolvable == 1 disp('....................................................') disp('no solution: A,B,C violate the span condition ') disp('....................................................') Y = []; degY = []; return end i=1; unsolvable = 1; while i<=ub b=observ(sel(1,i),:); B=[Hc(l,:); observ(sel(1,1:i-1),:)]; c=b/B; err=b-c*B; if norm(err,2) <= to*normS % check row Hc(l) for independence if abs(c(1,1)) > 1e-14 c = [c -1]; c = -c/c(1,1); for chknan=1:i if c(1,chknan)==NaN, c(1,chknan)=0; end end Y(l,sel(1,1:i)) = c(1,2:i+1); unsolvable = 0; break end % select the dependent rows of observability matrix ii = i; idel = sel(1,i); while ii <= ub if sel(1,ii) == idel sel = [sel(1,1:ii-1) sel(1,ii+1:ub)]; ub = ub - 1; idel = idel + rHb; end ii = ii + 1; end i = i - 1; end i = i + 1; end end [Y,degY]=polcl(Y,degY);