Mathc complexes/51

Un livre de Wikilivres.


Application


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


c00b.c
/* ------------------------------------ */
/*  Save as :   c00b.c                  */
/* ------------------------------------ */
#include "w_a.h"
/* ------------------------------------ */
#define RA              R3
#define CA              C3
#define FACTOR_E        +1.E-2   
/* ------------------------------------ */
/* ------------------------------------ */
void fun(void)
{
int r = RA;
int c = CA;  

double a[RA*(CA*C2)] ={ 1,2,  3,4,  5,3,  
                        5,4,  1,3,  9,1,
                        7,2,  5,1,  8,3,};
                       
double **A =        ca_A_mZ(a, i_mZ(r,c)); 	
double **A_T = ctranspose_mZ(A,i_mZ(c,r));
double **V =                   i_mZ(r,c);
double **V_T =                 i_mZ(c,r);
double **U =                   i_mZ(r,c);
double **U_T =                 i_mZ(c,r); //             :c,r 
double **U_TA =                i_mZ(c,c); // c,r r,c     :c,c
double **U_TA2 =               i_mZ(c,r); // c,r         :c,r 
double **U_TA2V =              i_mZ(c,c); // c,r r,c     :c,c   X_Value

double **A2V =                 i_mZ(r,c); 
double **A2  =                 i_mZ(r,r); //  A = U * X_Value * V_T 

  clrscrn();
  printf(" A :");
  p_mZ(A, S6,P1, S6,P1, C3);
      
  X_U_mZ(A_T,U,FACTOR_E);
  printf(" U :");
  p_mZ(U, S9,P4, S8,P4, C3);

  X_V_mZ(A_T,V,FACTOR_E);
  printf(" V :");
  p_mZ(V, S9,P4, S8,P4, C3);
  
   ctranspose_mZ(U,U_T);
   ctranspose_mZ(V,V_T);  
   
/* X_Value = U_T * A * V */
   mul_mZ(   U_T,  A,    U_TA);           // U_TA  : c,c
   c_mZ(    U_TA,       U_TA2);           // U_TA2 : c,r 
   mul_mZ( U_TA2,  V,  U_TA2V);           //     V : r,c
   
   printf(" X_Value = U_T * A * V :");
   p_mZ(U_TA2V, S9,P4, S8,P4, C3);
   stop();
   
   clrscrn();
/* A = U * X_Value * V_T    */ 
   mul_mZ(  U,  U_TA2V, A2V);                // U,U_T = 1;
   mul_mZ(A2V,     V_T,  A2);                // V,V_T = 1;
   
   printf(" A2 = U * X_Value * V_T : \t\t U * (U_T*A*V) * V_T ");
   p_mZ(A2, S6,P1, S6,P1, C3); 
   printf(" A :");
   p_mZ(A, S6,P1, S6,P1, C3);
   stop();

   f_mZ(A);   
   f_mZ(A_T);    
   f_mZ(V);   
   f_mZ(V_T);    
   f_mZ(U);   
   f_mZ(U_T);    
   f_mZ(U_TA);   
   f_mZ(U_TA2);  
   f_mZ(U_TA2V);    
   f_mZ(A2V);   
   f_mZ(A2);
}
/* ------------------------------------ */
int main(void)
{
    fun();
    
  return 0;
}
/* ------------------------------------ */
/* ------------------------------------ */


Diagonaliser une matrice carrée


Exemple de sortie écran :
 ----------------------------------
 A :
  +1.0  +2.0i   +3.0  +4.0i   +5.0  +3.0i 
  +5.0  +4.0i   +1.0  +3.0i   +9.0  +1.0i 
  +7.0  +2.0i   +5.0  +1.0i   +8.0  +3.0i 

 U :
  +0.3772 +0.1725i   -0.0706 +0.3672i   -0.4502 -0.6968i 
  +0.6136 +0.0689i   -0.6524 -0.3188i   -0.0717 +0.2937i 
  +0.6683 +0.0000i   +0.5770 +0.0000i   +0.4695 +0.0000i 

 V :
  +0.5169 -0.1394i   -0.0987 +0.0009i   -0.8017 +0.2468i 
  +0.3600 -0.1324i   -0.7923 +0.3282i   +0.3050 -0.1562i 
  +0.7525 +0.0000i   +0.5047 +0.0000i   +0.4230 -0.0000i 

 X_Value = U_T * A * V :
 +17.7296 +3.0133i   +0.0000 +0.0000i   -0.0000 -0.0000i 
  +0.0000 -0.0000i   -1.6373 +3.7646i   +0.0000 +0.0000i 
  -0.0000 +0.0000i   +0.0000 -0.0000i   -2.2158 +1.9545i 

 Press return to continue. 


 ----------------------------------
 A2 = U * X_Value * V_T : 		 U * (U_T*A*V) * V_T 
  +1.0  +2.0i   +3.0  +4.0i   +5.0  +3.0i 
  +5.0  +4.0i   +1.0  +3.0i   +9.0  +1.0i 
  +7.0  +2.0i   +5.0  +1.0i   +8.0  +3.0i 

 A :
  +1.0  +2.0i   +3.0  +4.0i   +5.0  +3.0i 
  +5.0  +4.0i   +1.0  +3.0i   +9.0  +1.0i 
  +7.0  +2.0i   +5.0  +1.0i   +8.0  +3.0i 

 Press return to continue.