30 #include <Eigen/Dense> 31 #include <Eigen/Eigenvalues> 41 assert(A.rows() == C.rows());
42 assert(B.rows() == C.cols());
50 const Eigen::MatrixXcd& T_A = A_schur.matrixT();
51 const Eigen::MatrixXcd& U_A = A_schur.matrixU();
52 const Eigen::MatrixXcd& T_B = B_schur.
matrixT();
53 const Eigen::MatrixXcd& U_B = B_schur.
matrixU();
55 const int n = C.rows();
56 const int m = C.cols();
59 Eigen::MatrixXcd F = U_A.adjoint() * C * U_B;
61 Eigen::MatrixXcd Y(n, m);
66 Eigen::MatrixXcd lhs(n, m);
72 for (
int k = 0; k < m; ++k)
74 Eigen::VectorXcd rhs = F.col(k) + T_A * Y * T_B.col(k);
77 const std::complex<double> factor = T_B(k, k);
84 Y.col(k) = lhs_svd.
solve(rhs);
86 if (k < mm) lhs.setIdentity();
90 X = (U_A * Y * U_B.adjoint()).
real();
99 Eigen::VectorXcd eigvals_A = A.eigenvalues();
100 Eigen::VectorXcd eigvals_B = B.eigenvalues();
102 for (
int i = 0; i < eigvals_A.size(); ++i)
104 for (
int j = 0; j < eigvals_B.size(); ++j)
106 std::complex<double> product = eigvals_A[i] * eigvals_B[j];
bool approx_equal(double a, double b, double epsilon=1e-6)
Check if two doubles are appoximately equal.
bool is_square(const Eigen::MatrixBase< Derived > &matrix)
Determine if a given matrix is square.
ComputationInfo info() const
Reports whether previous computation was successful.
const Solve< JacobiSVD< _MatrixType, QRPreconditioner >, Rhs > solve(const MatrixBase< Rhs > &b) const
MatrixType A(a, *n, *n, *lda)
static bool solve(const Eigen::Ref< const Eigen::MatrixXd > &A, const Eigen::Ref< const Eigen::MatrixXd > &B, const Eigen::Ref< const Eigen::MatrixXd > &C, Eigen::MatrixXd &X)
Solve discrete-time Sylvester equation.
A matrix or vector expression mapping an existing expression.
static bool hasUniqueSolution(const Eigen::Ref< const Eigen::MatrixXd > &A, const Eigen::Ref< const Eigen::MatrixXd > &B)
Determine if the Sylvester equation exhibits a unique solution.
const ComplexMatrixType & matrixU() const
Returns the unitary matrix in the Schur decomposition.
Two-sided Jacobi SVD decomposition of a rectangular matrix.
JacobiSVD & compute(const MatrixType &matrix, unsigned int computationOptions)
Method performing the decomposition of given matrix using custom options.
MatrixType B(b, *n, *nrhs, *ldb)
Performs a complex Schur decomposition of a real or complex square matrix.
const ComplexMatrixType & matrixT() const
Returns the triangular matrix in the Schur decomposition.