Methods for dealing with discrete-time algebraic Riccati equations. More...
#include <algebraic_riccati_discrete.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 | 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 discrete-time algebraic Riccati equation. More... | |
Static Protected Member Functions | |
static bool | isInsideUnitCircle (const Eigen::Ref< const Eigen::MatrixXd > &block) |
static bool | solveRiccatiHamiltonianSchur (const Eigen::MatrixXd &H, Eigen::MatrixXd &X) |
Solve Hamiltonian via Schur method. More... | |
Methods for dealing with discrete-time algebraic Riccati equations.
The discrete-time algebraic Riccati equation is given by
and
must be stabilizable.
The resulting gain matrix is given by
Add a method that determiens 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_discrete.h.
|
static |
Determine if the closed-loop system is stable.
The closed-loop system is stable if the closed-loop eigenvalues are within the unit circle. This method returns true
if has only eigenvalues within the unit circle. 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 102 of file algebraic_riccati_discrete.cpp.
|
inlinestaticprotected |
Definition at line 132 of file algebraic_riccati_discrete.h.
|
static |
Solve discrete-time algebraic Riccati equation.
Solve w.r.t.
.
and
must be stabilizable (all eigenvalues of A outside the unit circle must be controllable). In addition, the associated symplectic pencil must have no eigenvalue on the unit circle. Sufficient conditions: R > 0.
Also, must be invertible for this implementation.
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 with size [m x n] (optional) |
Definition at line 40 of file algebraic_riccati_discrete.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 contained in the unit circle. 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 71 of file algebraic_riccati_discrete.cpp.