pymor.algorithms.riccati

Module Contents

pymor.algorithms.riccati.solve_pos_ricc_dense(A, E, B, C, R=None, S=None, trans=False, options=None, default_solver_backend=_DEFAULT_RICC_DENSE_SOLVER_BACKEND)[source]

Compute the solution of a Riccati equation.

Returns the solution \(X\) of a (generalized) continuous-time algebraic Riccati equation:

  • if trans is False

    \[A X E^T + E X A^T + (E X C^T + S^T) R^{-1} (C X E^T + S) + B B^T = 0.\]
  • if trans is True

    \[A^T X E + E^T X A + (E^T X B + S) R^{-1} (B^T X E + S^T) + C^T C = 0.\]

If E is None, it is taken to be identity, and similarly for R. If S is None, it is taken to be zero.

We assume:

  • A, E, B, C, R, S are real NumPy arrays,

  • E is nonsingular,

  • (E, A, B, C) is stabilizable and detectable,

  • R is symmetric positive definite, and

  • \(B B^T - S^T R^{-1} S\) (\(C^T C - S R^{-1} S^T\)) is positive semi-definite if trans is False (True).

If the solver is not specified using the options argument, a solver backend is chosen based on availability in the following order:

  1. slycot (see pymor.bindings.slycot.solve_ricc_dense)

  2. scipy (see pymor.bindings.scipy.solve_ricc_dense)

Parameters

A

The matrix A as a 2D NumPy array.

E

The matrix E as a 2D NumPy array or None.

B

The matrix B as a 2D NumPy array.

C

The matrix C as a 2D NumPy array.

R

The matrix B as a 2D NumPy array or None.

S

The matrix S as a 2D NumPy array or None.

trans

Whether the first matrix in the Riccati equation is transposed.

options

The solver options to use. See:

default_solver_backend

Default solver backend to use (slycot, scipy).

Returns

X

Riccati equation solution as a NumPy array.

pymor.algorithms.riccati.solve_pos_ricc_lrcf(A, E, B, C, R=None, S=None, trans=False, options=None, default_dense_solver_backend=_DEFAULT_RICC_LRCF_DENSE_SOLVER_BACKEND)[source]

Compute an approximate low-rank solution of a positive Riccati equation.

Returns a low-rank Cholesky factor \(Z\) such that \(Z Z^T\) approximates the solution \(X\) of a (generalized) positive continuous-time algebraic Riccati equation:

  • if trans is False

    \[A X E^T + E X A^T + (E X C^T + S^T) R^{-1} (C X E^T + S) + B B^T = 0.\]
  • if trans is True

    \[A^T X E + E^T X A + (E^T X B + S) R^{-1} (B^T X E + S^T) + C^T C = 0.\]

If E is None, it is taken to be identity, and similarly for R. If S is None, it is taken to be zero.

If the solver is not specified using the options argument, a solver backend is chosen based on availability in the following order:

  1. slycot (see pymor.bindings.slycot.solve_pos_ricc_lrcf),

  2. scipy (see pymor.bindings.scipy.solve_pos_ricc_lrcf).

Currently, only dense solvers are provided.

Parameters

A

The non-parametric Operator A.

E

The non-parametric Operator E or None.

B

The operator B as a VectorArray from A.source.

C

The operator C as a VectorArray from A.source.

R

The matrix R as a 2D NumPy array or None.

S

The operator S as a VectorArray from A.source or None.

trans

Whether the first Operator in the positive Riccati equation is transposed.

options

The solver options to use. See:

default_dense_solver_backend

Default dense solver backend to use (slycot, scipy, pymess).

Returns

Z

Low-rank Cholesky factor of the positive Riccati equation solution, VectorArray from A.source.

pymor.algorithms.riccati.solve_ricc_dense(A, E, B, C, R=None, S=None, trans=False, options=None, default_solver_backend=_DEFAULT_RICC_DENSE_SOLVER_BACKEND)[source]

