Eig

Calcule les valeurs propres et les vecteurs propres droits d'une matrice carrée.

bool matrix::Eig(
  matrix&  eigen_vectors,         // matrice de vecteurs propres 
  vector&  eigen_values           // vecteur de valeurs propres 
   );

Solution complexe de valeurs propres et de vecteurs propres

bool matrix::Eig(
  matrix<complex>& eigen_vectors// matrice des vecteurs propres
  vector<complex>& eigen_values   // vecteur de valeurs propres
   );

Paramètres

eigen_vectors

[out]  Matrice de vecteurs propres verticaux.

eigen_values

[out]  Vecteur de valeurs propres.

Valeur de Retour

Renvoie true en cas de succès, false sinon.

Note

Si une solution complexe est rencontrée lors du calcul des valeurs propres, le calcul est arrêté et le code d'erreur est défini sur 4019 ERR_MATH_OVERFLOW. Utilisez la surcharge complexe de la méthode Eig pour obtenir une solution complète dans un espace complexe

Si une valeur propre complexe a une partie imaginaire égale à zéro, alors c'est une valeur propre réelle. Cela peut être vu dans l’exemple ci-dessous.
 

Exemple :

void OnStart()
  {
   matrix matrix_a =
     {
        {-3.4745891.106384, -9.091977,-3.925227 },
        {-5.5221392.366887,-15.162351,-6.357512 },
        { 8.394926,-2.96006722.2921159.524129 },
        { 7.803242,-2.08028719.2177068.186645 }
     };
 
   matrix eigen_vectors;
   vector eigen_values;
 
   bool res=matrix_a.Eig(eigen_vectorseigen_values);
   Print("res=",res,"  error=",GetLastError());
   Print("Vecteurs propres : \n",eigen_vectors"\nValeurs Propres : \n",eigen_values);
 
//--- vérifie l'exactitude A * v = lambda * v
   int vectors=0;
   for(ulong n=0n<eigen_values.Size(); n++)
     {
      vector eigen_vector=eigen_vectors.Col(n);
      vector vector_d1   =eigen_vector*eigen_values[n];
      vector vector_d2   =matrix_a.MatMul(eigen_vector);
 
      ulong errors=vector_d1.Compare(vector_d2,1e-13);
      if(errors==0)
         vectors++;
     }
   Print("vecteurs = ",vectors);
 
//--- solution complexe
   matrix<complexeigen_vectors_c;
   vector<complexeigen_values_c;
   ResetLastError();
   res=matrix_a.Eig(eigen_vectors_c,eigen_values_c);
   Print("res=",res,"  error=",GetLastError());
   Print("Vecteurs propres : \n",eigen_vectors_c"\nValeurs Propres : \n",eigen_values_c);
 
//--- vérifie l'exactitude A * v = lambda * v
   matrixc matrix_c;
   matrix_c.Assign(matrix_a);
   vectors=0;
   for(ulong n=0n<eigen_values_c.Size(); n++)
     {
      vectorc eigen_vector_c=eigen_vectors_c.Col(n);
      vectorc vector_c1     =eigen_vector_c*eigen_values_c[n];
      vectorc vector_c2     =matrix_c.MatMul(eigen_vector_c);
 
      ulong errors=vector_c1.Compare(vector_c2,1e-13);
      if(errors==0)
         vectors++;
     }
   Print("vecteurs = ",vectors);
  }
/* Résultat
   res=true  error=4019
  Vecteurs propres : 
   [[0.2649667608713664]
    [0.4488818803991876]
    [-0.6527335897527492]
    [-0.5497604331807768]]
  Valeurs Propres : 
   [28.94158645962942]
  vecteurs = 1
   res=true  error=0
  Vecteurs propres : 
   [[(0.2649667608713664,0),(0.2227392219204762,0.3745470492013296),(0.403285439089771,-0.1345146135716524),(-0.2050778513598178,0)]
    [(0.4488818803991876,0),(-0.2613452530342438,-0.3685707727819327),(-0.3968506126372395,0.5257002255533059),(0.8014703373356256,0)]
    [(-0.6527335897527492,0),(-0.3418479634708521,-0.3299830378162041),(-0.3553021031180292,-0.03685418759727989),(-0.05618703726964112,0)]
    [(-0.5497604331807768,0),(0.523227993452828,0.3262508584080381),(0.3512835596143666,0.3666300350184092),(0.558955624442244,0)]]
  Valeurs Propres : 
   [(28.94158645962942,0),(0.01022501104810897,0.02954980822331488),(0.01022501104810897,-0.02954980822331488),(0.4090215182743634,0)]
  vecteurs = 3
*/