#include "Solver.h" #include "Gauss.h" Solver::Solver(const Matrix& mat) : m_Matrix(mat) {} Vect Solver::Image() const { Matrix result = m_Matrix; result.Transpose(); Gauss::GaussJordan(result, true, true); result.Transpose(); return {result}; } // https://en.wikipedia.org/wiki/Kernel_(linear_algebra)#Computation_by_Gaussian_elimination Vect Solver::Kernel() const { Matrix result = m_Matrix; result.Transpose(); result.Augment(Matrix::Identity(result.GetRawCount())); Gauss::GaussJordan(result, true, true); result.Transpose(); // nombre de colonnes non nulles std::size_t origine_colonne = Vect(result.SubMatrix(0, 0, m_Matrix.GetRawCount(), m_Matrix.GetColumnCount())).GetCardinal(); return {result.SubMatrix(m_Matrix.GetRawCount(), origine_colonne, result.GetRawCount() - m_Matrix.GetRawCount(), result.GetColumnCount() - origine_colonne)}; } VectAffine Solver::TriangularSystem() const { Matrix mat = m_Matrix; Gauss::GaussJordan(mat, true, true); Solver solver {mat.SubMatrix(0, 0, mat.GetRawCount(), mat.GetColumnCount() - 1)}; Vect noyau = solver.Kernel(); Matrix origin = mat.SubMatrix(0, mat.GetColumnCount() - 1, mat.GetRawCount(), 1); // on rajoute des 0 si il faut Matrix fullOrigin {mat.GetColumnCount() - 1, 1}; for (std::size_t i = 0; i < mat.GetRawCount(); i++) { fullOrigin.at(i, 0) = origin.at(i, 0); } for (std::size_t i = mat.GetRawCount(); i < mat.GetColumnCount() - 1; i++) { fullOrigin.at(i, 0) = 0; } return {noyau, fullOrigin}; } std::size_t Solver::Rank() const { return Image().GetCardinal(); }