package AlgLin;

public class SysTriangInf extends SysLin {
    // Constructeur
    public SysTriangInf(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 triangulaire inférieur
    @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++) { // on parcours chaque ligne du systeme
            double somme = 0;
            for (int j = 0; j < i; j++) {
                somme += this.getMatriceSystem().getCoef(i, j) * solution.getCoef(j, 0); // somme += a(ij) x X(j) ou x(j) est 
                // l'inconnu deja calculer 
            }
            double secondMembre = this.getSecondMembre().getCoef(i, 0); // Second membre b(i)
            double coefficientDiagonal = this.getMatriceSystem().getCoef(i, i); // Coefficient diagonal a(ii)
            solution.remplacerCoefficient(i, (secondMembre - somme) / coefficientDiagonal); // Calcul de la solution
            // avec la formule (b(i) - somme) / a(ii)
        }
        return solution; // Renvoie du vecteur solution
    }
    
    public static void main(String[] args) {
    	
    	try {
            // Création de la matrice triangulaire inférieure
            double[][] coefficients = {
                {2, 0, 0},
                {1, 3, 0},
                {4, 5, 6}
            };
            Matrice matriceTriangInf = new Matrice(coefficients);
            System.out.println("Notre Matrice :\n" + matriceTriangInf);

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

            // Création du système triangulaire inférieur
            SysTriangInf sysTriangInf = new SysTriangInf(matriceTriangInf, secondMembre);

            // Copie de la matrice et du second membre pour les tests
            Matrice matriceCopie = new Matrice(matriceTriangInf.nbLigne(), matriceTriangInf.nbColonne());
            matriceCopie.recopie(matriceTriangInf);

            Vecteur secondMembreCopie = new Vecteur(secondMembre.taille());
            secondMembreCopie.recopie(secondMembre);

            // Résolution du système triangulaire inférieur
            Vecteur solution = sysTriangInf.resolution();
            System.out.println("Solution du système triangulaire inférieur : \n" + solution);

         // Appel de la méthode pour vérifier la norme
            sysTriangInf.verifierNorme(matriceCopie, secondMembreCopie, solution);
        } catch (IrregularSysLinException e) {
            System.out.println("Erreur : " + e.getMessage());
        }
    }
    
}
