Main Content

La traducción de esta página está obsoleta. Haga clic aquí para ver la última versión en inglés.

Determinar si la matriz es una matriz definida positiva simétrica

En este tema se explica cómo utilizar las funciones chol y eig para determinar si una matriz es definida positiva simétrica (una matriz simétrica con todos los valores propios positivos).

Método 1: Intentar la factorización de Cholesky

El método más eficaz para comprobar si una matriz es una matriz definida positiva simétrica es tan sencillo como intentar utilizar chol en la matriz. Si la factorización genera un error, la matriz no es una matriz definida positiva simétrica. Este método no requiere que la matriz sea simétrica para que la prueba sea exitosa (si la matriz no es simétrica, entonces la factorización falla).

A = [1 -1 0; -1 5 0; 0 0 7]
A = 3×3

     1    -1     0
    -1     5     0
     0     0     7

try chol(A)
    disp('Matrix is symmetric positive definite.')
catch ME
    disp('Matrix is not symmetric positive definite')
end
ans = 3×3

    1.0000   -1.0000         0
         0    2.0000         0
         0         0    2.6458

Matrix is symmetric positive definite.

El inconveniente de este método es que no se puede ampliar para comprobar también si la matriz es una matriz semidefinida positiva simétrica (cuyos valores propios pueden ser positivos o cero).

Método 2: Comprobar los valores propios

Aunque resulta menos eficaz utilizar eig para calcular todos los valores propios y comprobar sus valores, este método es más flexible, porque también puede utilizarlo para comprobar si una matriz es una matriz semidefinida positiva simétrica. No obstante, en las matrices pequeñas, la diferencia en el tiempo de cálculo entre los métodos es mínima a la hora de comprobar si una matriz es una matriz definida positiva simétrica.

Este método requiere que utilice issymmetric para comprobar si la matriz es simétrica antes de realizar la prueba (si la matriz no lo es, entonces no necesita calcular los valores propios).

tf = issymmetric(A)
tf = logical
   1

d = eig(A)
d = 3×1

    0.7639
    5.2361
    7.0000

isposdef = all(d > 0)
isposdef = logical
   1

Puede utilizar este método para comprobar si una matriz es una matriz semidefinida positiva simétrica con el comando all(d >= 0).

Consideraciones numéricas

Los métodos aquí detallados pueden ofrecer diferentes resultados para la misma matriz. Dado que ambos cálculos implican errores de redondeo, cada algoritmo comprueba la definición de una matriz que es ligeramente diferente a A. En la práctica, el uso de una tolerancia es un método de comparación más sólido, dado que los valores propios pueden ser cero en la precisión de la máquina y pueden ser ligeramente positivos o ligeramente negativos.

Por ejemplo, si una matriz tiene un valor propio en el orden de eps, el uso de la comparación isposdef = all(d > 0) devuelve true, aunque el valor propio sea cero y la matriz se clasifique mejor como una matriz semidefinida positiva simétrica.

Para realizar la comparación mediante una tolerancia, puede utilizar los comandos modificados

tf = issymmetric(A)
d = eig(A)
isposdef = all(d > tol)
issemidef = all(d > -tol)

La tolerancia define un radio en torno a cero, y cualquier valor propio que se encuentre dentro de dicho radio se trata como si fuera un cero. En la mayoría de los casos, length(d)*eps(max(d)) es una buena opción para la tolerancia, ya que tiene en cuenta la magnitud del valor propio mayor.

Consulte también

|

Temas relacionados