Aller au contenu

Mathc complexes/02c

Un livre de Wikilivres.
SommaireUtilise la commande "Retour en Arrière" de ton navigateur.


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


c00a.c
/* ------------------------------------ */
/*  Save as :   c00a.c                  */
/* ------------------------------------ */
#include "w_a.h"
/* ------------------------------------ */
void fun(int r)
{
double **A          = r_mZ(i_mZ(r,r),99.);
double **EigsValue  =      i_mZ(r,C1);

  clrscrn();
  printf(" Copy/Past into the octave windows \n\n");
  p_Octave_mZ(A,"a",P0,P0);  
  printf(" EigenValues  = eigs (a,%d)\n\n\n",r);
         
  printf(" EigsValue :");
  eigs_mZ(A,EigsValue);  
  p_mZ(EigsValue, S10,P4, S10,P4, C5); 
       
  f_mZ(A);
  f_mZ(EigsValue);
}
/* ------------------------------------ */
int main(void)
{
time_t t;

  srand(time(&t));

do
{
  fun(rp_I(R2)+R3);
} 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_mZ(M,T);
 
 for(i=0;i<1000;i++)
     { 
	    QR_mZ(T,Q,R);  
       mul_mZ(R,Q,T);
     }


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

     
  for(re=R1,ce=C1;re<=r;re++,ce+=C2)
     { 
	   EigsValue[re][C1] = T[re][ce];
	   EigsValue[re][C2] = T[re][ce+C1];
     }


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

 a=[
-53+82*i,-11-51*i,+88-49*i,+1-16*i,+82+37*i;
-60-6*i,-69+36*i,+51+27*i,-96+4*i,-67-61*i;
-79-78*i,-8-13*i,+93-43*i,-87+13*i,+87+27*i;
+29+38*i,+61-28*i,+90+80*i,+94-47*i,-48-87*i;
-3-92*i,-73-44*i,+49+96*i,+21-98*i,-72-5*i]

 EigenValues  = eigs (a,5)


 EigsValue :
  +74.6084 -164.7657i 
  +59.6316 +153.6893i 
  -78.3801 +129.8447i 
 -131.1392  -66.3198i 
  +68.2793  -29.4485i 


 Press   return to continue
 Press X return to stop


Le code de la fonction eigs_mZ(); :
/* ------------------------------------ */
/* ------------------------------------ */
double **eigs_mZ(
double **A,
double **EigsValue
)
{
int r = rsize_Z(A);

double **T      =      i_mZ(r,r);
double **Q      =      i_mZ(r,r);
double **R      =      i_mZ(r,r);
int i;
int re, ce;

 c_mZ(A,T);
 
 for(i=0;i<1000;i++)
     { 
	   QR_mZ(T,Q,R);  
        mul_mZ(R,Q,T);
     }
     
  for(re=R1,ce=C1;re<=r;re++,ce+=C2)
     { 
	   EigsValue[re][C1] = T[re][ce];
	   EigsValue[re][C2] = T[re][ce+C1];
     }
     
  f_mZ(T);
  f_mZ(Q);
  f_mZ(R); 
  
  return(EigsValue);    
}
/* ------------------------------------ */
/* ------------------------------------ */