package AlgLin;



public class HilbertMatrice extends Matrice {
	public HilbertMatrice(int n) {
		super(n,n);
		for(int i=0;i<n;i++) {
			for(int j=0;j<n;j++) {
				coefficient[i][j] = 1.0/(i+j+1); 
			}
		}
	}
	public static void main(String[] args) throws IllegalOperationException, IrregularSysLinException  {
		// Boucle pour parcourir les matrices de Hilbert d'ordre 3 à 15
	    for (int n = 8; n <=15 ; n++) {

	        // Création de la matrice de Hilbert
	        HilbertMatrice matriceHilbert = new HilbertMatrice(n);

	        // Affichage de la matrice
	        System.out.println("Matrice de Hilbert d'ordre " + n + " : ");
	        System.out.println(matriceHilbert);

	        // Calcul de l'inverse de la matrice
	        Matrice inverse;
	        try {
	            inverse = matriceHilbert.inverse();
	        } catch (IllegalOperationException e) {
	            System.out.println("La matrice n'est pas inversible.");
	            continue;
	        } catch (IrregularSysLinException e) {
	            System.out.println("Le système linéaire est irrégulier.");
	            continue;
	        }

	        // Affichage de l'inverse de la matrice
	        System.out.println("Inverse de la matrice : ");
	        System.out.println(inverse);

	        // Vérification en multipliant la matrice d'origine par son inverse
	        // pour le conditionnement on va multiplier la norme de la matrice avec la norme de son inverse
	        Matrice produit = Matrice.produit(matriceHilbert, inverse);
	        System.out.println("Affichage du produit de la matrice de Hilbert par son inverse\n" + produit);

	        // Calcul de la norme de la différence entre le produit et la matrice identité
	        Matrice identite = Matrice.matriceIdentite(n);
	        identite = identite.produit(-1);
	        Matrice difference = Matrice.addition(produit, identite);
	        System.out.println("Calcule de la norme de la difference de la matrice produit avec la matrice identite\n" + difference.norme_1());

	        // Calcul du conditionnement de la matrice
	        System.out.println("Conditionnement de la matrice (norme 1) :  " + matriceHilbert.cond_1());
	        System.out.println("Conditionnement de la matrice (norme infinie) : " + matriceHilbert.cond_inf());
	       

	        System.out.println(); // Saut de ligne
	    }
		
		

	}

}