Eig

Berechnung der Eigenwerte und der rechten Eigenvektoren einer Quadratmatrix.

bool matrix::Eig(
  matrix&  eigen_vectors,         // Matrix der Eigenvektoren
  vector&  eigen_values           // Vektor der Eigenwerte
   );

Komplexe Lösung von Eigenwerten und Eigenvektoren

bool matrix::Eig(
  matrix<complex>& eigen_vectors// Matrix der Eigenvektoren
  vector<complex>& eigen_values   // Vektor der Eigenwerte
   );

Parameter

eigen_vectors

[out]  Matrix der vertikalen Eigenvektoren.

eigen_values

[out]  Vektor der Eigenwerte.

Rückgabewert

Gibt bei Erfolg true zurück, andernfalls false.

Hinweis

Wenn bei der Berechnung der Eigenwerte eine komplexe Lösung auftritt, wird die Berechnung abgebrochen und der Fehlercode auf 4019 (ERR_MATH_OVERFLOW) gesetzt. Verwenden Sie die komplexe Überladung der Eig-Methode, um eine vollständige Lösung im komplexen Raum zu ermitteln

Wenn ein komplexer Eigenwert einen Imaginäranteil gleich Null hat, dann ist das ein reeller Eigenwert. Dies ist im folgenden Beispiel zu sehen.
 

Beispiel:

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("Eigen vectors:\n",eigen_vectors"\nEigen Values:\n",eigen_values);
 
//--- Überprüfung der Korrektheit von 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("vectors=",vectors);
 
//--- Komplexe Lösung
   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("Eigen vectors:\n",eigen_vectors_c"\nEigen Values:\n",eigen_values_c);
 
//--- Überprüfung der Korrektheit von 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("vectors=",vectors);
  }
/* Ergebnis
   res=true  error=4019
   Eigen vectors:
   [[0.2649667608713664]
    [0.4488818803991876]
    [-0.6527335897527492]
    [-0.5497604331807768]]
   Eigen Values:
   [28.94158645962942]
   vectors=1
   res=true  error=0
   Eigen vectors:
   [[(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)]]
   Eigen Values:
   [(28.94158645962942,0),(0.01022501104810897,0.02954980822331488),(0.01022501104810897,-0.02954980822331488),(0.4090215182743634,0)]
   vectors=3
*/