Eig

정사각 행렬의 고유값과 우고유벡터를 계산

bool matrix::Eig(
  matrix&  eigen_vectors,         // 고유 벡터의 행렬
  vector&  eigen_values           // 고유값의 벡터
   );

고유값과 고유벡터의 복소해

bool matrix::Eig(
  matrix<complex>& eigen_vectors//  고유 벡터 행렬 
  vector<complex>& eigen_values   // 고유값 벡터< /t5>
   );

매개 변수

eigen_vectors

【out】 수직 고유 벡터의 행렬.

eigen_values

【out】 고유값의 벡터.

반환값

성공하면 true를 반환하고 그렇지 않으면 false를 반환.

주의

고유값을 계산할 때 복잡한 해가 발견되면 계산이 중지되고 오류 코드가 4019(ERR_MATH_OVERFLOW)로 설정됩니다. Eig 메서드의 복소 오버로드를 사용하여 복소 공간에서 완전한 해를 구합니다.

복소 고유값의 허수 부분이 0인 경우 이는 실수 고유값입니다. 이는 아래의 예에서 볼 수 있습니다.
 

예:

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);
 
//--- 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);
 
//--- 복소 해
   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);
 
//--- 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);
  }
/* Result
   res=true  error=4019
  고유 벡터:
   [[0.2649667608713664]
    [0.4488818803991876]
    [-0.6527335897527492]
    [-0.5497604331807768]]
  고유값:
   [28.94158645962942]
   vectors=1
   res=true  error=0
  고유 벡터:
   [[(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)]]
  고유값:
   [(28.94158645962942,0),(0.01022501104810897,0.02954980822331488),(0.01022501104810897,-0.02954980822331488),(0.4090215182743634,0)]
   vectors=3
*/