Soupir. Calcul du déterminant pour déterminer la singularité est une chose ridicule à faire, tout à fait ainsi. Surtout pour une grande matrice. Désolé, mais c'est le cas. Pourquoi? Oui, certains livres vous disent de le faire. Peut-être même votre instructeur.
La singularité analytique est une chose. Mais qu'en est-il de la détermination numérique de la singularité? À moins que vous n'utilisiez un outil symbolique, MATLAB utilise l'arithmétique à virgule flottante. Cela signifie qu'il stocke des nombres en tant que valeurs à virgule flottante et à double précision. Ces chiffres ne peuvent pas être plus petite amplitude que
>> realmin
ans =
2.2251e-308
(En fait, Matlab va un peu inférieur à celui, en termes de nombre dénormalisées, qui peuvent aller jusqu'à environ 1E-323.) Voir que lorsque je tente de stocker un nombre plus petit que cela, MATLAB pense que c'est zéro. Que se passe-t-il avec une grande matrice?
>> A = 1e-323
A =
9.8813e-324
>> A = 1e-324
A =
0
Par exemple, cette matrice est-elle singulière:
M = eye(1000);
Puisque M est une matrice d'identité, elle est assez clairement non singulière. En fait, det suggère qu'il est non-singulier.
>> det(M)
ans =
1
Mais, multipliez-le par une constante. Est-ce que cela le rend non-singulier? NON!!!!!!!!!!!!!!!!!!!!!!!! Bien sûr que non. Mais essayez quand même.
>> det(M*0.1)
ans =
0
Hmm. C'est étrange. MATLAB me dit que le déterminant est zéro. Mais nous savons que le déterminant est 1e-1000. Oh oui. Gosh, 1e-1000 est plus petit, d'une quantité considérable que le plus petit nombre que je viens de vous montrer que MATLAB peut stocker comme un double. Donc le déterminant déborde, même s'il est évidemment non nul. La matrice est-elle singulière? Bien sûr que non. Mais l'utilisation de det échoue-t-elle ici?Bien sûr que ce sera le cas, et c'est complètement prévu.
Utilisez plutôt un bon outil pour la détermination de la singularité. Utilisez un outil comme cond, ou rank. Par exemple, pouvons-nous tromper le rang?
>> rank(M)
ans =
1000
>> rank(M*.1)
ans =
1000
Voir ce rang sait qu'il s'agit d'une matrice de rang complet, que nous l'ayons mise à l'échelle ou non. La même chose est vraie de cond, en calculant le numéro de condition de M.
>> cond(M)
ans =
1
>> cond(M*.1)
ans =
1
Bienvenue dans le monde de l'arithmétique à virgule flottante. Et oh, au fait, oubliez det comme un outil pour presque n'importe quel calcul en utilisant l'arithmétique en virgule flottante. C'est un mauvais choix presque toujours.
il y a la fonction PINV pour pseudoinverse – Amro