File: SB03OY.html

package info (click to toggle)
slicot 5.9.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 23,528 kB
  • sloc: fortran: 148,076; makefile: 964; sh: 57
file content (196 lines) | stat: -rw-r--r-- 6,980 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
<HTML>
<HEAD><TITLE>SB03OY - SLICOT Library Routine Documentation</TITLE>
</HEAD>
<BODY>

<H2><A Name="SB03OY">SB03OY</A></H2>
<H3>
Solving (for Cholesky factor) stable 2-by-2 continuous- or discrete-time Lyapunov equations, with matrix A having complex conjugate eigenvalues
</H3>
<A HREF ="#Specification"><B>[Specification]</B></A>
<A HREF ="#Arguments"><B>[Arguments]</B></A>
<A HREF ="#Method"><B>[Method]</B></A>
<A HREF ="#References"><B>[References]</B></A>
<A HREF ="#Comments"><B>[Comments]</B></A>
<A HREF ="#Example"><B>[Example]</B></A>

<P>
<B><FONT SIZE="+1">Purpose</FONT></B>
<PRE>
  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.

</PRE>
<A name="Specification"><B><FONT SIZE="+1">Specification</FONT></B></A>
<PRE>
      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,*)

</PRE>
<A name="Arguments"><B><FONT SIZE="+1">Arguments</FONT></B></A>
<P>

<B>Mode Parameters</B>
<PRE>
  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.

</PRE>
<B>Input/Output Parameters</B>
<PRE>
  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 &gt;= 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 &gt;= 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 &gt;= 2.

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

</PRE>
<B>Error Indicator</B>
<PRE>
  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.

</PRE>
<A name="Method"><B><FONT SIZE="+1">Method</FONT></B></A>
<PRE>
  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.

</PRE>
<A name="References"><B><FONT SIZE="+1">References</FONT></B></A>
<PRE>
  [1] Hammarling S. J.
      Numerical solution of the stable, non-negative definite
      Lyapunov equation.
      IMA J. Num. Anal., 2, pp. 303-325, 1982.

</PRE>
<A name="Numerical Aspects"><B><FONT SIZE="+1">Numerical Aspects</FONT></B></A>
<PRE>
  The algorithm is backward stable.

</PRE>

<A name="Comments"><B><FONT SIZE="+1">Further Comments</FONT></B></A>
<PRE>
  None
</PRE>

<A name="Example"><B><FONT SIZE="+1">Example</FONT></B></A>
<P>
<B>Program Text</B>
<PRE>
  None
</PRE>
<B>Program Data</B>
<PRE>
  None
</PRE>
<B>Program Results</B>
<PRE>
  None
</PRE>

<HR>
<A HREF=support.html><B>Return to Supporting Routines index</B></A></BODY>
</HTML>