Mathc matrices/b0a4a

Un livre de Wikilivres.
Aller à la navigation Aller à la recherche


Sommaire


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


Crystal Clear mimetype source c.png b0a4a.c
'
/* ------------------------------------ */
/*  Save as :  b0a4a.c                   */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
void fun(void)
{
double ab[R4*C4]={
+150,-925,+32,-475,
-925,-253,+630,+302,
+32,+630,-183,-59,
-475,+302,-59,+668
};

int r = RC4;

double **A         = ca_A_mR(ab,i_mR(r,r));
double **EignVector=               i_mR(r,r);
double **T_EignVector=             i_mR(r,r);
double **EigsValue =               i_mR(r,C1);

double **T1=             i_mR(r,r);
double **T2=             i_mR(r,r);

  clrscrn();
  printf(" Copy/Past into the octave windows \n\n");
  p_octave_mR(A,"a",S1,P0);
  printf(" [V, E] = eigs (a,10) \n\n");
  stop();

  clrscrn();   
  eignVectoruv_mR(A,EignVector); 
  printf(" EignVector:");
  p_mR(EignVector,S10,P4,C6);

  printf(" EigsValue : T_EignVector * A * EignVector");   
  transpose_mR(EignVector,T_EignVector);   
  mul_mR(T_EignVector,A,T1);
  mul_mR(T1,EignVector,T2);
  p_mR(T2,S10,P4,C6);  
   
  eigsuv_mR(A,EigsValue);
  printf(" EigsValue :");
  p_mR(EigsValue,S10,P4,C1);   
  stop();
   
  f_mR(A);
  
  f_mR(EignVector);
  f_mR(T_EignVector);
  
  f_mR(EigsValue);  
     
  f_mR(T1);
  f_mR(T2);
}
/* ------------------------------------ */
int main(void)
{

  fun();

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


Ce bug apparait sur la matrice qui devrait être une matrice diagonale avec les valeurs propres sur la diagonale, mais cela ne correspond pas au résultat attendu. (voir résultat dans octave)

+1394.5038 +1394.5038    -0.0000    +0.0000 
+1394.5038 +1394.5038    -0.0000    +0.0000 
   -0.0000    -0.0000  +405.3394    -0.0000 
   +0.0000    +0.0000    -0.0000  -161.2632

Les valeurs propres calculer ci-dessous,

 EigsValue :
+1394.5038 
-1256.5800 
 +405.3394 
 -161.2632

correspondent bien aux valeurs propres données par octave.

Les vecteurs propres correspondent bien aux vecteurs propres donnés par octave. Malheureusement il semble que le deuxième vecteur propre est simplement la copie du premier. On dirait qu'il n'a pas été calculer avec la deuxième valeur propre.

  EignVector:
   +0.6008    +0.6008    +0.1824    +0.6000 
   -0.5106    -0.5106    -0.4330    +0.0296 
   -0.1696    -0.1696    -0.5249    +0.7018 
   -0.5913    -0.5913    +0.7098    +0.3829

Il va donc falloir essayer de découvrir pourquoi ?


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

 a=[
+150,-925,+32,-475;
-925,-253,+630,+302;
+32,+630,-183,-59;
-475,+302,-59,+668]

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

 Press return to continue. 


 ------------------------------------ 
 EignVector:
   +0.6008    +0.6008    +0.1824    +0.6000 
   -0.5106    -0.5106    -0.4330    +0.0296 
   -0.1696    -0.1696    -0.5249    +0.7018 
   -0.5913    -0.5913    +0.7098    +0.3829 


+1394.5038 +1394.5038    -0.0000    +0.0000 
+1394.5038 +1394.5038    -0.0000    +0.0000 
   -0.0000    -0.0000  +405.3394    -0.0000 
   +0.0000    +0.0000    -0.0000  -161.2632 

 EigsValue :
+1394.5038 
-1256.5800 
 +405.3394 
 -161.2632 


 Press return to continue
 Press X      to stop


Enregistrer dans un fichier cette sortie octave pour pouvoir vérifier rapidement si les valeurs propres et les vecteurs propres correspondent bien aux valeurs calculées par notre programmme.

Exemple de sortie Octave :
  >>  a=[
+150,-925,+32,-475;
-925,-253,+630,+302;
+32,+630,-183,-59;
-475,+302,-59,+668]
a =

   150  -925    32  -475
  -925  -253   630   302
    32   630  -183   -59
  -475   302   -59   668

>>
>>  [V, E] = eigs (a,10)
V =

  -0.6007990  -0.4957134   0.1823898   0.6000357
   0.5105608  -0.7422830  -0.4329758   0.0295902
   0.1695987   0.4508004  -0.5248908   0.7017870
   0.5912737   0.0079513   0.7097574   0.3828533

E =

Diagonal Matrix

   1394.50         0         0         0
         0  -1256.58         0         0
         0         0    405.34         0
         0         0         0   -161.26

>>