Mathc matrices/a16
Bibliothèque
Dans cet algorithme, le pivot choisi est la plus grande valeur absolue qui se trouve dans la colonne ou se trouve le pivot. Pour cela on fait des échanges de lignes. 
Nous allons voir les mêmes exemples que dans la partie précédente mais avec le nouvel algorithme.
Copier la bibliothèque dans votre répertoire de travail avec les fichiers des parties précédentes :
Exemple pour tester la bibliothèque :

Mathc matrices/h16a
Bibliothèque
Installer ce fichier dans votre répertoire de travail.
/* Save as : v_g.h */
/* ------------------------------------ */ 
/* Gauss jordan */
/* ------------------------------------ */
 Déclaration des fichiers h.

Mathc matrices/h16b
Bibliothèque
Installer ce fichier dans votre répertoire de travail.
/* Save as : vgj3piv.h */
double pivotbest_gj3Ab_mR(
double **Ab,
int pivot_r,
int pivot_c
double pivotbest;
int r;
int best_r;
 best_r = pivot_r;
 pivotbest = fabs(Ab[pivot_r][pivot_c]);
 for ( r=pivot_r; r<Ab[R_SIZE][C0]; r++)
 if(fabs(Ab[r][pivot_c])>pivotbest)
 pivotbest = fabs(Ab[r][pivot_c]);
 best_r = r;
 if(best_r!=pivot_r) swapR_mR(Ab,pivot_r,best_r);
 return(pivotbest);
/* ------------------------------------ */
void zero_under_pivot_gj3Ab_mR(
double **Ab,
int pivot_r,
int pivot_c
double pivot = Ab[pivot_r][pivot_c];
int r;
 if(fabs(pivot)>ERROR_E)
 mulR_mR( Ab,(1./pivot),pivot_r); 
 for( r=(pivot_r+C1); r<Ab[R_SIZE][C0]; r++) 
 addR_mR( Ab,(-Ab[r][pivot_c]),pivot_r,r);
void zero_below_pivot_gj3Ab_mR(
double **Ab,
int pivot_r,
int pivot_c
int r;
 if(fabs(Ab[pivot_r][pivot_c])>ERROR_E)
 for( r=(pivot_r-C1); r>=R1; r--) 
 addR_mR( Ab,(-Ab[r][pivot_c]),pivot_r,r);
/* ------------------------------------ */
 Déclaration des fichiers h.

Mathc matrices/h16c
Bibliothèque
Installer ce fichier dans votre répertoire de travail.
/* Save as : vgj3.h */
void gj3_T_mR(
double **Ab,
int below
int r= R1;
int c= C1;
 while( (r<Ab[R_SIZE][C0]) &&
 (c<Ab[C_SIZE_A][C0]) )
 if(pivotbest_gj3Ab_mR(Ab,r,c)>ERROR_E) 
 zero_under_pivot_gj3Ab_mR(Ab,r,c);
 else r--;
 r++;
 c++;
 r = Ab[R_SIZE][C0];
 if(below)
 while(r>R1)
 r--;
 c=C1;
 while(fabs(Ab[r][c])<ERROR_E && c<(Ab[C_SIZE_A][C0]-C1) ) c++;
 if(fabs(Ab[r][c])>ERROR_E)
 zero_below_pivot_gj3Ab_mR(Ab,r,c);
double **gj_PP_mR(
double **Ab,
int below
 gj3_T_mR(Ab,below);
return(Ab);
/* ------------------------------------ */
 Déclaration des fichiers h.

Mathc matrices/c16a
Application
Installer et compiler ces fichiers dans votre répertoire de travail.
/* ------------------------------------ */
/* Save as : c01.c */
int main(void)
double ab[R4*C7]={
 +1, -3, +4, -2, +5, +4, 0,
 +2, -6, +9, -1, +8, +2, 0,
 +2, -6, +9, -1, +9, +7, 0, 
 -1, 3, -4, 2, -5, -4, 0, 
double **Ab = ca_A_mR(ab, i_Abr_Ac_bc_mR(R4,C6,C1));
double **A = c_Ab_A_mR(Ab,i_mR(R4,C6));
double **b = c_Ab_b_mR(Ab,i_mR(R4,C1));
double **Ab_free = i_Abr_Ac_bc_mR(csize_A_R(Ab),csize_A_R(Ab),C1);
 clrscrn();
 printf(" A :");
 p_mR(A,S6,P1,C7);
 printf(" b :");
 p_mR(b,S6,P1,C7);
 printf(" Ab :");
 p_mR(Ab,S6,P1,C7);
 stop();
 clrscrn();
 printf(" Copy/Past into the octave window.\n\n");
 p_Octave_mR(Ab,"Ab",P1);
 printf("\n rref(Ab.00000000001)\n\n");
 printf(" Ab : gj_PP_mR(Ab,NO) ");
 gj_PP_mR(Ab,NO);
 p_mR(Ab,S6,P1,C8);
 stop();
 clrscrn(); 
 printf(" Ab :");
 p_mR(Ab,S6,P1,C8); 
 printf(" Ab_free : "); 
 p_mR(Ab_free,S6,P1,C8);
 stop();
 f_mR(Ab);
 f_mR(b);
 f_mR(A);
 return 0;
/* ------------------------------------ */
Créons la matrice Ab_free par étapes :
La matrice A de Ab_free doit être carré
La fonction csize_A_R(Ab); donne le nombre de colonnes de A dans Ab. Ici C6 colonnes
 Ab_free[R6][C6+C1] C1 c'est la colonne pour b
 Exemple de sortie écran :
 A :
 +1.0 -3.0 +4.0 -2.0 +5.0 +4.0 
 +2.0 -6.0 +9.0 -1.0 +8.0 +2.0 
 +2.0 -6.0 +9.0 -1.0 +9.0 +7.0 
 -1.0 +3.0 -4.0 +2.0 -5.0 -4.0 
 b :
 +0.0 
 +0.0 
 +0.0 
 +0.0 
 Ab :
 +1.0 -3.0 +4.0 -2.0 +5.0 +4.0 +0.0 
 +2.0 -6.0 +9.0 -1.0 +8.0 +2.0 +0.0 
 +2.0 -6.0 +9.0 -1.0 +9.0 +7.0 +0.0 
 -1.0 +3.0 -4.0 +2.0 -5.0 -4.0 +0.0 
 Press return to continue. 
 Copy/Past into the octave window.
 Ab=[
+1.0,-3.0,+4.0,-2.0,+5.0,+4.0,+0.0;
+2.0,-6.0,+9.0,-1.0,+8.0,+2.0,+0.0;
+2.0,-6.0,+9.0,-1.0,+9.0,+7.0,+0.0;
-1.0,+3.0,-4.0,+2.0,-5.0,-4.0,+0.0]
 rref(Ab.00000000001)
 Ab : gj_PP_mR(Ab,NO) 
 +1.0 -3.0 +4.5 -0.5 +4.0 +1.0 +0.0 
 -0.0 -0.0 +1.0 +3.0 -2.0 -6.0 -0.0 
 +0.0 +0.0 +0.0 +0.0 +1.0 +5.0 +0.0 
 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 
 Press return to continue. 
 Ab :
 +1.0 -3.0 +4.5 -0.5 +4.0 +1.0 +0.0 
 -0.0 -0.0 +1.0 +3.0 -2.0 -6.0 -0.0 
 +0.0 +0.0 +0.0 +0.0 +1.0 +5.0 +0.0 
 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 
 Ab_free : 
 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 
 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 
 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 
 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 
 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 
 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 
 Press return to continue.

Mathc matrices/c16b
Application
Installer et compiler ces fichiers dans votre répertoire de travail.
/* ------------------------------------ */
/* Save as : c02.c */
int main(void)
double ab[R4*C7]={
 +1, -3, +4, -2, +5, +4, 0,
 +2, -6, +9, -1, +8, +2, 0,
 +2, -6, +9, -1, +9, +7, 0, 
 -1, 3, -4, 2, -5, -4, 0, 
double **Ab = ca_A_mR(ab,i_Abr_Ac_bc_mR(R4,C6,C1));
double **A = c_Ab_A_mR(Ab,i_mR(R4,C6));
double **b = c_Ab_b_mR(Ab,i_mR(R4,C1));
double **Ab_free = i_Abr_Ac_bc_mR(csize_A_R(Ab),csize_A_R(Ab),C1);
 clrscrn();
 printf(" A :");
 p_mR(A,S6,P1,C8);
 printf(" b :");
 p_mR(b,S6,P1,C8);
 printf(" Ab :");
 p_mR(Ab,S6,P1,C8);
 stop();
 clrscrn();
 printf(" Copy/Past into the octave window.\n\n");
 p_Octave_mR(Ab,"Ab",P1);
 printf("\n rref(Ab.00000000001)\n\n");
 printf(" Ab : gj_PP_mR(Ab,NO) :");
 gj_PP_mR(Ab,NO);
 p_mR(Ab,S6,P1,C8);
 stop();
 clrscrn(); 
 put_var_mR(Ab,Ab_free); 
 printf(" Ab_free : put_var_mR(Ab,Ab_free); "); 
 p_mR(Ab_free,S6,P1,C8); 
 stop();
 f_mR(Ab);
 f_mR(Ab_free);
 f_mR(b);
 f_mR(A);
 return 0;
/* ------------------------------------ */
La fonction put_var_mR(Ab,Ab_free); copie Ab dans Ab_free en insérant au bon endroit les lignes nulles pour les futurs variables libres. 
 Exemple de sortie écran :
 A :
 +1.0 -3.0 +4.0 -2.0 +5.0 +4.0 
 +2.0 -6.0 +9.0 -1.0 +8.0 +2.0 
 +2.0 -6.0 +9.0 -1.0 +9.0 +7.0 
 -1.0 +3.0 -4.0 +2.0 -5.0 -4.0 
 b :
 +0.0 
 +0.0 
 +0.0 
 +0.0 
 Ab :
 +1.0 -3.0 +4.0 -2.0 +5.0 +4.0 +0.0 
 +2.0 -6.0 +9.0 -1.0 +8.0 +2.0 +0.0 
 +2.0 -6.0 +9.0 -1.0 +9.0 +7.0 +0.0 
 -1.0 +3.0 -4.0 +2.0 -5.0 -4.0 +0.0 
 Press return to continue. 
 Copy/Past into the octave window.
 Ab=[
+1.0,-3.0,+4.0,-2.0,+5.0,+4.0,+0.0;
+2.0,-6.0,+9.0,-1.0,+8.0,+2.0,+0.0;
+2.0,-6.0,+9.0,-1.0,+9.0,+7.0,+0.0;
-1.0,+3.0,-4.0,+2.0,-5.0,-4.0,+0.0]
 rref(Ab.00000000001)
 Ab : gj_PP_mR(Ab,NO) :
 +1.0 -3.0 +4.5 -0.5 +4.0 +1.0 +0.0 
 -0.0 -0.0 +1.0 +3.0 -2.0 -6.0 -0.0 
 +0.0 +0.0 +0.0 +0.0 +1.0 +5.0 +0.0 
 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 
 Press return to continue. 
 Ab_free : put_var_mR(Ab,Ab_free); 
 +1.0 -3.0 +4.5 -0.5 +4.0 +1.0 +0.0 
 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 
 -0.0 -0.0 +1.0 +3.0 -2.0 -6.0 -0.0 
 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 
 +0.0 +0.0 +0.0 +0.0 +1.0 +5.0 +0.0 
 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 
 Press return to continue.