sirve - matriz inversa en matlab codigo
¿Cómo saber si una matriz es singular? (4)
Esta pregunta ya tiene una respuesta aquí:
- Cómo encontrar si una matriz es Singular en Matlab 5 respuestas
¿Cómo podemos llegar a saber que una matriz 4x4 es singular o no?
¿Podemos llegar a saber esto sin aumentar nuestra matriz dada con la matriz de identidad y luego hacer las operaciones de fila?
Calcule el rango y compárelo con la dimensión. Si el rango es menor que la dimensión, entonces la matriz es singular.
El enfoque más confiable es realizar una descomposición de valor singular en la matriz. La relación de los valores singulares más grandes a los más pequeños debe estar dentro de una tolerancia razonable. Esta relación es el número de condición de la matriz. Con los valores de doble precisión, las cosas se vuelven muy difíciles con valores de doble precisión cuando el número de condición supera el millón o más, y ese es un límite bastante alto. Tenga en cuenta que una vez que tiene la SVD, es útil para muchas otras cosas además de solo calcular el número de condición.
La descomposición del valor singular es la motosierra del ejército suizo de análisis numérico; puede ser un poco pesado de una herramienta si sabes que la matriz no está singular / mal condicionada. Pero si no lo sabes, es una buena herramienta para saber. Particularmente con Matlab ya que es una herramienta incorporada.
Entonces, ¿cómo se puede identificar si una matriz es verdaderamente singular? (¿En MATLAB, sin usar papel y lápiz o cálculos simbólicos, o operaciones de hileras escritas a mano?) Los libros de texto a veces les dicen a los estudiantes que usen el determinante, entonces comenzaré allí.
En teoría, uno puede simplemente probar si el determinante de su matriz es cero. Así
M = magic(4)
M =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
det(M)
ans =
-1.4495e-12
Como resulta, esta matriz es realmente singular, por lo que hay una manera de escribir una fila de M como una combinación lineal de las otras filas (también es cierto para las columnas). Pero obtuvimos un valor que no era exactamente cero desde det. . ¿Es realmente cero y MATLAB acaba de confundirse? ¿Porqué es eso? El determinante simbólico es verdaderamente cero.
det(sym(M))
ans =
0
Como resultado, el cálculo del determinante es una cosa terriblemente ineficiente para matrices más grandes. Entonces, una buena alternativa es usar el producto de los elementos diagonales de una factorización matricial específica de nuestra matriz cuadrada. De hecho, esto es lo que hace MATLAB dentro de det para entradas no simbólicas.
[L,U,P] = lu(M)
L =
1 0 0 0
0.25 1 0 0
0.3125 0.76852 1 0
0.5625 0.43519 1 1
U =
16 2 3 13
0 13.5 14.25 -2.25
0 0 -1.8889 5.6667
0 0 0 3.5527e-15
P =
1 0 0 0
0 0 0 1
0 1 0 0
0 0 1 0
Observe que los elementos diagonales de L son unos, pero U tiene elementos diagonales distintos de cero. Y hay buenas propiedades sobre el determinante de un producto de matrices, así como sobre el determinante de matrices triangulares superiores o inferiores.
prod(diag(U))
ans =
-1.4495e-12
Mira que obtuvimos la misma respuesta. Dado que una factorización LU es razonablemente rápida incluso para matrices grandes, es una buena forma de calcular el determinante. El problema es que usa aritmética de coma flotante. Entonces esos elementos diagonales de U son números reales de coma flotante. Cuando tomamos el producto, obtenemos un resultado que no es exactamente cero. Ese último elemento fue ligeramente diferente de cero.
Hay otros problemas con det. Por ejemplo, sabemos que el ojo matriz (100) está extremadamente bien acondicionado. Es una matriz de identidad después de todo.
det(eye(100))
ans =
1
Ahora, si multiplicamos una matriz por una constante, esto NO cambia el estado de la matriz como uno singular. ¿Pero qué pasa con el determinante?
det(.1*eye(100))
ans =
1e-100
Entonces, ¿esta matriz es singular? Después de todo, si det (magic (4)) nos da 1e-12, ¡entonces 1e-100 debe corresponder a una matriz singular! Pero no es así Peor aún,
det(.0001*eye(100))
ans =
0
De hecho, el determinante se escala en 0.0001 ^ 100, que en matlab será 1e-400. Al menos eso sería cierto si Matlab pudiera representar un número tan pequeño usando un doble. No puede hacerlo. Ese número se desbordará. O tan fácilmente, podemos hacerlo desbordar.
det(10000*eye(100))
ans =
Inf
Claramente, todas estas matrices de identidad escaladas son igualmente no singulares, ¡pero se puede hacer para darnos la respuesta que deseamos ver! Por lo tanto, debemos concluir que calcular un determinante es algo terrible que hacer a una matriz. No me importa lo que su libro de texto le dijo hace mucho tiempo, o lo que su jefe o maestro le dijo. Si alguien te dijera que calcules el determinante para este propósito CON EL USO DE UNA COMPUTADORA, ese fue un consejo terrible. Período. Los determinantes simplemente tienen demasiados problemas.
Podemos hacer otras cosas para probar la singularidad. La mejor herramienta es usar rango. Por lo tanto, si el rango de una matriz NxM es menor que min (N, M), entonces la matriz es singular. Aquí hay un par de pruebas:
rank(M)
ans =
3
rank(.0001*eye(100))
ans =
100
Así que Rank puede decirnos que el cuadrado mágico 4x4 es singular, pero nuestra matriz de identidad escalada no es singular. (Algo bueno es que el rango puede probar la singularidad de una matriz no cuadrada).
También podemos usar cond para probar la singularidad numérica. El número de condición más pequeño posible es 1.0, que corresponde a una matriz muy bien comportada. Los números de condición grande son malos. En doble precisión, esto significa que cuando el número de condición es mayor que aproximadamente 1e15, su matriz es muy problemática.
cond(M)
ans =
8.148e+16
cond(.0001*eye(100))
ans =
1
De hecho, cond percibe que la matriz de identidad escalada está bien condicionada después de todo. Los números de condición grande son malos. Para una matriz de doble precisión, un número de condición que está cerca de 1e15 o más indica una matriz que probablemente sea numéricamente singular. Entonces vemos que M es claramente singular. Nuevamente, cond puede trabajar en matrices no cuadradas.
O bien, podríamos usar el segundo, una herramienta que estima el recíproco del número de condición. Esta es una buena herramienta para arreglos realmente grandes. Cuando el segundo da un número que está cerca de eps, ¡CUIDADO!
rcond(M)
ans =
1.3061e-17
rcond(.0001*eye(100))
ans =
1
Finalmente, para los cabezales de engranajes matemáticos (como yo), podríamos sacar svd. Después de todo, svd es la herramienta en la que se basan el cond y el rango. Cuando uno o más de los valores singulares de la matriz son pequeños en comparación con el valor singular más grande, nuevamente tenemos singularidad.
svd(M)
ans =
34
17.889
4.4721
4.1728e-16
Aquí vemos cuando un valor singular es pequeño comparado con el valor singular más grande de la matriz. Algo bueno es que svd puede decirnos qué tan cerca está la matriz de la singularidad, y si hay más de un pequeño valor singular, si nos da información sobre el rango de la matriz.
Lo bueno es que ninguna de las herramientas que he mostrado requiere que el usuario haga operaciones de fila elementales o algo sofisticado.
¡PERO NO UTILICE DET! Sí, aparece en los libros de texto. Sí, tal vez su instructor o su jefe le dijeron que lo use. Simplemente se equivocaron, porque herramientas como esta fallan cuando se aplican en una computadora, que usa aritmética de punto flotante. Y simplemente no desea calcular un determinante simbólico, que será terriblemente ineficiente.
Lo siento si esta fue una lectura larga. Saldré de mi tribuna ahora.
Yo usaría cond
. Esto le da una estimación numérica de cuán cerca de singular es una matriz (donde Inf es una matriz singular).
Por ejemplo:
m = randn(4);
cond(m) %Well conditioned, usually in the 10''s
m = diag([1e-6 1 2 1e6]);
cond(m) %Less well conditioned, 1e12
m = diag([0 1 2 3]);
cond(m) %Singular: Inf