Aller au contenu

Mathc complexes/c05c

Un livre de Wikilivres.

Application


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


c01c.c
/* ------------------------------------ */
/*  Save as :   c01c.c                   */
/* ------------------------------------ */

/* ------------------------------------ */
#include "w_a.h"
/* ------------------------------------ */
void fun(int r,int c)
{
double **A          = r_mZ(i_mZ(r,c),9.);
double **A_T        =      i_mZ(c,r);
double **SvdValue   =      i_mZ(r,C1);

int rA = rsize_Z(A);
int cA = csize_Z(A);

  clrscrn();
  printf(" Copy/Past into the octave windows \n\n\n");
  p_Octave_mZ(A,"a",P0,P0);  
  printf(" SvdValue = svd (a,10)\n\n\n");
  stop();

  clrscrn();
  printf(" A :");
  p_mZ(A, S2,P0, S2,P0, C10); 
  
  if( rA>=cA)
     {
	  SvdValue   = i_mZ(cA,C1);
      svd_mZ(A,SvdValue);
     }
  else
     {
	  SvdValue   = i_mZ(rA,C1);
      svd_mZ(transpose_mZ(A,A_T),SvdValue);
     }  
    
  printf(" SvdValue :");
  p_mZ(SvdValue, S10,P4, S10,P4, C3); 
       
  f_mZ(A);
  f_mZ(A_T);
  f_mZ(SvdValue);
}
/* ------------------------------------ */
int main(void)
{
time_t t;

  srand(time(&t));

do
{
  fun(rp_I(R2)+R2,rp_I(R2)+R2);
} while(stop_w());

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


Je veux calculer les valeurs singulières de la matrice M.

Méthode 1 :

- Je calcule M_t*M
- Je calcule les valeurs propres de M_t*M.
- Je calcule la racine carrée de chaque valeur propre et j'obtiens les valeurs singulières.


Méthode 2 :

- Je calcule M*M_T
- Je calcule les valeurs propres de M*M_T.
- Je calcule la racine carrée de chaque valeur propre et j'obtiens les valeurs singulières.


Remarque :

- M_t*M et M*M_T sont des matrices symétriques. Elles ont donc des valeurs propres réelles. Et par chance elles sont positives. On peut donc toujours en prendre la racine carrée.


- M_t*M et M*M_T n'ont pas en générale la même taille. L'une a donc plus de valeurs propres que l'autre. Ce n'est pas un problème car les valeurs propres supplémentaires sont toujours nulles.


Mon travail fonctionne bien quand le nombres de lignes est supérieur ou égale aux nombres de colonnes. voir le code. On choisie donc soit de travailler directement sur la matrice M ou sur sa transposé M_T


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


 a=[
+4.0-7*i,-1.0+8*i,-1.0+2*i,-1.0+2*i,+6.0+4*i,+2.0-1*i,-1.0+8*i,-3.0-7*i;
-1.0+8*i,-9.0-7*i,+8.0+8*i,+6.0+8*i,-1.0+8*i,-5.0+8*i,+8.0-1*i,+6.0+2*i;
-5.0+4*i,-9.0-5*i,+6.0+8*i,+4.0-9*i,-9.0+4*i,-7.0-9*i,-9.0-9*i,+4.0-9*i;
-5.0+4*i,-7.0-3*i,-9.0-1*i,-9.0-9*i,+6.0+2*i,-7.0+4*i,+2.0+4*i,-5.0+6*i;
-5.0-3*i,-9.0-1*i,+8.0-1*i,-7.0-7*i,+2.0+4*i,-7.0+2*i,+2.0-1*i,-1.0+4*i;
+2.0-5*i,-5.0-1*i,-5.0+4*i,+8.0-1*i,-5.0-3*i,+2.0+4*i,+4.0-7*i,-7.0-9*i;
-7.0+6*i,-7.0-5*i,-5.0-5*i,+2.0+6*i,+6.0+6*i,-5.0-5*i,-5.0+4*i,-9.0+4*i;
+6.0+4*i,-3.0+2*i,-7.0-1*i,-9.0-9*i,-3.0+2*i,-3.0-7*i,+6.0-9*i,+4.0-1*i]

 SvdValue = svd (a,10)


 Press return to continue. 
 
 
  A :
+4-7i -1+8i -1+2i -1+2i +6+4i +2-1i -1+8i -3-7i 
-1+8i -9-7i +8+8i +6+8i -1+8i -5+8i +8-1i +6+2i 
-5+4i -9-5i +6+8i +4-9i -9+4i -7-9i -9-9i +4-9i 
-5+4i -7-3i -9-1i -9-9i +6+2i -7+4i +2+4i -5+6i 
-5-3i -9-1i +8-1i -7-7i +2+4i -7+2i +2-1i -1+4i 
+2-5i -5-1i -5+4i +8-1i -5-3i +2+4i +4-7i -7-9i 
-7+6i -7-5i -5-5i +2+6i +6+6i -5-5i -5+4i -9+4i 
+6+4i -3+2i -7-1i -9-9i -3+2i -3-7i +6-9i +4-1i 

 SvdValue :
 +37.18165  -0.00000i 
 +31.90760  +0.00000i 
 +26.89274  +0.00000i 
 +20.59610  -0.00000i 
 +17.42731  -0.00000i 
 +12.12789  +0.00000i 
 +10.22487  -0.00000i 
  +5.71546  +0.00000i 


 Press return to continue
 Press X      to stop