Cond

행렬의 조건수 계산

double matrix::Cond(
  const ENUM_MATRIX_NORM  norm      // 행렬 노름
   );

매개 변수

노름

[in] ENUM_MATRIX_NORM에서 노름의 순서

반환값

행렬의 조건수. 무한할 수 있습니다.

참조

x의 조건수는 x[1]의 역수의 x배의 노름으로 정의됩니다. 노름은 일반적인 L2 노름(제곱합의 루트) 또는 기타 여러 행렬의 노름 중 하나일 수 있습니다.

조건 umber는 행렬 A 놈의 곱과 그 역수와 같은 K 값입니다. 조건수가 높은 행렬을 나쁜 조건인 행렬이라고 합니다. 조건 번호가 낮은 것을 좋은 조건의 상태라고 합니다. 역행렬은 유사 역행을 이용하여 얻어지므로 행렬의 각짐과 비특이성 조건에 제약을 받지 않습니다.

스펙트럼 조건 번호는 예외입니다.

 

MQL5에서 스펙트럼 조건 수를 계산하기 위한 간단한 알고리즘:

double MatrixCondSpectral(matrixa)
  {
   double norm=0.0;
   vector v=a.Spectrum();
 
   if(v.Size()>0)
     {
      double max_norm=v[0];
      double min_norm=v[0];
      for(ulong i=1i<v.Size(); i++)
        {
         double real=MathAbs(v[i]);
         if(max_norm<real)
            max_norm=real;
         if(min_norm>real)
            min_norm=real;
        }
      max_norm=MathSqrt(max_norm);
      min_norm=MathSqrt(min_norm);
      if(min_norm>0.0)
         norm=max_norm/min_norm;
     }
 
   return(norm);
  }

 

MQL5 예:

  matrix a= {{10, -1}, {010}, { 101}};
  Print("a.Cond(MATRIX_NORM_P2)="a.Cond(MATRIX_NORM_P2));
  Print("a.Cond(MATRIX_NORM_FROBENIUS)="a.Cond(MATRIX_NORM_FROBENIUS));
  Print("a.Cond(MATRIX_NORM_INF)="a.Cond(MATRIX_NORM_INF));
  Print("a.Cond(MATRIX_NORM_MINUS_INF)="a.Cond(MATRIX_NORM_MINUS_INF));
  Print("a.Cond(MATRIX_NORM_P1)=)"a.Cond(MATRIX_NORM_P1));
  Print("a.Cond(MATRIX_NORM_MINUS_P1)="a.Cond(MATRIX_NORM_MINUS_P1));
  Print("a.Cond(MATRIX_NORM_P2)="a.Cond(MATRIX_NORM_P2));
  Print("a.Cond(MATRIX_NORM_MINUS_P2)="a.Cond(MATRIX_NORM_MINUS_P2));
 
  /*
  matrix a
  [[1,0,-1]
  [0,1,0]
  [1,0,1]]
  a.Cond(MATRIX_NORM_P2)=1.414213562373095
  a.Cond(MATRIX_NORM_FROBENIUS)=3.162277660168379
  a.Cond(MATRIX_NORM_INF)=2.0
  a.Cond(MATRIX_NORM_MINUS_INF)=0.9999999999999997
  a.Cond(MATRIX_NORM_P1)=)2.0
  a.Cond(MATRIX_NORM_MINUS_P1)=0.9999999999999998
  a.Cond(MATRIX_NORM_P2)=1.414213562373095
  a.Cond(MATRIX_NORM_MINUS_P2)=0.7071067811865472
  */

 

파이썬 예:

import numpy as np
from numpy import linalg as LA
a = np.array([[10, -1], [010], [101]])
print("a \n",a)
print("LA.cond(a)=",LA.cond(a))
print("LA.cond(a, 'fro')=",LA.cond(a, 'fro'))
print("LA.cond(a, np.inf)=",LA.cond(anp.inf))
print("LA.cond(a, -np.inf)=",LA.cond(a, -np.inf))
print("LA.cond(a, 1)=",LA.cond(a1))
print("LA.cond(a, -1)=",LA.cond(a, -1))
print("LA.cond(a, 2)=",LA.cond(a2))
print("LA.cond(a, -2)=",LA.cond(a, -2))
 
a 
 [[ 1  0 -1]
 [ 0  1  0]
 [ 1  0  1]]
LA.cond(a)= 1.4142135623730951
LA.cond(a, 'fro')= 3.1622776601683795
LA.cond(anp.inf)= 2.0
LA.cond(a, -np.inf)= 1.0
LA.cond(a1)= 2.0
LA.cond(a, -1)= 1.0
LA.cond(a2)= 1.4142135623730951
LA.cond(a, -2)= 0.7071067811865475