## SB03OT

### Solving (for Cholesky factor) stable continuous- or discrete-time Lyapunov equations, with matrix S quasi-triangular and R triangular

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

Purpose

      To solve for X = op(U)'*op(U) either the stable non-negative
      definite continuous-time Lyapunov equation
                                    2
         op(S)'*X + X*op(S) = -scale *op(R)'*op(R)                   (1)

      or the convergent non-negative definite discrete-time Lyapunov
      equation
                                    2
         op(S)'*X*op(S) - X = -scale *op(R)'*op(R)                   (2)

      where op(K) = K or K' (i.e., the transpose of the matrix K), S is
      an N-by-N block upper triangular matrix with one-by-one or
      two-by-two blocks on the diagonal, R is an N-by-N upper triangular
      matrix, and scale is an output scale factor, set less than or
      equal to 1 to avoid overflow in X.

      In the case of equation (1) the matrix S must be stable (that
      is, all the eigenvalues of S must have negative real parts),
      and for equation (2) the matrix S must be convergent (that is,
      all the eigenvalues of S must lie inside the unit circle).

Specification

          SUBROUTINE SB03OT( DISCR, LTRANS, N, S, LDS, R, LDR, SCALE, DWORK,
         $                   INFO )
    C     .. Scalar Arguments ..
          LOGICAL           DISCR, LTRANS
          INTEGER           INFO, LDR, LDS, N
          DOUBLE PRECISION  SCALE
    C     .. Array Arguments ..
          DOUBLE PRECISION  DWORK(*), R(LDR,*), S(LDS,*)

Arguments

Mode Parameters

      DISCR   LOGICAL
              Specifies the type of Lyapunov equation to be solved as
              follows:
              = .TRUE. :  Equation (2), discrete-time case;
              = .FALSE.:  Equation (1), continuous-time case.

      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).

Input/Output Parameters

      N       (input) INTEGER
              The order of the matrices S and R.  N >= 0.

      S       (input) DOUBLE PRECISION array of dimension (LDS,N)
              The leading N-by-N upper Hessenberg part of this array
              must contain the block upper triangular matrix.
              The elements below the upper Hessenberg part of the array
              S are not referenced. The 2-by-2 blocks must only
              correspond to complex conjugate pairs of eigenvalues (not
              to real eigenvalues).

      LDS     INTEGER
              The leading dimension of array S.  LDS >= MAX(1,N).

      R       (input/output) DOUBLE PRECISION array of dimension (LDR,N)
              On entry, the leading N-by-N upper triangular part of this
              array must contain the upper triangular matrix R.
              On exit, the leading N-by-N upper triangular part of this
              array contains the upper triangular matrix U.
              The strict lower triangle of R is not referenced.

      LDR     INTEGER
              The leading dimension of array R.  LDR >= MAX(1,N).

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

Workspace

      DWORK   DOUBLE PRECISION array, dimension (4*N)

Error Indicator

      INFO    INTEGER
              = 0:  successful exit;
              < 0:  if INFO = -i, the i-th argument had an illegal
                    value;
              = 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 the matrix S is not stable (that is, one or more
                    of the eigenvalues of S has a non-negative real
                    part), if DISCR = .FALSE., or not convergent (that
                    is, one or more of the eigenvalues of S lies outside
                    the unit circle), if DISCR = .TRUE.;
              = 3:  if the matrix S has two or more consecutive non-zero
                    elements on the first sub-diagonal, so that there is
                    a block larger than 2-by-2 on the diagonal;
              = 4:  if the matrix S has a 2-by-2 diagonal block with
                    real eigenvalues instead of a complex conjugate
                    pair.

Method

      The method used by the routine is based on a variant of the
      Bartels and Stewart backward substitution method [1], that finds
      the Cholesky factor op(U) directly without first finding X and
      without the need to form the normal matrix op(R)'*op(R) [2].

      The continuous-time Lyapunov equation in the canonical form
                                                         2
        op(S)'*op(U)'*op(U) + op(U)'*op(U)*op(S) = -scale *op(R)'*op(R),

      or the discrete-time Lyapunov equation in the canonical form
                                                         2
        op(S)'*op(U)'*op(U)*op(S) - op(U)'*op(U) = -scale *op(R)'*op(R),

      where U and R are upper triangular, is solved for U.

References

      [1] Bartels, R.H. and Stewart, G.W.
          Solution of the matrix equation  A'X + XB = C.
          Comm. A.C.M., 15, pp. 820-826, 1972.

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

Numerical Aspects

                                3
      The algorithm requires 0(N ) operations and is backward stable.

Further Comments

      The Lyapunov equation may be very ill-conditioned. In particular
      if S is only just stable (or convergent) then the Lyapunov
      equation will be ill-conditioned. "Large" elements in U relative
      to those of S and R, or a "small" value for scale, is a symptom
      of ill-conditioning. A condition estimate can be computed using
      SLICOT Library routine SB03MD.

Example

Program Text

      None

Program Data

      None

Program Results

      None

Return to Supporting Routines index