WOLFRAM SYSTEM MODELER

# continuousRiccatiIterative

Newton's method with exact line search for iterative solving continuous algebraic Riccati equation # Wolfram Language

In:= `SystemModel["Modelica.Math.Matrices.Utilities.continuousRiccatiIterative"]`
Out:= # Information

This information is part of the Modelica Standard Library maintained by the Modelica Association.

#### Syntax

```           X = Matrices.Utilities.continuousRiccatiIterative(A, B, R, Q, X0);
(X, r) = Matrices.Utilities.continuousRiccatiIterative(A, B, R, Q, X0, maxSteps, eps);
```

#### Description

This function provides a Newton-like method for solving continuous algebraic Riccati equations (care). It utilizes Exact Line Search to improve the sometimes erratic convergence of Newton's method. Exact line search in this case means, that at each iteration `i` a Newton step `delta_i`

```  X_i+1 = X_i + delta_i
```

is taken in the direction to minimize the Frobenius norm of the residual

```    r = || X_i+1*A +A'*X_i+1 - X_i+1*G*X_i+1 + Q ||.
```

with

```        -1
G = B*R *B'
```

The inputs "maxSteps" and "eps" specify the termination of the iteration. The iteration is terminated if either maxSteps iteration steps have been performed or the relative change delta_i/X_i became smaller than eps.

With an appropriate initial value X0 a sufficiently accurate solution might be reach within a few iteration steps. Although a Lyapunov equation of order `n` (n is the order of the Riccati equation) is to be solved at each iteration step, the algorithm might be faster than a direct method like Matrices.continuousRiccati, since direct methods have to solve the 2*n-order Hamiltonian system equation.
The algorithm is taken from  and .

#### References

```   Benner, P., Byers, R.
An Exact Line Search Method for Solving Generalized Continuous-Time Algebraic Riccati Equations
IEEE Transactions On Automatic Control, Vol. 43, No. 1, pp. 101-107, 1998.
 Datta, B.N.
Numerical Methods for Linear Control Systems
```

#### Example

```     A=[0.0,         1.0,         0.0,         0.0;
0.0,        -1.890,       3.900e-01,  -5.530;
0.0,        -3.400e-02,  -2.980,       2.430;
3.400e-02,  -1.100e-03,  -9.900e-01,  -2.100e-01];

B=[ 0.0,         0.0;
3.600e-01,  -1.60;
-9.500e-01,  -3.200e-02;
3.000e-02,   0.0];

R=[1, 0; 0, 1];

Q=[2.313,       2.727,       6.880e-01,   2.300e-02;
2.727,       4.271,       1.148,       3.230e-01;
6.880e-01,   1.148,       3.130e-01,   1.020e-01;
2.300e-02,   3.230e-01,   1.020e-01,   8.300e-02];

X0=identity(4);

(X,r) = Matrices.Utilities.continuousRiccatiIterative(A, B, R, Q, X0);

//  X = [1.3239,  0.9015,  0.5466, -1.7672;
0.9015,  0.9607,  0.4334, -1.1989;
0.5466,  0.4334,  0.4605, -1.3633;
-1.7672, -1.1989, -1.3633,  4.4612]
// r =  2.48809423389491E-015

(,r) = Matrices.Utilities.continuousRiccatiIterative(A, B, R, Q, X0,4);

// r =  0.0004;

```

Matrices.Utilities.discreteRiccatiIterative
Matrices.continuousRiccati

# Syntax

(X, r) = continuousRiccatiIterative(A, B, R, Q, X0, maxSteps, eps)

# Inputs (7)

A Type: Real[:,size(A, 1)] Description: Matrix A of Riccati equation X*A + A'*X -X*G*X +Q = 0 Type: Real[size(A, 1),:] Description: Matrix B in G = B*inv(R)*B' Default Value: identity(size(B, 2)) Type: Real[size(B, 2),size(B, 2)] Description: Matrix R in G = B*inv(R)*B' Default Value: identity(size(A, 1)) Type: Real[size(A, 1),size(A, 2)] Description: Matrix Q of Riccati equation X*A + A'*X -X*G*X +Q = 0 Default Value: identity(size(A, 1)) Type: Real[size(A, 1),size(A, 2)] Description: Initial approximate solution for X*A + A'*X -X*G*X +Q = 0 Default Value: 10 Type: Integer Description: Maximal number of iteration steps Default Value: Matrices.frobeniusNorm(A) * 1e-9 Type: Real Description: Tolerance for stop criterion

# Outputs (2)

X Type: Real[size(X0, 1),size(X0, 2)] Description: Solution X of Riccati equation X*A + A'*X -X*G*X +Q = 0 Type: Real Description: Norm of X*A + A'*X - X*G*X + Q, zero for exact solution

# Revisions

• 2010/04/30 by Marcus Baur, DLR-RM