Mathc matrices/c16c
Application
Installer et compiler ces fichiers dans votre répertoire de travail.
/* ------------------------------------ */
/* Save as : c03.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+C3);
/* b = C1 + C3 free variables */
 clrscrn();
 printf(" A :");
 p_mR(A,S6,P1,C10);
 printf(" b :");
 p_mR(b,S6,P1,C10);
 printf(" Ab :");
 p_mR(Ab,S6,P1,C10);
 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,C10);
 stop();
 clrscrn(); 
 put_var_mR(Ab,Ab_free); 
 printf(" Ab_free : put_var_mR(Ab,Ab_free);"); 
 p_mR(Ab_free,S6,P3,C10); 
 stop();
 f_mR(Ab);
 f_mR(b);
 f_mR(A);
 return 0;
/* ------------------------------------ */
En fait on ajoute directement les colonnes supplémentaires lors de la création de la matrice Ab_free. Ici +C3.
double **Ab_free = i_Abr_Ac_bc_mR(csize_A_R(Ab),csize_A_R(Ab),C1+C3);
Normalement ont ne connait pas le nombre de variables libres du système. C'est le premier appel à la fonction gauss-jordan qui nous donne l'information.
gj_PP_mR(Ab,NO);
A de Ab a quatre lignes dont une nulle (Une variable libre qui devra être matérialisée par une colonne supplémentaire).
A de Ab a quatre lignes et six colonnes. Il faut donc ajouter deux lignes pour que la matrice A de *Ab_free soit carré, et deux colonnes pour les deux variable libres que cela implique. 
La matrice Ab_free devra avoir trois variables liées et trois variables libres. 
Trois variables libres impliquent trois lignes nulles et trois colonnes nulles. Ici b est aussi nul.
 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.000 -3.000 +4.500 -0.500 +4.000 +1.000 +0.000 +0.000 +0.000 +0.000 
+0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 
-0.000 -0.000 +1.000 +3.000 -2.000 -6.000 -0.000 +0.000 +0.000 +0.000 
+0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 
+0.000 +0.000 +0.000 +0.000 +1.000 +5.000 +0.000 +0.000 +0.000 +0.000 
+0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 +0.000 
 Press return to continue.

Mathc matrices/c16d
Application
Installer et compiler ces fichiers dans votre répertoire de travail.
/* ------------------------------------ */
/* Save as : c00a.c */
void fun(int r,int c)
double **B = r_mR(i_mR(r,c),9.);
double **B_T = transpose_mR(B,i_mR(c,r));
double **S = i_mR(c,C1);
double **U = i_mR(r,c);
double **V = i_mR(c,c);
 clrscrn(); 
 printf(" Copy/Past into the octave windows \n\n\n");
 p_Octave_mR(B,"B",P2);
 printf(" [U, S, V] =svd (B,10)\n\n\n");
 stop();
 clrscrn(); 
 svd_U_Rn_uv_mR(B_T,U); 
 svd_V_Rn_uv_mR(B_T,V); 
 svd_value_uv_mR(B,S);
 printf(" U :");
 p_mR(U,S5,P5,C10); 
 printf(" S :");
 p_mR(S,S5,P5,C10);
 printf(" V:");
 p_mR(V,S5,P5,C10); 
 f_mR(B_T);
 f_mR(B);
 f_mR(S); 
 f_mR(U);
 f_mR(V); 
/* ------------------------------------ */
int main(void)
time_t t;
 srand(time(&t));
int i;
do
 i = rp_I(R3)+R1;
 fun(i+R2,i);
} while(stop_w());
 return 0;
/* ------------------------------------ */
Cet version fonctionne quand il y a plus de lignes que de colonnes.. 
 svd_U_Rn_uv_mR(B_T,U); 
 svd_V_Rn_uv_mR(B_T,V);

Exemple de sortie écran :
 Copy/Past into the octave windows 
 B=[
+1.00,+9.00,-5.00,-3.00;
-4.00,+3.00,+6.00,+4.00;
+3.00,-7.00,-2.00,-3.00;
-4.00,+4.00,+2.00,+1.00;
+9.00,-7.00,-1.00,+4.00;
-3.00,+6.00,-8.00,-1.00]
 [U, S, V] =svd (B,10)
 Press return to continue. 
 ------------------------------------ 
 U :
