Cond

Calcola il numero di condizionamento di una matrice.

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

Parametri

norma

[in] Ordine della norma da ENUM_MATRIX_NORM

Valore Restituito

Il numero di condizionamento di una matrice.Può essere infinito.

Note

Il numero di condizionamento di x è definito come la norma di x volte la norma dell'inversa di x [1]. La norma può essere la solita norma L2 (radice della somma dei quadrati) o una di una serie di altre norme matriciali.

Il numero di condizionamento è il valore K uguale al prodotto delle norme matriciali A e la sua inversa. Le matrici con un numero di condizionamento elevato sono chiamate mal condizionate. Quelle con un numero di condizionamento basso sono chiamate ben condizionate. La matrice inversa si ottiene mediante pseudo-inversione, in modo da non essere limitata dalla condizione di squadratura e di non-singolarità della matrice.

Un'eccezione è il numero di condizionamento spettrale.

 

Un semplice algoritmo per calcolare il numero di condizionamento spettrale in 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);
  }

 

Esempio in 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
  */

 

Esempio in 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