10#include <Eigen/Eigenvalues>
29template <
int States,
int Inputs>
31 const Eigen::Matrix<double, States, Inputs>& B) {
32 Eigen::EigenSolver<Eigen::Matrix<double, States, States>> es{A,
false};
34 for (
int i = 0; i < A.rows(); ++i) {
35 if (std::norm(es.eigenvalues()[i]) < 1) {
39 if constexpr (States != Eigen::Dynamic && Inputs != Eigen::Dynamic) {
40 Eigen::Matrix<std::complex<double>, States, States + Inputs> E;
41 E << es.eigenvalues()[i] * Eigen::Matrix<std::complex<double>, States,
46 Eigen::ColPivHouseholderQR<
47 Eigen::Matrix<std::complex<double>, States, States + Inputs>>
49 if (qr.rank() < States) {
53 Eigen::MatrixXcd E{A.rows(), A.rows() + B.cols()};
54 E << es.eigenvalues()[i] *
55 Eigen::MatrixXcd::Identity(A.rows(), A.rows()) -
59 Eigen::ColPivHouseholderQR<Eigen::MatrixXcd> qr{E};
60 if (qr.rank() < A.rows()) {
69 const Eigen::Matrix<double, 1, 1>& A,
const Eigen::Matrix<double, 1, 1>& B);
71 const Eigen::Matrix<double, 2, 2>& A,
const Eigen::Matrix<double, 2, 1>& B);
74 const Eigen::MatrixXd& B);
88template <
int States,
int Outputs>
90 const Eigen::Matrix<double, Outputs, States>& C) {
96 const Eigen::MatrixXd& C);
#define WPILIB_DLLEXPORT
Definition SymbolExports.hpp:36
Definition LinearSystem.hpp:20
template WPILIB_DLLEXPORT bool IsDetectable< Eigen::Dynamic, Eigen::Dynamic >(const Eigen::MatrixXd &A, const Eigen::MatrixXd &C)
bool IsDetectable(const Eigen::Matrix< double, States, States > &A, const Eigen::Matrix< double, Outputs, States > &C)
Returns true if (A, C) is a detectable pair.
Definition LinearSystemUtil.hpp:89
template WPILIB_DLLEXPORT bool IsStabilizable< 1, 1 >(const Eigen::Matrix< double, 1, 1 > &A, const Eigen::Matrix< double, 1, 1 > &B)
template WPILIB_DLLEXPORT bool IsStabilizable< 2, 1 >(const Eigen::Matrix< double, 2, 2 > &A, const Eigen::Matrix< double, 2, 1 > &B)
bool IsStabilizable(const Eigen::Matrix< double, States, States > &A, const Eigen::Matrix< double, States, Inputs > &B)
Returns true if (A, B) is a stabilizable pair.
Definition LinearSystemUtil.hpp:30
template WPILIB_DLLEXPORT bool IsStabilizable< Eigen::Dynamic, Eigen::Dynamic >(const Eigen::MatrixXd &A, const Eigen::MatrixXd &B)