-0.45413 -0.46173 -0.37278 -0.60330 
-0.17344 +0.60856 -0.28546 +0.12686 
+0.37316 -0.28014 +0.52367 -0.06669 
-0.27456 +0.26854 -0.03139 +0.08296 
+0.59584 -0.22024 -0.71016 +0.21210 
-0.44048 -0.46622 -0.00070 +0.75075 
 S :
+18.03134 
+13.07418 
+6.67939 
+4.16202 
 V:
-0.50697 -0.41257 +0.58743 -0.47717 
+0.83919 -0.04210 +0.45449 -0.29569 
-0.15875 +0.84192 +0.03642 -0.51444 
-0.11638 +0.34523 +0.66861 +0.64826 
 Press return to continue

Mathc matrices/c16e
Application 
Installer et compiler ces fichiers dans votre répertoire de travail.
/* ------------------------------------ */
/* Save as : gj_r_a2.c */
/* ------------------------------------ */
/* ------------------------------------ */
int main(void)
double ab[RA*(CA+Cb)]={
 +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(RA,CA,Cb));
double **A = c_Ab_A_mR(Ab,i_mR(RA,CA));
double **b = c_Ab_b_mR(Ab,i_mR(RA,Cb));
 clrscrn();
 printf(" A :");
 p_mR(A,S8,P0,C7);
 printf(" b :");
 p_mR(b,S8,P0,C7);
 printf(" Ab :");
 p_mR(Ab,S8,P0,C7);
 getchar();
 clrscrn();
 printf(" Copy/Past into the octave window.\n\n");
 p_Octave_mR(Ab,"Ab",P0);
 printf("\n rref(Ab.00000000001)\n\n");
 printf(" gj_PP_mR(Ab,YES) :");
 gj_PP_mR(Ab,YES);
 p_mR(Ab,S10,P4,C7);
 stop();
 f_mR(Ab);
 f_mR(b);
 f_mR(A);
 return 0;
/* ------------------------------------ */
Si A est une matrice singulière le Total pivoting ne fonctionne pas. C'est pourquoi j'ai introduit un nouvel algorithme.
Par exemple, le Total pivoting ne permettrait pas d'obtenir le résultat ci-dessous.

Exemple de sortie écran :
 A :
 +1 -3 +4 -2 +5 +4 
 +2 -6 +9 -1 +8 +2 
 +2 -6 +9 -1 +9 +7 
 -1 +3 -4 +2 -5 -4 
 b :
 +0 
 +0 
 +0 
 +0 
 Ab :
 +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 
 Copy/Past into the octave window.
 Ab=[
+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]
 rref(Ab.00000000001)
 gj_PP_mR(Ab,YES) :
 +1.0000 -3.0000 +4.5000 -0.5000 +4.0000 +1.0000 +0.0000 
 -0.0000 -0.0000 +1.0000 +3.0000 -2.0000 -6.0000 -0.0000 
 +0.0000 +0.0000 +0.0000 +0.0000 +1.0000 +5.0000 +0.0000 
 +0.0000 +0.0000 +0.0000 +0.0000 +0.0000 +0.0000 +0.0000 
 Press return to continue.

Mathc matrices/e16
Étude du code
Nous allons étudier l'algorithme du Partial Pivoting.
Petites études:

Mathc matrices/e1600
Étude du code
Installer et compiler ces fichiers dans votre répertoire de travail.
/* ------------------------------------ */
/* Save as : gj00.c */
void fun(int r)
double **A = i_mR(r,r);
double **b = i_mR(r,C1);
double **Ab = i_Abr_Ac_bc_mR(r,r,C1);
/* i_Abr_Ac_bc_mR(R_Ab,C_A,C_b)); */
 do
 r_mR(A,999.);
 printf(".");
 }while(!det_R(A));
 r_mR(b,999.);
 c_A_b_Ab_mR(A,b,Ab);
 clrscrn();
 printf(" Copy/Past into the octave window.\n\n");
 p_Octave_mR(Ab,"Ab",P0);
 printf("\n rref(Ab.00000000001)\n\n");
 stop();
 clrscrn();
 gj_PP_mR(Ab,YES);
 printf(" gj_PP_mR(Ab,YES) :");
 p_mR(Ab,S10,P4,C7);
 f_mR(Ab);
 f_mR(b);
 f_mR(A);
/* ------------------------------------ */
int main(void)
time_t t;
 srand(time(&t));
do
 fun(rp_I(R2)+R2);
} while(stop_w());
 return 0;
/* ------------------------------------ */
C'est le fichier de base de travail.