Mercurial > octave-nkf
diff scripts/control/hinf/is_dgkf.m @ 7131:a184bc985c37
[project @ 2007-11-08 15:55:02 by jwe]
author | jwe |
---|---|
date | Thu, 08 Nov 2007 15:55:02 +0000 |
parents | a1dbe9d80eee |
children | df9519e9990c |
line wrap: on
line diff
--- a/scripts/control/hinf/is_dgkf.m Thu Nov 08 15:28:41 2007 +0000 +++ b/scripts/control/hinf/is_dgkf.m Thu Nov 08 15:55:02 2007 +0000 @@ -131,84 +131,95 @@ function [retval, dgkf_struct] = is_dgkf (Asys, nu, ny, tol) - if (nargin < 3) | (nargin > 4) + if (nargin < 3) || (nargin > 4) print_usage (); - elseif (! isscalar(nu) | ! isscalar(ny) ) - error("is_dgkf: arguments 2 and 3 must be scalars") - elseif (! isstruct(Asys) ) - error("Argument 1 must be a system data structure"); + elseif (! isscalar (nu) || ! isscalar (ny)) + error ("is_dgkf: arguments 2 and 3 must be scalars") + elseif (! isstruct (Asys)) + error ("Argument 1 must be a system data structure"); endif - if(nargin < 4) + if (nargin < 4) tol = 200*eps; - elseif( !is_sample(tol) ) - error("is_dgkf: tol must be a positive scalar") + elseif (! is_sample (tol)) + error ("is_dgkf: tol must be a positive scalar") endif retval = 1; # assume passes test - dflg = is_digital(Asys); - [Anc, Anz, nin, nout ] = sysdimensions(Asys); + dflg = is_digital (Asys); + [Anc, Anz, nin, nout ] = sysdimensions (Asys); - if( Anz == 0 & Anc == 0 ) - error("is_dgkf: no system states"); - elseif( nu >= nin ) - error("is_dgkf: insufficient number of disturbance inputs"); - elseif( ny >= nout ) - error("is_dgkf: insufficient number of regulated outputs"); + if (Anz == 0 && Anc == 0) + error ("is_dgkf: no system states"); + elseif (nu >= nin) + error ("is_dgkf: insufficient number of disturbance inputs"); + elseif (ny >= nout) + error ("is_dgkf: insufficient number of regulated outputs"); endif - nw = nin - nu; nw1 = nw + 1; - nz = nout - ny; nz1 = nz + 1; + nw = nin - nu; + nz = nout - ny; - [A,B,C,D] = sys2ss(Asys); + nw1 = nw + 1; + nz1 = nz + 1; + + [A, B, C, D] = sys2ss (Asys); ## scale input/output for numerical reasons - if(norm (C, "fro") * norm (B, "fro") == 0) - error("||C||*||B|| = 0; no dynamic connnection from inputs to outputs"); + if (norm (C, "fro") * norm (B, "fro") == 0) + error ("||C||*||B|| = 0; no dynamic connnection from inputs to outputs"); endif - xx = sqrt(norm(B, Inf) / norm(C, Inf)); + xx = sqrt (norm (B, Inf) / norm (C, Inf)); B = B / xx; C = C * xx; ## partition matrices - Bw = B(:,1:nw); Bu = B(:,nw1:nin); - Cz = C(1:nz,:); Dzw = D(1:nz,1:nw); Dzu = D(1:nz,nw1:nin); - Cy = C(nz1:nout,:); Dyw = D(nz1:nout,1:nw); Dyu = D(nz1:nout,nw1:nin); + Bw = B(:,1:nw); + Bu = B(:,nw1:nin); + + Cz = C(1:nz,:); + Cy = C(nz1:nout,:); + + Dzw = D(1:nz,1:nw); + Dzu = D(1:nz,nw1:nin); + + Dyw = D(nz1:nout,1:nw); + Dyu = D(nz1:nout,nw1:nin); ## Check for loopo shifting - Dyu_nz = (norm(Dyu,Inf) != 0); + Dyu_nz = (norm (Dyu, Inf) != 0); if (Dyu_nz) - warning("is_dgkf: D22 nonzero; performing loop shifting"); + warning ("is_dgkf: D22 nonzero; performing loop shifting"); endif ## 12 - rank condition at w = 0 xx =[A, Bu; Cz, Dzu]; - [nr, nc] = size(xx); - irank = rank(xx); + [nr, nc] = size (xx); + irank = rank (xx); if (irank != nc) retval = 0; - warning(sprintf("rank([A Bu; Cz Dzu]) = %d, need %d; n=%d, nz=%d, nu=%d", ... - irank,nc,(Anc+Anz),nz,nu)); - warning(" *** 12-rank condition violated at w = 0."); + warning ("rank([A Bu; Cz Dzu]) = %d, need %d; n=%d, nz=%d, nu=%d", + irank, nc, Anc+Anz, nz, nu); + warning (" *** 12-rank condition violated at w = 0"); endif ## 21 - rank condition at w = 0 xx =[A, Bw; Cy, Dyw]; - [nr, nc] = size(xx); - irank = rank(xx); + [nr, nc] = size (xx); + irank = rank (xx); if (irank != nr) retval = 0; - warning(sprintf("rank([A Bw; Cy Dyw]) = %d, need %d; n=%d, ny=%d, nw=%d", ... - irank,nr,(Anc+Anz),ny,nw)); - warning(" *** 21-rank condition violated at w = 0."); + warning ("rank([A Bw; Cy Dyw]) = %d, need %d; n=%d, ny=%d, nw=%d", + irank, nr, Anc+Anz, ny, nw); + warning (" *** 21-rank condition violated at w = 0"); endif ## can Dzu be transformed to become [0 I]' or [I]? ## This ensures a normalized weight - [Qz, Ru] = qr(Dzu); - irank = rank(Ru); + [Qz, Ru] = qr (Dzu); + irank = rank (Ru); if (irank != nu) retval = 0; - warning(sprintf("*** rank(Dzu(%d x %d) = %d", nz, nu, irank)); - warning(" *** Dzu does not have full column rank."); + warning ("*** rank(Dzu(%d x %d) = %d", nz, nu, irank); + warning ("*** Dzu does not have full column rank"); endif if (nu >= nz) Qz = Qz(:,1:nu)'; @@ -219,12 +230,12 @@ ## can Dyw be transformed to become [0 I] or [I]? ## This ensures a normalized weight - [Qw, Ry] = qr(Dyw'); - irank = rank(Ry); + [Qw, Ry] = qr (Dyw'); + irank = rank (Ry); if (irank != ny) retval = 0; - warning(sprintf("*** rank(Dyw(%d x %d) = %d", ny, nw, irank)); - warning(" *** Dyw does not have full row rank."); + warning ("*** rank(Dyw(%d x %d) = %d", ny, nw, irank); + warning (" *** Dyw does not have full row rank"); endif if (ny >= nw) @@ -246,22 +257,22 @@ Dyw = Ry\Dyw*Qw; ## pack the return structure - dgkf_struct.nw = nw; - dgkf_struct.nu = nu; - dgkf_struct.nz = nz; - dgkf_struct.ny = ny; - dgkf_struct.A = A; - dgkf_struct.Bw = Bw; - dgkf_struct.Bu = Bu; - dgkf_struct.Cz = Cz; - dgkf_struct.Cy = Cy; - dgkf_struct.Dzw = Dzw; - dgkf_struct.Dzu = Dzu; - dgkf_struct.Dyw = Dyw; - dgkf_struct.Dyu = Dyu; - dgkf_struct.Ru = Ru; - dgkf_struct.Ry = Ry; - dgkf_struct.Dyu_nz = Dyu_nz; - dgkf_struct.dflg = dflg; + dgkf_struct.nw = nw; + dgkf_struct.nu = nu; + dgkf_struct.nz = nz; + dgkf_struct.ny = ny; + dgkf_struct.A = A; + dgkf_struct.Bw = Bw; + dgkf_struct.Bu = Bu; + dgkf_struct.Cz = Cz; + dgkf_struct.Cy = Cy; + dgkf_struct.Dzw = Dzw; + dgkf_struct.Dzu = Dzu; + dgkf_struct.Dyw = Dyw; + dgkf_struct.Dyu = Dyu; + dgkf_struct.Ru = Ru; + dgkf_struct.Ry = Ry; + dgkf_struct.Dyu_nz = Dyu_nz; + dgkf_struct.dflg = dflg; endfunction