This repository has been archived on 2025-02-26. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Pivot/src/Solver.cpp
Persson-dev 259750a794
All checks were successful
Linux arm64 / Build (push) Successful in 36s
fix warnings
2024-03-05 23:00:32 +01:00

56 lines
1.5 KiB
C++

#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();
}