Control theory¶
The following algorithms draw heavily from the second chapter of Nicholas J. Higham’s “Functions of Matrices: Theory and Computation” and depend heavily on the matrix sign function. They have only undergone cursory testing.
Sylvester¶
As long as both \(A\) and \(B\) only have eigenvalues in the open right-half plane, the following routines solve for \(X\) in the Sylvester equation
via computing \(\text{sgn}(W)\), where
C++ API¶
-
void
Sylvester
(const Matrix<F> &A, const Matrix<F> &B, const Matrix<F> &C, Matrix<F> &X, SignCtrl<Base<F>> signCtrl = SignCtrl<Base<F>>())¶
-
void
Sylvester
(const AbstractDistMatrix<F> &A, const AbstractDistMatrix<F> &B, const AbstractDistMatrix<F> &C, AbstractDistMatrix<F> &X, SignCtrl<Base<F>> signCtrl = SignCtrl<Base<F>>())¶ Versions where the individual matrices are passed in
-
void
Sylvester
(int m, Matrix<F> &W, Matrix<F> &X, SignCtrl<Base<F>> signCtrl = SignCtrl<Base<F>>())¶
-
void
Sylvester
(int m, AbstractDistMatrix<F> &W, AbstractDistMatrix<F> &X, SignCtrl<Base<F>> signCtrl = SignCtrl<Base<F>>())¶ Versions which saves space by accepting the preformed \(W\) matrix
C API¶
-
ElError
ElSylvesterDist_s
(ElConstDistMatrix_s A, ElConstDistMatrix_s B, ElConstDistMatrix_s C, ElDistMatrix_s X)¶
-
ElError
ElSylvesterDist_d
(ElConstDistMatrix_d A, ElConstDistMatrix_d B, ElConstDistMatrix_d C, ElDistMatrix_d X)¶
-
ElError
ElSylvesterDist_c
(ElConstDistMatrix_c A, ElConstDistMatrix_c B, ElConstDistMatrix_c C, ElDistMatrix_c X)¶
Lyapunov¶
A special case of the Sylvester solver, where \(B = A^H\).
Note
If minimizing memory usage is of importance, then the “preformed” Sylvester interface should be used instead.
C++ API¶
-
void
Lyapunov
(const Matrix<F> &A, const Matrix<F> &C, Matrix<F> &X, SignCtrl<Base<F>> signCtrl = SignCtrl<Base<F>>())¶
-
void
Lyapunov
(const AbstractDistMatrix<F> &A, const AbstractDistMatrix<F> &C, AbstractDistMatrix<F> &X, SignCtrl<Base<F>> signCtrl = SignCtrl<Base<F>>())¶
C API¶
Note
An “expert” C interface needs to be added and documented.
Algebraic Ricatti¶
Under suitable conditions, the following routines solve for \(X\) in the algebraic Ricatti equation
where both \(K\) and \(L\) are Hermitian.
C++ API¶
-
void
Ricatti
(UpperOrLower uplo, const Matrix<F> &A, const Matrix<F> &K, const Matrix<F> &L, Matrix<F> &X, SignCtrl<Base<F>> signCtrl = SignCtrl<Base<F>>())¶
-
void
Ricatti
(UpperOrLower uplo, const AbstractDistMatrix<F> &A, const AbstractDistMatrix<F> &K, const AbstractDistMatrix<F> &L, AbstractDistMatrix<F> &X, SignCtrl<Base<F>> signCtrl = SignCtrl<Base<F>>())¶ Versions which accept the individual matrices
-
void
Ricatti
(AbstractDistMatrix<F> &W, AbstractDistMatrix<F> &X, SignCtrl<Base<F>> signCtrl = SignCtrl<Base<F>>())¶ Versions which save memory by directly accepting the preformed \(W\) matrix
C API¶
-
ElError
ElRicatti_s
(ElUpperOrLower uplo, ElConstMatrix_s A, ElConstMatrix_s K, ElConstMatrix_s L, ElMatrix_s X)¶
-
ElError
ElRicatti_d
(ElUpperOrLower uplo, ElConstMatrix_d A, ElConstMatrix_d K, ElConstMatrix_d L, ElMatrix_d X)¶
-
ElError
ElRicatti_c
(ElUpperOrLower uplo, ElConstMatrix_c A, ElConstMatrix_c K, ElConstMatrix_c L, ElMatrix_c X)¶
-
ElError
ElRicatti_z
(ElUpperOrLower uplo, ElConstMatrix_z A, ElConstMatrix_z K, ElConstMatrix_z L, ElMatrix_z X)¶
-
ElError
ElRicattiDist_s
(ElUpperOrLower uplo, ElConstDistMatrix_s A, ElConstDistMatrix_s K, ElConstDistMatrix_s L, ElDistMatrix_s X)¶
-
ElError
ElRicattiDist_d
(ElUpperOrLower uplo, ElConstDistMatrix_d A, ElConstDistMatrix_d K, ElConstDistMatrix_d L, ElDistMatrix_d X)¶
-
ElError
ElRicattiDist_c
(ElUpperOrLower uplo, ElConstDistMatrix_c A, ElConstDistMatrix_c K, ElConstDistMatrix_c L, ElDistMatrix_c X)¶
-
ElError
ElRicattiDist_z
(ElUpperOrLower uplo, ElConstDistMatrix_z A, ElConstDistMatrix_z K, ElConstDistMatrix_z L, ElDistMatrix_z X)¶ Versions which accept the individual matrices