Aller au contenu

Mathc complexes/a55

Un livre de Wikilivres.


Diagonaliser une matrice avec un nombre de lignes supérieur ou égal aux nombres de colonnes.


Installer et compiler ces fichiers dans votre répertoire de travail.


c00.c
/* ------------------------------------ */
/*  save as :   c00.c                   */
/* ------------------------------------ */
#include "w_a.h"
/* ------------------------------------ */
#define FACTOR_E        +1.E-2   
/* ------------------------------------ */
/* ------------------------------------ */
#define    RC           RC3
#define    Cb            C1
/* ------------------------------------ */
int main(void)
{
double a[RC*(RC*C2)] ={ 1,2,  3,4,  5,6,
                        5,4,  1,3,  6,8,
                        7,2,  5,1,  1,1};

double t[RC*(Cb*C2)] ={ 1,2, 
                         3,4, 
                         5,6 };
                                                
double **A = ca_A_mZ(a,i_mZ(RC,RC));
double **b = ca_A_mZ(t,i_mZ(RC,Cb));
double **x =           i_mZ(RC,Cb);

double **A_T   = ctranspose_mZ(A,               i_mZ(RC,RC));
double **V     =        X_V_mZ(A_T,             i_mZ(RC,RC),FACTOR_E);
double **V_T   = ctranspose_mZ(V,               i_mZ(RC,RC));  
double **U     =        X_U_mZ(A_T,             i_mZ(RC,RC),FACTOR_E);
double **U_T   = ctranspose_mZ(U,               i_mZ(RC,RC));
double **U_TA  =                                i_mZ(RC,RC); 
double **X     = mul_mZ(mul_mZ(U_T, A, U_TA), V,i_mZ(RC,RC));
double **invX  = X_inv_mZ(X,                    i_mZ(RC,RC)); 
double **VinvX = mul_mZ(V, invX,                i_mZ(RC,RC));
double **Pinv  = mul_mZ(VinvX, U_T,             i_mZ(RC,RC));

  clrscrn();  
  printf(" A :");
  p_mZ(A, S8,P2, S6,P2, C4);
  printf(" b :");
  p_mZ(b, S8,P2, S6,P2, C4);   
  stop();  
 
  clrscrn();       
  printf(" x = inv b  ");   
  mul_mZ(Pinv, b, x); 
  pE_mZ(x, S12,P4, S12,P4, C4);  

  printf(" B :");
  p_mZ(b, S8,P2, S8,P2, C4);
  printf("  AX :");
  p_mZ(mul_mZ(A,x,b), S8,P2, S8,P2, C4);
  stop();
     
   f_mZ(A);
   f_mZ(A_T);

   f_mZ(b);
   f_mZ(x);
      
   f_mZ(V);
   f_mZ(V_T);
     
   f_mZ(U);
   f_mZ(U_T);
   f_mZ(U_TA);
   f_mZ(X);
   
   f_mZ(invX);
   f_mZ(VinvX);
   f_mZ(Pinv);  
   
  return 0;
}
/* ------------------------------------ */
/* ------------------------------------ */


Exemple de sortie écran :
 A :
   +1.00 +2.00i    +3.00 +4.00i    +5.00 +6.00i 
   +5.00 +4.00i    +1.00 +3.00i    +6.00 +8.00i 
   +7.00 +2.00i    +5.00 +1.00i    +1.00 +1.00i 

 b :
   +1.00 +2.00i 
   +3.00 +4.00i 
   +5.00 +6.00i 

 Press return to continue. 


 x = inv b  
 +6.5984e-01 +4.7452e-01i 
 +2.7038e-01 +2.8544e-01i 
 -3.7593e-02 -3.0130e-01i 

 B :
   +1.00   +2.00i 
   +3.00   +4.00i 
   +5.00   +6.00i 

  AX :
   +1.00   +2.00i 
   +3.00   +4.00i 
   +5.00   +6.00i 

 Press return to continue.