# riccati

Riccati equation

## Calling Sequence

    X=riccati(A,B,C,dom,[typ])
                [X1,X2]=riccati(A,B,C,dom,[typ])

## Arguments

A,B,C

  real matrices nxn, `B` and `C` symmetric.

dom

  `'c'` or `'d'` for the time domain (continuous or discrete)

typ

  string : `'eigen'` for block diagonalization or `schur'` for Schur method.

X1,X2,X

  square real matrices (X2 invertible), X symmetric

## Description

`X=riccati(A,B,C,dom,[typ])` solves the Riccati equation:

    A'*X+X*A-X*B*X+C=0

in continuous time case, or:

    A'*X*A-(A'*X*B1/(B2+B1'*X*B1))*(B1'*X*A)+C-X

with `B=B1/B2*B1'` in the discrete time case. If called with two output arguments, `riccati` returns `X1,X2` such that `X=X1/X2`.

## Examples

    // Continuous
    n = 10;
    A = rand(n,n);
    B = rand(n,n);
    C = rand(n,n);
    C = C*C';
    R = rand(n,n);
    R = R*R'+eye();
    B = B*inv(R)*B';

    X = riccati(A,B,C,'c','eigen')

    // Discrete

    n = 10;
    F = rand(n,n);
    G1      = rand(n,n);
    G2 = rand(n,n);
    G2 = G2*G2'+eye();
    G      = G1/G2*G1';
    H      = rand(n,n);
    H = H*H';

    [X1,X2]= riccati(F,G,H,'d','schur')

## See Also

- ricc
- ric_desc