Mathc matrices/c09a04
Installer et compiler ces fichiers dans votre répertoire de travail.
inv04.c |
---|
/* ------------------------------------ */
/* Save as : inv04.c */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
/* ------------------------------------ */
/* ------------------------------------ */
double **XX_invgj_pivot_mR(
double **Ab
)
{
double pivot = 1.;
int r= R1;
while( pivot &&
(r<Ab[R_SIZE ][C0])
)
{
clrscrn();
printf("/* --------- DEBUG 1 ---------- */\n");
printf(" inv(A)\n");
p_mR(Ab,S8,P4,C8);
pivot = pivotbestAId_mR(Ab,r);
printf(" pivot[%d][[%d] = %f\n",r,r,pivot);
printf(" inv(A)\n");
p_mR(Ab,S8,P4,C8);
stop();
if(pivot>ERROR_E)
zero_under_pivot_gj1Ab_mR(Ab,r);
r++;
}
clrscrn();
printf(" inv(A)\n");
p_mR(Ab,S8,P4,C8);
stop();
clrscrn();
/* --------------------------- */
while( (r>R1) )
{
r--;
zero_below_pivot_gj1Ab_mR(Ab,r);
}
return(Ab);
}
/* ------------------------------------ */
/* ------------------------------------ */
double **XX_invgj_mR(
double **A,
double **invA
)
{
double **ID = i_RC_mR(A[R_SIZE][C0],A[C_SIZE][C0]);
double **AID;
int r = A[R_SIZE][C0];
r--;
AID = i_Abr_Ac_bc_mR(r,r,r);
eye_mR(ID);
c_A_b_Ab_mR(A,ID,AID);
XX_invgj_pivot_mR(AID);
sort_c_mR(AID);
sort_r_mR(AID);
c_Inv_A_mR(AID,invA);
f_mR(AID);
f_mR(ID);
return(invA);
}
/* ------------------------------------ */
/* ------------------------------------ */
void fun(int r)
{
double **A = r_mR( i_mR(r,r), 99.);
double **Inv = i_mR(r,r);
double **AInv = i_mR(r,r);
clrscrn();
printf(" A :");
p_mR(A,S3,P0,C6);
stop();
XX_invgj_mR(A,Inv);
printf(" Copy/Past into the octave window.\n\n");
printf("format short e\n");
p_Octave_mR(A,"A",P0);
printf(" inv(A)");
pE_mR(Inv,S12,P4,C6);
printf(" A * inv(A)");
mul_mR(A,Inv,AInv);
p_mR(AInv,S12,P4,C6);
f_mR(AInv);
f_mR(Inv);
f_mR(A);
}
/* ------------------------------------ */
int main(void)
{
time_t t;
srand(time(&t));
do
{
fun(C4);
} while(stop_w());
return 0;
}
/* ------------------------------------ */
/* ------------------------------------ */
Nous voyons dans cet exemple comment sont choisis les meilleurs pivots. Cela est toujours le plus grand coefficient en valeur absolue qui se trouve dans la matrice. Exemple de sortie écran :
------------------------------------
A :
-79 -61 +44 -59
-51 -7 +26 +92
-41 +96 -67 +2
+10 +12 -57 +66
Press return to continue.
/* --------- DEBUG 1 ---------- */
inv(A)
-79.0000 -61.0000 +44.0000 -59.0000 +1.0000 +0.0000 +0.0000 +0.0000
-51.0000 -7.0000 +26.0000 +92.0000 +0.0000 +1.0000 +0.0000 +0.0000
-41.0000 +96.0000 -67.0000 +2.0000 +0.0000 +0.0000 +1.0000 +0.0000
+10.0000 +12.0000 -57.0000 +66.0000 +0.0000 +0.0000 +0.0000 +1.0000
pivot[1][[1] = 96.000000
inv(A)
+96.0000 -41.0000 -67.0000 +2.0000 +0.0000 +0.0000 +1.0000 +0.0000
-7.0000 -51.0000 +26.0000 +92.0000 +1.0000 +0.0000 +0.0000 +0.0000
-61.0000 -79.0000 +44.0000 -59.0000 +0.0000 +1.0000 +0.0000 +0.0000
+12.0000 +10.0000 -57.0000 +66.0000 +0.0000 +0.0000 +0.0000 +1.0000
Press return to continue.
/* --------- DEBUG 1 ---------- */
inv(A)
+1.0000 -0.4271 -0.6979 +0.0208 +0.0000 +0.0000 +0.0104 +0.0000
+0.0000 -53.9896 +21.1146 +92.1458 +1.0000 +0.0000 +0.0729 +0.0000
+0.0000 -105.0521 +1.4271 -57.7292 +0.0000 +1.0000 +0.6354 +0.0000
+0.0000 +15.1250 -48.6250 +65.7500 +0.0000 +0.0000 -0.1250 +1.0000
pivot[2][[2] = 105.052083
inv(A)
+1.0000 -0.4271 -0.6979 +0.0208 +0.0000 +0.0000 +0.0104 +0.0000
+0.0000 -105.0521 +1.4271 -57.7292 +0.0000 +1.0000 +0.6354 +0.0000
+0.0000 -53.9896 +21.1146 +92.1458 +1.0000 +0.0000 +0.0729 +0.0000
+0.0000 +15.1250 -48.6250 +65.7500 +0.0000 +0.0000 -0.1250 +1.0000
Press return to continue.
/* --------- DEBUG 1 ---------- */
inv(A)
+1.0000 -0.4271 -0.6979 +0.0208 +0.0000 +0.0000 +0.0104 +0.0000
-0.0000 +1.0000 -0.0136 +0.5495 -0.0000 -0.0095 -0.0060 -0.0000
+0.0000 +0.0000 +20.3812 +121.8147 +1.0000 -0.5139 -0.2536 +0.0000
+0.0000 +0.0000 -48.4195 +57.4384 +0.0000 +0.1440 -0.0335 +1.0000
pivot[3][[3] = 121.814675
inv(A)
+1.0000 -0.4271 +0.0208 -0.6979 +0.0000 +0.0000 +0.0000 +0.0104
-0.0000 +1.0000 +0.5495 -0.0136 -0.0000 -0.0095 -0.0000 -0.0060
+0.0000 +0.0000 +121.8147 +20.3812 +1.0000 -0.5139 +0.0000 -0.2536
+0.0000 +0.0000 +57.4384 -48.4195 +0.0000 +0.1440 +1.0000 -0.0335
Press return to continue.
/* --------- DEBUG 1 ---------- */
inv(A)
+1.0000 -0.4271 +0.0208 -0.6979 +0.0000 +0.0000 +0.0000 +0.0104
-0.0000 +1.0000 +0.5495 -0.0136 -0.0000 -0.0095 -0.0000 -0.0060
+0.0000 +0.0000 +1.0000 +0.1673 +0.0082 -0.0042 +0.0000 -0.0021
+0.0000 +0.0000 +0.0000 -58.0297 -0.4715 +0.3863 +1.0000 +0.0861
pivot[4][[4] = 58.029712
inv(A)
+1.0000 -0.4271 +0.0208 -0.6979 +0.0000 +0.0000 +0.0000 +0.0104
-0.0000 +1.0000 +0.5495 -0.0136 -0.0000 -0.0095 -0.0000 -0.0060
+0.0000 +0.0000 +1.0000 +0.1673 +0.0082 -0.0042 +0.0000 -0.0021
+0.0000 +0.0000 +0.0000 -58.0297 -0.4715 +0.3863 +1.0000 +0.0861
Press return to continue.
inv(A)
+1.0000 -0.4271 +0.0208 -0.6979 +0.0000 +0.0000 +0.0000 +0.0104
-0.0000 +1.0000 +0.5495 -0.0136 -0.0000 -0.0095 -0.0000 -0.0060
+0.0000 +0.0000 +1.0000 +0.1673 +0.0082 -0.0042 +0.0000 -0.0021
-0.0000 -0.0000 -0.0000 +1.0000 +0.0081 -0.0067 -0.0172 -0.0015
Press return to continue.
Copy/Past into the octave window.
format short e
A=[
-79,-61,+44,-59;
-51,-7,+26,+92;
-41,+96,-67,+2;
+10,+12,-57,+66]
inv(A)
-7.9031e-03 -3.6537e-03 -5.0609e-03 -1.8185e-03
-7.9567e-03 +3.9678e-03 +7.2581e-03 -1.2864e-02
-6.6570e-03 +8.1255e-03 -1.4834e-03 -1.7233e-02
-3.1052e-03 +6.8497e-03 -1.8340e-03 +2.8832e-03
A * inv(A)
+1.0000 +0.0000 -0.0000 -0.0000
-0.0000 +1.0000 -0.0000 +0.0000
-0.0000 -0.0000 +1.0000 +0.0000
+0.0000 -0.0000 +0.0000 +1.0000
Press return to continue
Press X to stop