Eig

Calcula los valores propios y los vectores propios derechos de una matriz cuadrada.

bool matrix::Eig(
  matrix&  eigen_vectors,         // matriz de vectores propios
  vector&  eigen_values           // vector de valores propios
   );

Es una solución compleja de valores propios y vectores propios

bool matrix::Eig(
  matrix<complex>& eigen_vectors// matriz de vectores propios
  vector<complex>& eigen_values   // vector de valores propios
   );

Parámetros

eigen_vectors

[out]  Matriz de vectores verticales propios.

eigen_values

[out]  Vector de valores propios.

Valor retornado

Retorna true en el caso de éxito, de lo contrario, false.

Observación

Si se encuentra una solución compleja mientras se calculan los valores propios, el cálculo se detendrá, mostrando además el código de error 4019 (ERR_MATH_OVERFLOW). Para obtener la solución completa en unn espacio complejo, deberemos utilizar la sobrecarga compleja del método Eig.

Si un valor propio complejo tiene una parte imaginaria igual a cero, entonces ya será un valor propio real. Y esto se puede ver en el siguiente ejemplo.

Ejemplo:

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);
  }
/* Resultado
   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
*/