Compute the solution of a Riccati equation.

Returns the solution \(X\) of a (generalized) continuous-time algebraic Riccati equation:

  • if trans is False

    \[A X E^T + E X A^T - (E X C^T + S^T) R^{-1} (C X E^T + S) + B B^T = 0.\]
  • if trans is True

    \[A^T X E + E^T X A - (E^T X B + S) R^{-1} (B^T X E + S^T) + C^T C = 0.\]

If E is None, it is taken to be identity, and similarly for R. If S is None, it is taken to be zero.

We assume:

  • A, E, B, C, R, S are real NumPy arrays,

  • E is nonsingular,

  • (E, A, B, C) is stabilizable and detectable,

  • R is symmetric positive definite, and

  • \(B B^T - S^T R^{-1} S\) (\(C^T C - S R^{-1} S^T\)) is positive semi-definite if trans is False (True).

If the solver is not specified using the options argument, a solver backend is chosen based on availability in the following order:

  1. slycot (see pymor.bindings.slycot.solve_ricc_dense)

  2. scipy (see pymor.bindings.scipy.solve_ricc_dense)

Parameters

A

The matrix A as a 2D NumPy array.

E

The matrix E as a 2D NumPy array or None.

B

The matrix B as a 2D NumPy array.

C

The matrix C as a 2D NumPy array.

R

The matrix B as a 2D NumPy array or None.

S

The matrix S as a 2D NumPy array or None.

trans

Whether the first matrix in the Riccati equation is transposed.

options

The solver options to use. See:

default_solver_backend

Default solver backend to use (slycot, scipy).

Returns

X

Riccati equation solution as a NumPy array.

pymor.algorithms.riccati.solve_ricc_lrcf(A, E, B, C, R=None, S=None, trans=False, options=None, default_sparse_solver_backend=_DEFAULT_RICC_LRCF_SPARSE_SOLVER_BACKEND, default_dense_solver_backend=_DEFAULT_RICC_LRCF_DENSE_SOLVER_BACKEND)[source]

Compute an approximate low-rank solution of a Riccati equation.

Returns a low-rank Cholesky factor \(Z\) such that \(Z Z^T\) approximates the solution \(X\) of a (generalized) continuous-time algebraic Riccati equation:

  • if trans is False

    \[A X E^T + E X A^T - (E X C^T + S^T) R^{-1} (C X E^T + S) + B B^T = 0.\]
  • if trans is True

    \[A^T X E + E^T X A - (E^T X B + S) R^{-1} (B^T X E + S^T) + C^T C = 0.\]

If E is None, it is taken to be identity, and similarly for R. If S is None, it is taken to be zero.

We assume:

  • A and E are real Operators,

  • B, C and S are real VectorArrays from A.source,

  • R is a real NumPy array,

  • E is nonsingular,

  • (E, A, B, C) is stabilizable and detectable,

  • R is symmetric positive definite, and

  • \(B B^T - S^T R^{-1} S\) (\(C^T C - S R^{-1} S^T\)) is positive semi-definite if trans is False (True).

For large-scale problems, we additionally assume that len(B) and len(C) are small.

If the solver is not specified using the options argument, a solver backend is chosen based on availability in the following order:

Parameters

A

The non-parametric Operator A.

E

The non-parametric Operator E or None.

B

The operator B as a VectorArray from A.source.

C

The operator C as a VectorArray from A.source.

R

The matrix R as a 2D NumPy array or None.

S

The operator S as a VectorArray from A.source or None.

trans

Whether the first Operator in the Riccati equation is transposed.

options

The solver options to use. See:

default_sparse_solver_backend

Default sparse solver backend to use (lrradi, pymess).

default_dense_solver_backend

Default dense solver backend to use (slycot, scipy, pymess).

Returns

Z

Low-rank Cholesky factor of the Riccati equation solution, VectorArray from A.source.