Mathc complexes/a170

Un livre de Wikilivres.


Application


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


c00a.c
/* ------------------------------------ */
/*  Save as :   c00a.c                  */
/* ------------------------------------ */
#include "w_a.h"
/* ------------------------------------ */
#define RCA             RC3
#define FACTOR_E        +1.E-2   
/* ------------------------------------ */
/* ------------------------------------ */
void fun(void)
{
int r = RCA;
int c = RCA;
  
double **A =  rcsymmetric_mZ(i_mZ(r,c),9);	
double **A_T = ctranspose_mZ(A,i_mZ(c,r));
double **V =                   i_mZ(r,c);
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 **S =                   i_mZ(c,c); // c,r r,c     :c,c   U_TA2V
double **svdvalue =            i_mZ(r,C1);

  clrscrn();
  printf(" A :");
  p_mZ(A, S10,P2, S8,P2, C3);
      
  X_U_mZ(A_T,U,FACTOR_E);
  printf(" U :");
  p_mZ(U, S10,P4, S8,P4, C3);

  X_V_mZ(A_T,V,FACTOR_E);
  printf(" V :");
  p_mZ(V, S10,P4, S8,P4, C3); 
  
  ctranspose_mZ(U,U_T);
  
/* S = 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,    S);        //     V : r,c
   
   printf(" S = U_T * A * V :");
   p_mZ(S, S10,P4, S9,P4, C3);
   stop();
   
   clrscrn();
   printf(" S = U_T * A * V :");
   p_mZ(S, S10,P4, S9,P4, C3);
        
   svd_mZ(A,svdvalue);

   printf(" Singular value : ");
   p_mZ(svdvalue, S10,P4, S9,P4, C10); 
   
   printf(" Copy/Past into the octave window.\n\n");
   p_Octave_mZ(A,"A",P0, P0);
   printf(" SvdValue = svd (A,10) \n");
   printf(" EigenValues = eigs (A,10) \n");   
   f_mZ(A);  
   f_mZ(A_T);
   f_mZ(V);  
   f_mZ(U);
   f_mZ(U_T);  
   f_mZ(U_TA);
   f_mZ(U_TA2);  
   f_mZ(S); 
   f_mZ(svdvalue); 
}
/* ------------------------------------ */
int main(void)
{
time_t t;

  srand(time(&t));

do
{
    fun();
    
} while(stop_w());

  return 0;
}
/* ------------------------------------ */
/* ------------------------------------ */


Je vais utiliser les fonctions X_U_mZ(); X_V_mZ(); sur une matrice conjuguée symétrique. Cela va me donner les valeurs propres et les valeurs singulières de A.


Exemple de sortie écran :
 ----------------------------------
 A :
   +193.00   +0.00i      -5.00  -56.00i     +39.00  -52.00i 
     -5.00  +56.00i     +88.00   +0.00i      -1.00  +40.00i 
    +39.00  +52.00i      -1.00  -40.00i    +304.00   +0.00i 

 U :
   +0.2956 -0.3257i    -0.6179 +0.5202i    +0.2581 +0.2960i 
   +0.0616 +0.2057i    -0.2910 -0.2012i    +0.6403 -0.6471i 
   +0.8721 +0.0000i    +0.4717 -0.0000i    +0.1305 -0.0000i 

 V :
   +0.2956 -0.3257i    -0.6179 +0.5202i    +0.2581 +0.2960i 
   +0.0616 +0.2057i    -0.2910 -0.2012i    +0.6403 -0.6471i 
   +0.8721 +0.0000i    +0.4717 -0.0000i    +0.1305 -0.0000i 

 S = U_T * A * V :
 +345.9988  +0.0000i    +0.0000  +0.0000i    +0.0000  -0.0000i 
   +0.0000  +0.0000i  +179.1120  -0.0000i    -0.0000  +0.0000i 
   +0.0000  +0.0000i    -0.0000  -0.0000i   +59.8892  -0.0000i 

 Press return to continue. 


 ----------------------------------
 S = U_T * A * V :
 +345.9988  +0.0000i    +0.0000  +0.0000i    +0.0000  -0.0000i 
   +0.0000  +0.0000i  +179.1120  -0.0000i    -0.0000  +0.0000i 
   +0.0000  +0.0000i    -0.0000  -0.0000i   +59.8892  -0.0000i 

 Singular value : 
 +345.9988  +0.0000i 
 +179.1120  +0.0000i 
  +59.8892  +0.0000i 

 Copy/Past into the octave window.

 A=[
+193+0*i,-5-56*i,+39-52*i;
-5+56*i,+88+0*i,-1+40*i;
+39+52*i,-1-40*i,+304+0*i]

 SvdValue = svd (A,10) 
 EigenValues = eigs (A,10)


Exemple de sortie écran dans la fenêtre de octave :
 ----------------------------------

>>  A=[

+193+0*i,-5-56*i,+39-52*i;

-5+56*i,+88+0*i,-1+40*i;

+39+52*i,-1-40*i,+304+0*i]



 SvdValue = svd (A,10)

 EigenValues = eigs (A,10)

A =

   193 +   0i    -5 -  56i    39 -  52i
    -5 +  56i    88 +   0i    -1 +  40i
    39 +  52i    -1 -  40i   304 +   0i

SvdValue =

   345.999
   179.112
    59.889

EigenValues =

   345.999
   179.112
    59.889

>>