Cond

行列の条件数を計算します。

double matrix::Cond(
  const ENUM_MATRIX_NORM  norm     // 行列ノルム
  );

パラメータ

norm

[in] ENUM_MATRIX_NORMからのノルムの順序

戻り値

行列の条件数。無限の場合もあります。

注意事項

xの条件数は、xのノルムにxの逆数のノルムを掛けたものとして定義されます [1]。ノルムは、通常のL2ノルム(二乗和の平方根)または他の多くの行列ノルムの1つにすることができます。

条件数は、行列Aノルムとその逆数の積に等しいK値です。条件数が高い行列は、悪条件と呼ばれます。条件数が低いものは良条件と呼ばれます。逆行列は、正方行列性および非特異性の条件によって制限されないように、擬似逆行列を使用して取得されます。

例外はスペクトル条件番号です。

 

次は、MQL5でスペクトル条件数を計算するための単純なアルゴリズムです。

double MatrixCondSpectral(matrix& a)
 {
  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=1; i<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= {{1, 0, -1}, {0, 1, 0}, { 1, 0, 1}};
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
 */

 

Pythonの例

import numpy as np
from numpy import linalg as LA
a = np.array([[1, 0, -1], [0, 1, 0], [1, 0, 1]])
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(a, np.inf))
print("LA.cond(a, -np.inf)=",LA.cond(a, -np.inf))
print("LA.cond(a, 1)=",LA.cond(a, 1))
print("LA.cond(a, -1)=",LA.cond(a, -1))
print("LA.cond(a, 2)=",LA.cond(a, 2))
print("LA.cond(a, -2)=",LA.cond(a, -2))
 

[[ 1 0 -1]
[ 0 1 0]
[ 1 0 1]]
LA.cond(a)= 1.4142135623730951
LA.cond(a, 'fro')= 3.1622776601683795
LA.cond(a, np.inf)= 2.0
LA.cond(a, -np.inf)= 1.0
LA.cond(a, 1)= 2.0
LA.cond(a, -1)= 1.0
LA.cond(a, 2)= 1.4142135623730951
LA.cond(a, -2)= 0.7071067811865475