// Lignes de commandes pour tester
// les fonctions de la fiche de TP 
// Résolution de systèmes linéaires


//  Determinant recursif vs. det() base sur LU
for n=[6:10] // n=10 risque d'être trop pour les salles machine
  A=rand(n,n);
  tic(); determinant(A); t1(n)=toc();
  tic(); mon_det(A); t2=toc();
  printf(" \n Taille de A= %d ; temps determinant()=%f, temps mon_det()=%f",n,t1(n),t2)
end

// Comparer t1(n)/t1(n+1) a fact(n)/fact(n+1)
for n=[6:8]
  printf(" \n t(%d)/t(%d)=%f/%f=%f     %d!/%d!=%f",..
     n,n+1,t1(n),t1(n+1),t1(n)/t1(n+1),n,n+1,prod(1:n)/prod(1:n+1))
end


// verifier que mon_det  ala complexité de la décomposition 2/3 n^3
// note : aucun A(i,i) ne devrait etre nul
for n=600:20:740
  A=rand(n,n); B=rand(n+1,n+1);
  tic();  mon_det(A); t1=toc();
   tic(); mon_det(B); t2=toc();
   printf(" \n temps mon_det,  t(%d)/t(%d)=%f   (%d/%d)^3=%f",n,n+1,t1/t2,n,n+1,(n/(n+1))^3)
end


// INFLUENCE DU PIVOT
// La solution est [1 1]'
// Ici le mieux est de faire les calculs ligne/ligne 

format("v",23)

// Pour
epsilon=10^{-13}
// Calculs sans pivot
// le resultat est IMPRECIS,
A=[ epsilon 1 ; 1, 1 ]
b=[1+epsilon, 2]'
[L,U]=mon_lu(A)
x=lu_linsolve(A,b)

// Calculs en permutant, A, b et x
// avec pivot c'est la bonne solution
Ap=[ 1, 1 ; epsilon 1 ]
bp=[ 2, 1+epsilon ]'
[L,U]=mon_lu(Ap)
xp=lu_linsolve(Ap,bp)
x=xp($:-1:1) 

// Pour
epsilon=10^{-18}
// Calculs sans pivot
// le resultat est FAUX,
A=[ epsilon 1 ; 1, 1 ]
b=[1+epsilon, 2]'
[L,U]=mon_lu(A)
x=lu_linsolve(A,b)

// Calculs en permutant, A, b et x
// avec pivot c'est la bonne  solution
Ap=[ 1, 1 ; epsilon 1 ]
bp=[ 2, 1+epsilon ]'
[L,U]=mon_lu(Ap)
xp=lu_linsolve(Ap,bp)
x=xp($:-1:1) 