Mathc matrices/c05b

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 c05b.c
'
/* ------------------------------------ */
/*  Save as :   c05b.c                   */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
void fun(int r)
{
double **A         = rsymmetric_mR(i_mR(r,r),99.);
double **EigsValue =               i_mR(r,C1);


  clrscrn();
  printf(" A :");
  p_mR(A,S5,P0,C6); 
  
  printf(" Copy/Past into the octave windows \n\n");
  p_Octave_mR(A,"a",P0);
  printf(" EigenValues  = eigs (a,10) \n\n");
  stop();

  clrscrn();
  printf(" A :");
  p_mR(A,S5,P0,C6);   

  eigs_value_uv_mR(A,EigsValue);
  printf(" EigsValue :");
  p_mR(EigsValue,S13,P5,C1);
        
  f_mR(A);
  f_mR(EigsValue);
}
/* ------------------------------------ */
int main(void)
{
time_t t;

  srand(time(&t));

do
{
  fun(rp_I(R3)+R2);

} while(stop_w());

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


Je veux calculer les valeurs propres de la matrice M.


  • J'utilise la QR décomposition de M
  • Puis je calcule RQ
  • RQ devient la nouvelle valeur de M
  • Et je recommence un cycle.


Je copie M dans T pour ne pas modifier M. Puis j'applique 1000 fois l'algorithme vue plus haut.

c_mR(M,T);

 for(i=0;i<1000;i++)
     { 
       QR_uv_mR(T,Q,R);  
        mul_mR(R,Q,T);
     }


A la fin je trouve sur la diagonale de T les valeurs propres.

     
  for(rc=R1;rc<=r;rc++)
     { 
	   EigsValue[rc][C1] = T[rc][rc];
     }


Exemple de sortie écran :
 A :
  +22   +54   +14 
  +54   -67   -83 
  +14   -83   +52 

 Copy/Past into the octave windows 

 a=[
+22,+54,+14;
+54,-67,-83;
+14,-83,+52]

 EigenValues  = eigs (a,10) 

 Press return to continue.


Exemple de sortie écran :
 A :
  +22   +54   +14 
  +54   -67   -83 
  +14   -83   +52 

 EigsValue :
   -129.29348 
    +97.07976 
    +39.21372 


 Press return to continue
 Press X      to stop