package AlgLin;


public class SysDiagonal extends SysLin {
	
    // Constructeur
    public SysDiagonal(Matrice matrice, Vecteur secondMembre) throws IrregularSysLinException {
        super(matrice, secondMembre); // Appel du constructeur de la classe parente SysLin
    }

    // Implémentation de la méthode resolution pour un système diagonal
    @Override
    public Vecteur resolution() {
        int ordre = this.getOrdre(); // Récupération de l'ordre du système
        Vecteur solution = new Vecteur(ordre); // Vecteur solution initialisé avec la taille de l'ordre
        for (int i = 0; i < ordre; i++) { // pour toutes les lignes du systeme
            double coefficientDiagonal = this.getMatriceSystem().getCoef(i, i); // recupere Coefficient diagonal
            double secondMembre = this.getSecondMembre().getCoef(i); // Second membre
            solution.remplacerCoefficient(i, secondMembre / coefficientDiagonal); // Calcul de la solution
            // on applique la formule x(i) = b(i) / a(ii)
        }
        return solution; // Renvoie du vecteur solution
    }
 
   
    // Main 
    public static void main(String[] args) {
        try {
            // Création de la matrice diagonale
            double[][] coefficients = {
                {2, 0, 0},
                {0, 3, 0},
                {0, 0, 4}
            };
            
            Matrice matriceDiagonale = new Matrice(coefficients);
            System.out.println("Notre Matrice :\n" + matriceDiagonale);

            // Création du second membre
            double[] secondMembreValues = {6, 9, 12};
            Vecteur secondMembre = new Vecteur(secondMembreValues);
            System.out.println("Notre SecondMembre :\n" + secondMembre);

            // Copie de la matrice et du second membre pour les tests
            Matrice matriceCopie = new Matrice(matriceDiagonale.nbLigne(), matriceDiagonale.nbColonne());
            matriceCopie.recopie(matriceDiagonale);
            Vecteur secondMembreCopie = new Vecteur(secondMembre.taille());
            secondMembreCopie.recopie(secondMembre);
            
            // Création du système diagonal
            SysDiagonal sysDiagonale = new SysDiagonal(matriceDiagonale, secondMembre);

            // Résolution du système diagonal
            Vecteur solution = sysDiagonale.resolution();
            System.out.println("Solution du système diagonal : \n" + solution);
            
            // Appel de la méthode pour vérifier la norme
            sysDiagonale.verifierNorme(matriceCopie, secondMembreCopie, solution);
           
        } catch (IrregularSysLinException e) {
            System.out.println("Erreur : " + e.getMessage());
        }
    }
  
}
