Eig

Calcula os autovalores à direita e os autovetores de uma matriz quadrada.

bool matrix::Eig(
  matrix&  eigen_vectors,         // matriz vetores próprios
  vector&  eigen_values           // vetor de autovalor
   );

Solução complexa de valores próprios e vetores próprios

bool matrix::Eig(
  matrix<complex>& eigen_vectors// matriz de vetores próprios
  vector<complex>& eigen_values   // vetor de autovalores
   );

Parâmetros

eigen_vectors

[out]  Matriz de autovetores verticais.

eigen_values

[out]  Vetor de autovalores.

Valor retornado

Retorna true se bem-sucedido, caso contrário, false.

Observação

Se, ao calcular os autovalores, for encontrada uma solução complexa, o cálculo será interrompido e o código de erro será definido como 4019 (ERR_MATH_OVERFLOW). Para obter uma solução completa no espaço complexo, precisamos usar o método de sobrecarga complexa Eig

Se um autovalor complexo tiver parte imaginária igual a zero, ele já é um autovalor real. E isso pode ser visto no exemplo abaixo.

Exemplo:

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);
 
//--- check correctness 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);
 
//--- complex solution
   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);
 
//--- check correctness 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);
  }
/* Результат
   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
*/