Methods for dealing with continuous-time algebraic Riccati equations. More...
#include <algebraic_riccati_continuous.h>
Static Public Member Functions | |
static bool | isClosedLoopStable (const Eigen::Ref< const Eigen::MatrixXd > &A, const Eigen::Ref< const Eigen::MatrixXd > &B, const Eigen::Ref< const Eigen::MatrixXd > &G) |
Determine if the closed-loop system is stable. More... | |
static bool | isNumericallyStable (const Eigen::Ref< const Eigen::MatrixXd > &A, const Eigen::Ref< const Eigen::MatrixXd > &B, const Eigen::Ref< const Eigen::MatrixXd > &Q, const Eigen::Ref< const Eigen::MatrixXd > &R) |
Determine if solving the riccati equation seems to be numerically stable. More... | |
static bool | solve (const Eigen::Ref< const Eigen::MatrixXd > &A, const Eigen::Ref< const Eigen::MatrixXd > &B, const Eigen::Ref< const Eigen::MatrixXd > &Q, const Eigen::Ref< const Eigen::MatrixXd > &R, Eigen::MatrixXd &X, Eigen::MatrixXd *G=nullptr) |
Solve continuous-time algebraic Riccati equation. More... | |
Static Protected Member Functions | |
static bool | hasNegativeRealPart (const Eigen::Ref< const Eigen::MatrixXd > &block) |
Predicate for Schur block ordering (see solveRiccatiHamiltonianSchur()) More... | |
static bool | hasRealPartsCloseToZero (const Eigen::Ref< const Eigen::MatrixXd > &matrix) |
Check if the real parts of the provided matrix are close to zero. More... | |
static bool | solveRiccatiHamiltonianSchur (const Eigen::MatrixXd &H, Eigen::MatrixXd &X) |
Solve Hamiltonian via Schur method. More... | |
Methods for dealing with continuous-time algebraic Riccati equations.
The continuous-time algebraic Riccati equation is given by
and
must be stabilizable.
The resulting gain matrix is given by
Add a method that determines if sufficient conditions hold and that (A,B) is stabilizable.
Add support for the more generalized Riccati equation (augmented by matrix S and E) E.g. Hamiltonian for augmentation with S: http://web.dcsc.tudelft.nl/~cscherer/books/thesis.pdf
Definition at line 58 of file algebraic_riccati_continuous.h.
|
inlinestaticprotected |
Predicate for Schur block ordering (see solveRiccatiHamiltonianSchur())
Definition at line 153 of file algebraic_riccati_continuous.h.
|
staticprotected |
Check if the real parts of the provided matrix are close to zero.
Definition at line 103 of file algebraic_riccati_continuous.cpp.
|
static |
Determine if the closed-loop system is stable.
The closed-loop system is stable if the closed-loop eigenvalues exhibit only negative real parts. This method returns true
if has only eigenvalues with negative real parts. Hereby, G denotes the gain matrix obtained from solve().
[in] | A | Open-loop system matrix [n x n] |
[in] | B | Input matrix [n x m] |
[in] | G | Feedback gain matrix according to the solution of the algebraic Riccati equation [m x n] |
Definition at line 180 of file algebraic_riccati_continuous.cpp.
|
static |
Determine if solving the riccati equation seems to be numerically stable.
However, it is not guaranteed...
This method checks the real parts of the egienvalues of the Hamiltonian are close to the imaginary axis. If yet, numerically stability is likely to be not satisfactory (also see Matlabs care solver).
[in] | A | [n x n] matrix |
[in] | B | [n x m] matrix |
[in] | Q | [n x n] matrix |
[in] | R | [m x m] matrix |
Definition at line 196 of file algebraic_riccati_continuous.cpp.
|
static |
Solve continuous-time algebraic Riccati equation.
Solve w.r.t.
.
and
must be stabilizable (all unstable modes are controllable). In addition, the associated Hamiltonian matrix must have no eigenvalue on the imaginary axis. Sufficient conditions: R > 0.
This method optionally returns the gain matrix .
[in] | A | [n x n] matrix |
[in] | B | [n x m] matrix |
[in] | Q | [n x n] matrix |
[in] | R | [m x m] matrix |
[out] | X | Solution of the algebraic Riccati equation with size [n x n] (must not be preallocated). |
[out] | G | Gain matrix G = R^{-1} B^T X with size [m x n] (optional) |
Definition at line 40 of file algebraic_riccati_continuous.cpp.
|
staticprotected |
Solve Hamiltonian via Schur method.
The Hamiltonian constructed in solve() is solved via the Schur decomposition. The Real Schur form of A is reordered such that blocks on the diagonal with eigenvalues having a negative real part precede other one. The corresponding column in the orthogonal transformation matrix U spans the invariant subspace: [U1 U2]^T. The solution of the Riccati equation is then obtained by
The implementation is based on [1].
[1] A. J. Laub. "A Schur method for solving algebraic Riccati equations", IEEE Conference on Decision and Control, 1978.
[in] | H | Hamiltonian matrix of the Riccati equation [square] |
[out] | X | Resuling solution: symmetric matrix with size(H). |
Definition at line 72 of file algebraic_riccati_continuous.cpp.