Purpose
  To estimate the separation between the matrices op(A) and -op(A)',
  sep(op(A),-op(A)') = min norm(op(A)'*X + X*op(A))/norm(X)
                     = 1 / norm(inv(Omega))
  and/or the 1-norm of Theta, where op(A) = A or A' (A**T), and
  Omega and Theta are linear operators associated to the real
  continuous-time Lyapunov matrix equation
         op(A)'*X + X*op(A) = C,
  defined by
  Omega(W) = op(A)'*W + W*op(A),
  Theta(W) = inv(Omega(op(W)'*X + X*op(W))).
  The 1-norm condition estimators are used.
Specification
      SUBROUTINE SB03QY( JOB, TRANA, LYAPUN, N, T, LDT, U, LDU, X, LDX,
     $                   SEP, THNORM, IWORK, DWORK, LDWORK, INFO )
C     .. Scalar Arguments ..
      CHARACTER          JOB, LYAPUN, TRANA
      INTEGER            INFO, LDT, LDU, LDWORK, LDX, N
      DOUBLE PRECISION   SEP, THNORM
C     .. Array Arguments ..
      INTEGER            IWORK( * )
      DOUBLE PRECISION   DWORK( * ), T( LDT, * ), U( LDU, * ),
     $                   X( LDX, * )
Arguments
Mode Parameters
  JOB     CHARACTER*1
          Specifies the computation to be performed, as follows:
          = 'S':  Compute the separation only;
          = 'T':  Compute the norm of Theta only;
          = 'B':  Compute both the separation and the norm of Theta.
  TRANA   CHARACTER*1
          Specifies the form of op(A) to be used, as follows:
          = 'N':  op(A) = A    (No transpose);
          = 'T':  op(A) = A**T (Transpose);
          = 'C':  op(A) = A**T (Conjugate transpose = Transpose).
  LYAPUN  CHARACTER*1
          Specifies whether or not the original Lyapunov equations
          should be solved, as follows:
          = 'O':  Solve the original Lyapunov equations, updating
                  the right-hand sides and solutions with the
                  matrix U, e.g., X <-- U'*X*U;
          = 'R':  Solve reduced Lyapunov equations only, without
                  updating the right-hand sides and solutions.
Input/Output Parameters
  N       (input) INTEGER
          The order of the matrices A and X.  N >= 0.
  T       (input) DOUBLE PRECISION array, dimension (LDT,N)
          The leading N-by-N upper Hessenberg part of this array
          must contain the upper quasi-triangular matrix T in Schur
          canonical form from a Schur factorization of A.
  LDT     INTEGER
          The leading dimension of array T.  LDT >= MAX(1,N).
  U       (input) DOUBLE PRECISION array, dimension (LDU,N)
          The leading N-by-N part of this array must contain the
          orthogonal matrix U from a real Schur factorization of A.
          If LYAPUN = 'R', the array U is not referenced.
  LDU     INTEGER
          The leading dimension of array U.
          LDU >= 1,        if LYAPUN = 'R';
          LDU >= MAX(1,N), if LYAPUN = 'O'.
  X       (input) DOUBLE PRECISION array, dimension (LDX,N)
          The leading N-by-N part of this array must contain the
          solution matrix X of the Lyapunov equation (reduced
          Lyapunov equation if LYAPUN = 'R').
          If JOB = 'S', the array X is not referenced.
  LDX     INTEGER
          The leading dimension of array X.
          LDX >= 1,        if JOB = 'S';
          LDX >= MAX(1,N), if JOB = 'T' or 'B'.
  SEP     (output) DOUBLE PRECISION
          If JOB = 'S' or JOB = 'B', and INFO >= 0, SEP contains the
          estimated separation of the matrices op(A) and -op(A)'.
          If JOB = 'T' or N = 0, SEP is not referenced.
  THNORM  (output) DOUBLE PRECISION
          If JOB = 'T' or JOB = 'B', and INFO >= 0, THNORM contains
          the estimated 1-norm of operator Theta.
          If JOB = 'S' or N = 0, THNORM is not referenced.
Workspace
  IWORK   INTEGER array, dimension (N*N)
  DWORK   DOUBLE PRECISION array, dimension (LDWORK)
  LDWORK  INTEGER
          The length of the array DWORK.  LDWORK >= 2*N*N.
Error Indicator
  INFO    INTEGER
          = 0:  successful exit;
          < 0:  if INFO = -i, the i-th argument had an illegal
                value;
          = N+1:  if the matrices T and -T' have common or very
                close eigenvalues; perturbed values were used to
                solve Lyapunov equations (but the matrix T is
                unchanged).
Method
  SEP is defined as the separation of op(A) and -op(A)':
         sep( op(A), -op(A)' ) = sigma_min( K )
  where sigma_min(K) is the smallest singular value of the
  N*N-by-N*N matrix
     K = kprod( I(N), op(A)' ) + kprod( op(A)', I(N) ).
  I(N) is an N-by-N identity matrix, and kprod denotes the Kronecker
  product. The routine estimates sigma_min(K) by the reciprocal of
  an estimate of the 1-norm of inverse(K), computed as suggested in
  [1]. This involves the solution of several continuous-time
  Lyapunov equations, either direct or transposed. The true
  reciprocal 1-norm of inverse(K) cannot differ from sigma_min(K) by
  more than a factor of N.
  The 1-norm of Theta is estimated similarly.
References
  [1] Higham, N.J.
      FORTRAN codes for estimating the one-norm of a real or
      complex matrix, with applications to condition estimation.
      ACM Trans. Math. Softw., 14, pp. 381-396, 1988.
Numerical Aspects
3 The algorithm requires 0(N ) operations.Further Comments
When SEP is zero, the routine returns immediately, with THNORM (if requested) not set. In this case, the equation is singular. The option LYAPUN = 'R' may occasionally produce slightly worse or better estimates, and it is much faster than the option 'O'.Example
Program Text
NoneProgram Data
NoneProgram Results
None