Main Content

(Not recommended) Continuous-time algebraic Riccati equation solution

`care`

is not recommended. Use `icare`

instead. For more information, see Compatibility Considerations.

`[X,L,G] = care(A,B,Q)`

[X,L,G] = care(A,B,Q,R,S,E)

[X,L,G,report] = care(A,B,Q,...)

[X1,X2,D,L] = care(A,B,Q,...,'factor')

`[X,L,G] = care(A,B,Q)`

computes the unique solution
`X`

of the continuous-time algebraic Riccati equation

$${A}^{T}X+XA-XB{B}^{T}X+Q=0$$

The `care`

function also returns the gain matrix, $$G={R}^{-1}{B}^{T}XE$$.

`[X,L,G] = care(A,B,Q,R,S,E)`

solves the more general Riccati
equation

$${A}^{T}XE+{E}^{T}XA-({E}^{T}XB+S){R}^{-1}({B}^{T}XE+{S}^{T})+Q=0$$

When omitted, `R`

, `S`

, and `E`

are
set to the default values `R=I`

, `S=0`

, and
`E=I`

. Along with the solution `X`

,
`care`

returns the gain matrix $$G={R}^{-1}({B}^{T}XE+{S}^{T})$$ and a vector `L`

of closed-loop eigenvalues, where

L=eig(A-B*G,E)

`[X,L,G,report] = care(A,B,Q,...)`

returns a diagnosis
`report`

with:

This syntax does not issue any error message when X fails to exist.

`[X1,X2,D,L] = care(A,B,Q,...,'factor')`

returns two matrices
`X1`

, `X2`

and a diagonal scaling matrix
`D`

such that `X = D*(X2/X1)*D`

.

The vector L contains the closed-loop eigenvalues. All outputs are empty when the associated Hamiltonian matrix has eigenvalues on the imaginary axis.

**Solve Algebraic Riccati Equation**

Given

$$A=\left[\begin{array}{cc}-3& 2\\ 1& 1\end{array}\right]\text{\hspace{1em}}\text{\hspace{1em}}B=\left[\begin{array}{c}0\\ 1\end{array}\right]\text{\hspace{1em}}\text{\hspace{1em}}C=\left[\begin{array}{cc}1& -1\end{array}\right]\text{\hspace{1em}}\text{\hspace{1em}}R=3$$

you can solve the Riccati equation

$${A}^{T}X+XA-XB{R}^{-1}{B}^{T}X+{C}^{T}C=0$$

by

a = [-3 2;1 1] b = [0 ; 1] c = [1 -1] r = 3 [x,l,g] = care(a,b,c'*c,r)

This yields the solution

x x = 0.5895 1.8216 1.8216 8.8188

You can verify that this solution is indeed stabilizing by comparing the
eigenvalues of `a`

and `a-b*g`

.

[eig(a) eig(a-b*g)] ans = -3.4495 -3.5026 1.4495 -1.4370

Finally, note that the variable `l`

contains the closed-loop
eigenvalues `eig(a-b*g)`

.

l l = -3.5026 -1.4370

**Solve H-infinity ($${H}_{\infty}$$)-like Riccati Equation**

To solve the $${H}_{\infty}$$-like Riccati equation

$${A}^{T}X+XA+X({\gamma}^{-2}{B}_{1}{B}_{1}^{T}-{B}_{2}{B}_{2}^{T})X+{C}^{T}C=0$$

rewrite it in the `care`

format as

$${A}^{T}X+XA-X\text{\hspace{0.17em}}\underset{B}{\underbrace{[{B}_{1},{B}_{2}]}}\text{\hspace{0.17em}}\text{\hspace{0.17em}}{\underset{R}{\underbrace{\left[\begin{array}{cc}-{\gamma}^{2}I& 0\\ 0& I\end{array}\right]}}}^{-1}\left[\begin{array}{c}{B}_{1}^{T}\\ {B}_{2}^{T}\end{array}\right]X+{C}^{T}C=0$$

You can now compute the stabilizing solution $$X$$ by

B = [B1 , B2] m1 = size(B1,2) m2 = size(B2,2) R = [-g^2*eye(m1) zeros(m1,m2) ; zeros(m2,m1) eye(m2)] X = care(A,B,C'*C,R)

The $$(A,B)$$ pair must be stabilizable (that is, all unstable modes are controllable). In addition, the associated Hamiltonian matrix or pencil must have no eigenvalue on the imaginary axis. Sufficient conditions for this to hold are $$(Q,A)$$ detectable when $$S=0$$ and $$R>0$$, or

$$\left[\begin{array}{cc}Q& S\\ {S}^{T}& R\end{array}\right]>0$$

`care`

implements the algorithms described in [1]. It works with the Hamiltonian matrix when R is well-conditioned and $$E=I$$; otherwise it uses the extended Hamiltonian pencil and QZ
algorithm.

[1] Arnold, W.F., III and A.J. Laub, "Generalized
Eigenproblem Algorithms and Software for Algebraic Riccati Equations,"
*Proc. IEEE ^{®}*, 72 (1984), pp. 1746-1754