SB03OY

Solving (for Cholesky factor) stable 2-by-2 continuous- or discrete-time Lyapunov equations, with matrix A having complex conjugate eigenvalues

[Specification] [Arguments] [Method] [References] [Comments] [Example]

Purpose

  To solve for the Cholesky factor  U  of  X,

     op(U)'*op(U) = X,

  where  U  is a two-by-two upper triangular matrix, either the
  continuous-time two-by-two Lyapunov equation
                                      2
      op(S)'*X + X*op(S) = -ISGN*scale *op(R)'*op(R),

  when DISCR = .FALSE., or the discrete-time two-by-two Lyapunov
  equation
                                      2
      op(S)'*X*op(S) - X = -ISGN*scale *op(R)'*op(R),

  when DISCR = .TRUE., where op(K) = K or K' (i.e., the transpose of
  the matrix K),  S  is a two-by-two matrix with complex conjugate
  eigenvalues,  R  is a two-by-two upper triangular matrix,
  ISGN = -1 or 1,  and  scale  is an output scale factor, set less
  than or equal to 1 to avoid overflow in  X.  The routine also
  computes two matrices, B and A, so that
                                2
     B*U = U*S  and  A*U = scale *R,  if  LTRANS = .FALSE.,  or
                                2
     U*B = S*U  and  U*A = scale *R,  if  LTRANS = .TRUE.,
  which are used by the general Lyapunov solver.
  In the continuous-time case  ISGN*S  must be stable, so that its
  eigenvalues must have strictly negative real parts.
  In the discrete-time case  S  must be convergent if ISGN = 1, that
  is, its eigenvalues must have moduli less than unity, or  S  must
  be completely divergent if ISGN = -1, that is, its eigenvalues
  must have moduli greater than unity.

Specification
      SUBROUTINE SB03OY( DISCR, LTRANS, ISGN, S, LDS, R, LDR, A, LDA,
     $                   SCALE, INFO )
C     .. Scalar Arguments ..
      LOGICAL           DISCR, LTRANS
      INTEGER           INFO, ISGN, LDA, LDR, LDS
      DOUBLE PRECISION  SCALE
C     .. Array Arguments ..
      DOUBLE PRECISION  A(LDA,*), R(LDR,*), S(LDS,*)

Arguments

Mode Parameters

  DISCR   LOGICAL
          Specifies the equation to be solved:       2
          = .FALSE.: op(S)'*X + X*op(S) = -ISGN*scale *op(R)'*op(R);
                                                     2
          = .TRUE. : op(S)'*X*op(S) - X = -ISGN*scale *op(R)'*op(R).

  LTRANS  LOGICAL
          Specifies the form of op(K) to be used, as follows:
          = .FALSE.:  op(K) = K    (No transpose);
          = .TRUE. :  op(K) = K**T (Transpose).

  ISGN    INTEGER
          Specifies the sign of the equation as described before.
          ISGN may only be 1 or -1.

Input/Output Parameters
  S       (input/output) DOUBLE PRECISION array, dimension (LDS,2)
          On entry, S must contain a 2-by-2 matrix.
          On exit, S contains a 2-by-2 matrix B such that B*U = U*S,
          if LTRANS = .FALSE., or U*B = S*U, if LTRANS = .TRUE..
          Notice that if U is nonsingular then
            B = U*S*inv( U ),  if LTRANS = .FALSE.
            B = inv( U )*S*U,  if LTRANS = .TRUE..

  LDS     INTEGER
          The leading dimension of array S.  LDS >= 2.

  R       (input/output) DOUBLE PRECISION array, dimension (LDR,2)
          On entry, R must contain a 2-by-2 upper triangular matrix.
          The element R( 2, 1 ) is not referenced.
          On exit, R contains U, the 2-by-2 upper triangular
          Cholesky factor of the solution X, X = op(U)'*op(U).

  LDR     INTEGER
          The leading dimension of array R.  LDR >= 2.

  A       (output) DOUBLE PRECISION array, dimension (LDA,2)
          A contains a 2-by-2 upper triangular matrix A satisfying
          A*U/scale = scale*R, if LTRANS = .FALSE., or
          U*A/scale = scale*R, if LTRANS = .TRUE..
          Notice that if U is nonsingular then
            A = scale*scale*R*inv( U ),  if LTRANS = .FALSE.
            A = scale*scale*inv( U )*R,  if LTRANS = .TRUE..

  LDA     INTEGER
          The leading dimension of array A.  LDA >= 2.

  SCALE   (output) DOUBLE PRECISION
          The scale factor, scale, set less than or equal to 1 to
          prevent the solution overflowing.

Error Indicator
  INFO    INTEGER
          = 0:  successful exit;
          = 1:  if the Lyapunov equation is (nearly) singular
                (warning indicator);
                if DISCR = .FALSE., this means that while the
                matrix S has computed eigenvalues with negative real
                parts, it is only just stable in the sense that
                small perturbations in S can make one or more of the
                eigenvalues have a non-negative real part;
                if DISCR = .TRUE., this means that while the
                matrix S has computed eigenvalues inside the unit
                circle, it is nevertheless only just convergent, in
                the sense that small perturbations in S can make one
                or more of the eigenvalues lie outside the unit
                circle;
                perturbed values were used to solve the equation
                (but the matrix S is unchanged);
          = 2:  if DISCR = .FALSE., and ISGN*S is not stable or
                if DISCR = .TRUE., ISGN = 1 and S is not convergent
                or if DISCR = .TRUE., ISGN = -1 and S is not
                completely divergent;
          = 4:  if S has real eigenvalues.

  NOTE: In the interests of speed, this routine does not check all
        inputs for errors.

Method
  The LAPACK scheme for solving 2-by-2 Sylvester equations is
  adapted for 2-by-2 Lyapunov equations, but directly computing the
  Cholesky factor of the solution.

References
  [1] Hammarling S. J.
      Numerical solution of the stable, non-negative definite
      Lyapunov equation.
      IMA J. Num. Anal., 2, pp. 303-325, 1982.

Numerical Aspects
  The algorithm is backward stable.

Further Comments
  None
Example

Program Text

  None
Program Data
  None
Program Results
  None

Return to Supporting Routines index