solver rework + refactor

This commit is contained in:
2024-03-06 21:24:15 +01:00
parent 259750a794
commit 99624d1b00
10 changed files with 191 additions and 163 deletions

View File

@@ -2,10 +2,8 @@
#include "Gauss.h"
Solver::Solver(const Matrix& mat) : m_Matrix(mat) {}
Vect Solver::Image() const {
Matrix result = m_Matrix;
Vect Solver::Image(const Matrix& a_Matrix) const {
Matrix result = a_Matrix;
result.Transpose();
Gauss::GaussJordan(result, true, true);
result.Transpose();
@@ -13,27 +11,28 @@ Vect Solver::Image() const {
}
// https://en.wikipedia.org/wiki/Kernel_(linear_algebra)#Computation_by_Gaussian_elimination
Vect Solver::Kernel() const {
Matrix result = m_Matrix;
Vect Solver::Kernel(const Matrix& a_Matrix) const {
Matrix result = a_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();
std::size_t origine_colonne = Vect(result.SubMatrix(0, 0, a_Matrix.GetRawCount(), a_Matrix.GetColumnCount())).GetCardinal();
return {result.SubMatrix(m_Matrix.GetRawCount(), origine_colonne, result.GetRawCount() - m_Matrix.GetRawCount(),
return {result.SubMatrix(a_Matrix.GetRawCount(), origine_colonne, result.GetRawCount() - a_Matrix.GetRawCount(),
result.GetColumnCount() - origine_colonne)};
}
VectAffine Solver::TriangularSystem() const {
Matrix mat = m_Matrix;
VectAffine Solver::RectangularSystem(const Matrix& a_MatrixA, const Matrix& a_VectorB) const {
Matrix mat = a_MatrixA;
mat.Augment(a_VectorB);
Gauss::GaussJordan(mat, true, true);
Solver solver {mat.SubMatrix(0, 0, mat.GetRawCount(), mat.GetColumnCount() - 1)};
Solver solver;
Vect noyau = solver.Kernel();
Vect noyau = solver.Kernel(a_MatrixA);
Matrix origin = mat.SubMatrix(0, mat.GetColumnCount() - 1, mat.GetRawCount(), 1);
// on rajoute des 0 si il faut
@@ -50,6 +49,6 @@ VectAffine Solver::TriangularSystem() const {
return {noyau, fullOrigin};
}
std::size_t Solver::Rank() const {
return Image().GetCardinal();
std::size_t Solver::Rank(const Matrix& a_Matrix) const {
return Image(a_Matrix).GetCardinal();
}