view scripts/control/hinfnorm.m @ 3397:1a8e2c0d627a

[project @ 1999-12-18 03:02:18 by jwe]
author jwe
date Sat, 18 Dec 1999 03:02:45 +0000
parents 10f21f7ccc7f
children 9610d364e444
line wrap: on
line source

## Copyright (C) 1996, 1998 Auburn University.  All rights reserved.
##
## This file is part of Octave. 
##
## Octave is free software; you can redistribute it and/or modify it 
## under the terms of the GNU General Public License as published by the 
## Free Software Foundation; either version 2, or (at your option) any 
## later version. 
## 
## Octave is distributed in the hope that it will be useful, but WITHOUT 
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
## FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
## for more details.
## 
## You should have received a copy of the GNU General Public License 
## along with Octave; see the file COPYING.  If not, write to the Free 
## Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. 

## -*- texinfo -*-
## @deftypefn {Function File } {[@var{g}, @var{gmin}, @var{gmax}] =} hinfnorm(@var{sys}@{, @var{tol}, @var{gmin}, @var{gmax}, @var{ptol}@})
##  Computes the H infinity norm of a system data structure.
## 
## @strong{Inputs}
## @table @var
## @item sys 
## system data structure
## @item tol 
## H infinity norm search tolerance (default: 0.001)
## @item gmin 
## minimum value for norm search (default: 1e-9)
## @item gmax 
## maximum value for norm search (default: 1e+9)
## @item ptol
##  pole tolerance:
## @itemize @bullet
## @item if sys is continuous, poles with 
## |real(pole)| < ptol*||H|| (H is appropriate Hamiltonian)
## are considered to be on the imaginary axis.  
## 
## @item if sys is discrete, poles with
## |abs(pole)-1| < ptol*||[s1,s2]|| (appropriate symplectic pencil)
## are considered to be on the unit circle
## 
## @item Default: 1e-9
## @end itemize
## @end table
## 
## @strong{Outputs}
## @table @var
## @item g
## Computed gain, within @var{tol} of actual gain.  @var{g} is returned as Inf 
## if the system is unstable.
## @item gmin, gmax
## Actual system gain lies in the interval [@var{gmin}, @var{gmax}]
## @end table
## 
##  References:
##  Doyle, Glover, Khargonekar, Francis, "State space solutions to standard
##     H2 and Hinf control problems", IEEE TAC August 1989
##  Iglesias and Glover, "State-Space approach to discrete-time Hinf control,"
##     Int. J. Control, vol 54, #5, 1991
##  Zhou, Doyle, Glover, "Robust and Optimal Control," Prentice-Hall, 1996
##  $Revision: 1.9 $
## @end deftypefn
 
function [g, gmin, gmax] = hinfnorm (sys, tol, gmin, gmax, ptol)

  if((nargin == 0) || (nargin > 4))
    usage("[g gmin gmax] = hinfnorm(sys[,tol,gmin,gmax,ptol])");
  elseif(!is_struct(sys))
    error("Sys must be a system data structure");
  endif

  ## set defaults where applicable
  if(nargin < 5)
    ptol = 1e-9;	# pole tolerance
  endif
  if(nargin < 4)
    gmax = 1e9;		# max gain value
  endif

  dflg = is_digital(sys);
  sys = sysupdate(sys,"ss");
  [A,B,C,D] = sys2ss(sys);
  [n,nz,m,p] = sysdimensions(sys);

  ## eigenvalues of A must all be stable
  if(!is_stable(sys))
    warning(["hinfnorm: unstable system (is_stable, ptol=",num2str(ptol), ...
      "), returning Inf"]);
    g = Inf;
  endif

  Dnrm = norm(D);
  if(nargin < 3)
    gmin = max(1e-9,Dnrm); 	# min gain value
  elseif(gmin < Dnrm)
    warning(["hinfnorm: setting Gmin=||D||=",num2str(Dnrm)]);
  endif

  if(nargin < 2)
    tol = 0.001;	# convergence measure for gmin, gmax
  endif

  ## check for scalar input arguments 2...5
  if( ! (is_scalar(tol) && is_scalar(gmin) 
	&& is_scalar(gmax) && is_scalar(ptol)) )
    error("hinfnorm: tol, gmin, gmax, ptol must be scalars");
  endif

  In = eye(n+nz);
  Im = eye(m);
  Ip = eye(p);
  ## find the Hinf norm via binary search
  while((gmax/gmin - 1) > tol)
    g = (gmax+gmin)/2;

    if(dflg)
      ## multiply g's through in formulas to avoid extreme magnitudes...
      Rg = g^2*Im - D'*D;
      Ak = A + (B/Rg)*D'*C;
      Ck = g^2*C'*((g^2*Ip-D*D')\C);

      ## set up symplectic generalized eigenvalue problem per Iglesias & Glover
      s1 = [Ak , zeros(nz) ; -Ck, In ];
      s2 = [In, -(B/Rg)*B' ; zeros(nz) , Ak' ];

      ## guard against roundoff again: zero out extremely small values
      ## prior to balancing
      s1 = s1 .* (abs(s1) > ptol*norm(s1,"inf"));
      s2 = s2 .* (abs(s2) > ptol*norm(s2,"inf"));
      [cc,dd,s1,s2] = balance(s1,s2);
      [qza,qzb,zz,pls] = qz(s1,s2,"S");	# ordered qz decomposition
      eigerr = abs(abs(pls)-1);
      normH = norm([s1,s2]);
      Hb = [s1, s2];

      ## check R - B' X B condition (Iglesias and Glover's paper)
      X = zz((nz+1):(2*nz),1:nz)/zz(1:nz,1:nz);
      dcondfailed = min(real( eig(Rg - B'*X*B)) < ptol);
    else
      Rinv = inv(g*g*Im - (D' * D));
      H = [A + B*Rinv*D'*C,        B*Rinv*B'; ...
           -C'*(Ip + D*Rinv*D')*C, -(A + B*Rinv*D'*C)'];
      ## guard against roundoff: zero out extremely small values prior 
      ## to balancing
      H = H .* (abs(H) > ptol*norm(H,"inf"));
      [DD,Hb] = balance(H);
      pls = eig(Hb);
      eigerr = abs(real(pls));
      normH = norm(H);
      dcondfailed = 0;		# digital condition; doesn't apply here
    endif
    if( (min(eigerr) <= ptol * normH) | dcondfailed)
      gmin = g;
    else
      gmax = g;
    endif
  endwhile
endfunction