sim_ressorts/labo_physique/Solvers.h

82 lines
1.8 KiB
C++

#pragma once
/**
* @file Solvers.hpp
*
* @brief Implémentation de plusieurs algorihtmes de solveurs pour un système
* d'équations linéaires
*
* Nom:
* Code permanent :
* Email :
*
*/
#include "Math3D.h"
namespace gti320
{
// Identification des solveurs
enum eSolverType { kNone, kGaussSeidel, kColorGaussSeidel, kCholesky };
// Paramètres de convergences pour les algorithmes itératifs
static const float eps = 1e-4f;
static const float tau = 1e-5f;
/**
* Résout Ax = b avec la méthode Gauss-Seidel
*/
static void gaussSeidel(const Matrix<float, Dynamic, Dynamic>& A,
const Vector<float, Dynamic>& b,
Vector<float, Dynamic>& x, int k_max)
{
// TODO
//
// Implémenter la méthode de Gauss-Seidel
}
/**
* Résout Ax = b avec la méthode Gauss-Seidel (coloration de graphe)
*/
static void gaussSeidelColor(const Matrix<float, Dynamic, Dynamic>& A, const Vector<float, Dynamic>& b, Vector<float, Dynamic>& x, const Partitions& P, const int maxIter)
{
// TODO
//
// Implémenter la méthode de Gauss-Seidel avec coloration de graphe.
// Les partitions avec l'index de chaque particule sont stockées dans la table des tables, P.
}
/**
* Résout Ax = b avec la méthode de Cholesky
*/
static void cholesky(const Matrix<float, Dynamic, Dynamic>& A,
const Vector<float, Dynamic>& b,
Vector<float, Dynamic>& x)
{
// TODO
//
// Calculer la matrice L de la factorisation de Cholesky
// TODO
//
// Résoudre Ly = b
// TODO
//
// Résoudre L^t x = y
//
// Remarque : ne pas caculer la transposer de L, c'est inutilement
// coûteux.
}
}