Aller au contenu

Mathc complexes/008

Un livre de Wikilivres.


Valeurs propres, Valeurs singulières


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


c00a.c
/* ------------------------------------ */
/*  Save as :   c00a.c                  */
/* ------------------------------------ */
#include "w_a.h"
/* ------------------------------------ */
#define FACTOR_E    +1.E-2         
#define RCA          RC3  
/* ------------------------------------ */ 
/* ------------------------------------ */
double **invEigsValue_mZ(
double **EigsValue,
double **invEigsValue
)
{
int  r;
int  c;
nb_Z a;

  for (   r=R1; r<EigsValue[R_SIZE][C0]; r++)
    for ( c=C1; c<EigsValue[C_SIZE][C0]; c+=C2)

        if(((r-R1)*C2)==c-C1)
          {
             a = inv_Z(i_Z( EigsValue[r][c], EigsValue[r][c+C1]));
           
               invEigsValue[r][c   ] = a.r;
               invEigsValue[r][c+C1] = a.i;
          }
              
 return(invEigsValue);
}
/* ------------------------------------ */     
/* ------------------------------------ */
void fun(void)
{                          
double a[RCA*(RCA*C2)] ={   
+4,-53,-35,-14,-23,+37,
+58,+41,+65,-1,+6,+11,
+87,+6,-41,-97,+32,-63
};
                       
double **A            = ca_A_mZ(a, i_mZ(RCA,RCA));
double **invA         =            i_mZ(RCA,RCA);

double **V            =            i_mZ(RCA,RCA);
double **invV         =            i_mZ(RCA,RCA);
double **T            =            i_mZ(RCA,RCA);

double **EigsValue    =            i_mZ(RCA,RCA);
double **invEigsValue =            i_mZ(RCA,RCA);

  clrscrn();
  printf(" Copy/Past into the octave windows \n\n\n");
  p_Octave_mZ(A,"a",P0,P0);  
  printf(" [V, E]  = eigs (a,%d) \n\n\n",RCA);

  printf(" V :");
  eigs_V_mZ(A,V,FACTOR_E);
  pE_mZ(V, S12,P4, S12,P4, C3);
  
  printf(" inv(V) ... Some time the matrix is not invertible :");
  inv_mZ(V,invV);
  pE_mZ(invV, S12,P4, S12,P4, C3);
  stop();

  clrscrn();    
  printf(" EigsValue = invV * A * V");
  mul_mZ(invV,A,T);
  mul_mZ(T,V,EigsValue); 
  pE_mZ(clean_eyes_mZ(EigsValue), S12,P4, S12,P4, C3);
  
  printf(" invEigsValue :");
  invEigsValue_mZ(EigsValue, invEigsValue);
  pE_mZ(invEigsValue, S12,P4, S12,P4, C3);  
  stop();

  clrscrn();        
  printf(" invA = V * invEigsValue * invV");
  mul_mZ(V,invEigsValue,T);
  mul_mZ(T,invV,invA); 
  pE_mZ(invA, S12,P4, S12,P4, C3);

  printf(" Ide = A * invA ");
  mul_mZ(A,invA,T); 
  p_mZ(T, S10,P4, S8,P4, C3); 
  stop();
                   
  f_mZ(A);
  f_mZ(invA);
  f_mZ(V);  
  f_mZ(invV);  
  f_mZ(T);  
  f_mZ(EigsValue);
  f_mZ(invEigsValue);
}
/* ------------------------------------ */
int main(void)
{
    fun();
    
  return 0;
}
/* ------------------------------------ */
/* ------------------------------------ */


Exemple de sortie écran :
 Copy/Past into the octave windows 


 a=[
+4-53*i,-35-14*i,-23+37*i;
+58+41*i,+65-1*i,+6+11*i;
+87+6*i,-41-97*i,+32-63*i]

 [V, E]  = eigs (a,3) 


 V :
 -3.4790e-01 -3.5507e-01i  +3.8438e-02 +2.0039e-01i  +5.0800e-01 +2.1379e-01i 
 +1.6384e-01 +8.1577e-02i  -3.1879e-01 +4.1999e-01i  -4.2139e-02 -6.3360e-01i 
 +8.4817e-01 +0.0000e+00i  +8.2483e-01 +0.0000e+00i  +5.4130e-01 +0.0000e+00i 

 inv(V) ... Some time the matrix is not invertible :
 -5.7450e-01 +8.1654e-01i  +4.3646e-01 +2.9873e-01i  +5.4595e-01 -5.2619e-03i 
 +1.7040e-01 -7.5982e-01i  -5.3195e-01 -7.8327e-01i  +4.1540e-01 -3.7858e-02i 
 +6.4053e-01 -1.2164e-01i  +1.2668e-01 +7.2545e-01i  +3.5895e-01 +6.5932e-02i 

 Press return to continue. 


 EigsValue = invV * A * V
 +2.3577e-01 -1.2456e+02i  +0.0000e+00 +0.0000e+00i  +0.0000e+00 +0.0000e+00i 
 +0.0000e+00 +0.0000e+00i  +9.9834e+01 -2.4970e+01i  +0.0000e+00 +0.0000e+00i 
 +0.0000e+00 +0.0000e+00i  +0.0000e+00 +0.0000e+00i  +9.2973e-01 +3.2533e+01i 

 invEigsValue :
 +1.5195e-05 +8.0280e-03i  +0.0000e+00 +0.0000e+00i  +0.0000e+00 +0.0000e+00i 
 +0.0000e+00 +0.0000e+00i  +9.4269e-03 +2.3578e-03i  +0.0000e+00 +0.0000e+00i 
 +0.0000e+00 +0.0000e+00i  +0.0000e+00 +0.0000e+00i  +8.7771e-04 -3.0713e-02i 

 Press return to continue. 


 invA = V * invEigsValue * invV
 +4.7522e-03 -6.3743e-03i  +1.5758e-02 +1.7958e-03i  +5.1011e-03 -5.7869e-03i 
 -1.1342e-02 +5.1376e-03i  +9.5446e-04 -1.2247e-02i  -8.9346e-03 +1.1854e-03i 
 -4.4826e-03 -2.0184e-02i  +7.4794e-03 -5.9105e-03i  +4.6131e-03 -1.7054e-03i 

 Ide = A * invA 
   +1.0000 +0.0000i    +0.0000 -0.0000i    -0.0000 -0.0000i 
   +0.0000 -0.0000i    +1.0000 -0.0000i    -0.0000 -0.0000i 
   +0.0000 -0.0000i    -0.0000 -0.0000i    +1.0000 -0.0000i 

 Press return to continue.