package AlgLin;

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

    @Override
    public Vecteur resolution()  {
        Matrice a = getMatriceSystem();
        Vecteur b = getSecondMembre();
        Vecteur x = new Vecteur(getOrdre());
        x.remplacerCoefficient(0, b.getCoef(0));
        for(int i=1; i<x.taille(); i++) {
            double sum=0.0;
            for(int j=0; j<i;j++) {
                sum+=a.getCoef(i, j)*x.getCoef(j);
            }
            x.remplacerCoefficient(i, (b.getCoef(i)-sum));
        }        
        return x;
    }
    
    public static void main(String[] args) {
    	try {
            // Création d'une matrice triangulaire inférieure unitaire
            double[][] coefficients = {
                {1, 0, 0},
                {2, 1, 0},
                {4, 5, 1}
            };
            Matrice matriceTriangInfUnite = new Matrice(coefficients);
            System.out.println("Notre Matrice :\n" + matriceTriangInfUnite);

            // 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 unitaire
            SysTriangInfUnite sysTriangInfUnite = new SysTriangInfUnite(matriceTriangInfUnite, secondMembre);

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

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

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

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