Cond

Calcula o número de condicionamento da matriz.

double matrix::Cond(
  const ENUM_MATRIX_NORM  norm      // norma da matriz
   );

Parâmetros

norm

[in]  Ordem da norma a partir da enumeração ENUM_MATRIX_NORM.

Valor retornado

Número de condicionamento da matriz. Pode ser infinito.

Observação

O número de condicionamento x é definido como o produto da norma x e seu inverso x [1]. Nesse caso, a norma pode ser a norma L2 usual (raiz da soma dos quadrados) ou uma norma matricial diferente.

O número de condicionamento (ou medida) de uma matriz é o valor K, que é igual ao produto das normas da matriz A e seu inverso. Matrizes com um grande número de condicionamento são chamadas mal condicionadas e vice-versa, matrizes com um pequeno número são chamadas bem condicionadas. A matriz inversa é obtida usando a pseudo-inversão, para não se limitar à condição de que a matriz seja quadrada e não-singular.

Uma exceção é o número de condicionamento espectral.

 

Algoritmo simples para calcular o número de condicionamento espectral em 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);
  }

 

Exemplo em 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
  */

 

Exemplo em Python:

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