suspiro. El cálculo del determinante para determinar la singularidad es algo ridículo, absolutamente. Especialmente para una gran matriz. Lo siento, pero lo es. ¿Por qué? Sí, algunos libros te dicen que lo hagas. Tal vez incluso tu instructor.
La singularidad analítica es una cosa. Pero, ¿qué hay de la determinación numérica de la singularidad? A menos que esté usando una herramienta simbólica, MATLAB usa la aritmética de punto flotante. Esto significa que almacena números como valores de coma flotante y precisión doble. Esos números no pueden ser más pequeño en magnitud que
>> realmin
ans =
2.2251e-308
(En realidad, MATLAB va un poco más bajo que, en términos de números no normalizados, que pueden ir hasta aproximadamente 1E-323.) Ver que cuando trato de guardar un número más pequeño que eso, MATLAB piensa que es cero.
>> A = 1e-323
A =
9.8813e-324
>> A = 1e-324
A =
0
¿Qué ocurre con una matriz grande? Por ejemplo, esta matriz es singular:
M = eye(1000);
Dado que M es una matriz de identidad, es bastante claro que no es singular. De hecho, det sugiere que no es singular.
>> det(M)
ans =
1
Pero, multiplíquelo por una constante. ¿Eso lo hace no singular? ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡NO!!!!!!!!!!!!!!!!!!!!!!!! Por supuesto no. Pero inténtalo de todos modos.
>> det(M*0.1)
ans =
0
Hmm. Eso es extraño. MATLAB me dice que el determinante es cero. Pero sabemos que el determinante es 1e-1000. Oh si. Gosh, 1e-1000 es más pequeño, en una cantidad considerable que el número más pequeño que acabo de mostrarle que MATLAB puede almacenar como un doble. Entonces el determinante se desborda, aunque obviamente no es cero. ¿Es la matriz singular? Por supuesto no. Pero, ¿el uso de det falla aquí?Por supuesto que lo hará, y esto es completamente esperado.
En su lugar, utilice una buena herramienta para la determinación de la singularidad. Use una herramienta como cond o rank. Por ejemplo, ¿podemos engañar al rango?
>> rank(M)
ans =
1000
>> rank(M*.1)
ans =
1000
Ver ese rango sabe que esta es una matriz de rango completo, independientemente de si se escala o no. Lo mismo puede decirse de cond, calculando el número de condición de M.
>> cond(M)
ans =
1
>> cond(M*.1)
ans =
1
Bienvenido al mundo de la aritmética de punto flotante. Y, por cierto, olvídate de det como una herramienta para casi cualquier cálculo que use aritmética de coma flotante. Es una mala elección casi siempre.
existe la función de PINV pseudoinverse – Amro