Cond

计算矩阵的条件数。

double matrix::Cond(

  const ENUM_MATRIX_NORM  norm      // 矩阵范数

   );

参数

范数

[输入]  来自 ENUM_MATRIX_NORM 的范数顺序

返回值

矩阵的条件数字。 也许是无限的。

注意

x 的条件数定义为 x 的范数乘以 x 的逆范数 [1]。 范数可以是通常的 L2-范数(平方和的根),或许多其它矩阵范数之一。

条件数 K 值,等于矩阵 A 的范数及其逆的乘积。 条件数太高的矩阵称为病态。 条件数较低的称为良态。 逆矩阵采用伪反演得到,不受矩阵的直点和非奇点条件的限制。

谱条件数是一个例外。

以 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))



a

 [[ 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