web-dev-qa-db-fra.com

Comment savoir si une matrice est singulière?

Comment savoir qu'une matrice 4x4 est singulière ou non?

Pouvons-nous le savoir sans augmenter notre matrice donnée avec la matrice d'identité et ensuite faire les opérations de ligne?

27
Madu

Alors, comment identifier si une matrice est vraiment singulière? (Dans MATLAB, sans utiliser de papier et de crayon, ni de calculs symboliques, ni d'opérations de lignes écrites à la main?) Les manuels disent parfois aux élèves d'utiliser le déterminant, alors je vais commencer par là.

En théorie, on peut simplement tester si le déterminant de votre matrice est nul. Donc

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

En fait, cette matrice est en effet singulière, il existe donc un moyen d'écrire une ligne de M comme une combinaison linéaire des autres lignes (également vrai pour les colonnes.) Mais nous avons obtenu une valeur qui n'était pas exactement zéro de det . Est-ce vraiment nul et MATLAB vient de se confondre? Pourquoi donc? Le déterminant symbolique est vraiment nul.

det(sym(M))
ans =
0

Il s'avère que le calcul du déterminant est une chose terriblement inefficace pour les tableaux plus grands. Une alternative intéressante est donc d'utiliser le produit des éléments diagonaux d'une factorisation matricielle spécifique de notre réseau carré. En fait, c'est ce que MATLAB fait à l'intérieur de lui-même pour les entrées non symboliques.

[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

Voyez que les éléments diagonaux de L sont des uns, mais U a des éléments diagonaux non nuls. Et il y a de belles propriétés sur le déterminant d'un produit de matrices, ainsi que le déterminant des matrices triangulaires supérieures ou inférieures.

prod(diag(U))
ans =
  -1.4495e-12

Voyez que nous avons la même réponse. Étant donné qu'une factorisation LU est assez rapide même pour les grands tableaux, c'est une bonne façon de calculer le déterminant. Le problème est qu'il utilise l'arithmétique à virgule flottante. Donc, ces éléments diagonaux de U sont réels, nombres à virgule flottante. Lorsque nous prenons le produit, nous obtenons un résultat qui n'est pas exactement nul. Ce dernier élément était légèrement différent de zéro.

Il y a d'autres problèmes avec det. Par exemple, nous savons que l'œil matriciel (100) est extrêmement bien conditionné. C'est une matrice d'identité après tout.

det(eye(100))
ans =
     1

Maintenant, si nous multiplions une matrice par une constante, cela ne change PAS le statut de la matrice au singulier. Mais que se passe-t-il avec le déterminant?

det(.1*eye(100))
ans =
   1e-100

Cette matrice est-elle donc singulière? Après tout, si det (magie (4)) nous donne 1e-12, alors 1e-100 doit correspondre à une matrice singulière! Mais ce n'est pas le cas. Encore pire,

det(.0001*eye(100))
ans =
     0

En fait, le déterminant est mis à l'échelle par 0,0001 ^ 100, qui dans matlab sera 1e-400. Au moins, ce serait vrai si matlab pouvait représenter un nombre aussi petit en utilisant un double. Il ne peut pas le faire. Ce nombre va déborder. Ou tout aussi facilement, nous pouvons le faire déborder.

det(10000*eye(100))
ans =
   Inf

De toute évidence, toutes ces matrices d'identité mises à l'échelle sont également non singulières, mais det peut être fait pour nous donner la réponse que nous voulons voir! Par conséquent, nous devons conclure que le calcul d'un déterminant est une chose terrible à faire pour une matrice. Je me fiche de ce que votre manuel vous a dit il y a longtemps ou de ce que votre patron ou professeur vous a dit. Si quelqu'un vous a dit de calculer le déterminant à cette fin à l'aide d'un ordinateur, c'était un conseil terrible. Période. Les déterminants ont tout simplement trop de problèmes.

Nous pouvons faire d'autres choses pour tester la singularité. Le meilleur outil est d'utiliser le classement. Ainsi, si le rang d'une matrice NxM est inférieur à min (N, M), alors la matrice est singulière. Voici quelques tests:

rank(M)
ans =
     3

rank(.0001*eye(100))
ans =
   100

Le rang est donc en mesure de nous dire que le carré magique 4x4 est singulier, mais notre matrice d'identité à l'échelle n'est pas singulière. (Une bonne chose est que le rang peut tester la singularité d'une matrice non carrée.)

Nous pouvons également utiliser cond pour tester la singularité numérique. Le plus petit nombre possible de conditions est 1,0, ce qui correspond à une matrice très bien comportée. Les grands nombres de condition sont mauvais. En double précision, cela signifie que lorsque le nombre de conditions est supérieur à environ 1e15, votre matrice est très problématique.

cond(M)
ans =
    8.148e+16

cond(.0001*eye(100))
ans =
     1

En fait, cond perçoit que la matrice d'identité mise à l'échelle est bien conditionnée après tout. Les grands nombres de condition sont mauvais. Pour une matrice à double précision, un nombre de condition qui est n'importe où près de 1e15 ou ainsi indique une matrice qui est probablement numériquement singulière. On voit donc que M est clairement singulier. Encore une fois, cond est capable de travailler sur des matrices non carrées.

Ou, nous pourrions utiliser rcond, un outil qui estime l'inverse du nombre de conditions. Ceci est un bel outil pour les très grands tableaux. Lorsque rcond donne un nombre proche de eps, ATTENTION!

rcond(M)
ans =
   1.3061e-17

rcond(.0001*eye(100))
ans =
     1

Enfin, pour les réducteurs mathématiques (comme moi), nous pourrions retirer svd. Après tout, svd est l'outil sur lequel se basent cond et rank. Lorsqu'une ou plusieurs des valeurs singulières de la matrice sont minuscules par rapport à la plus grande valeur singulière, nous avons à nouveau la singularité.

svd(M)
ans =
           34
       17.889
       4.4721
   4.1728e-16

Nous regardons ici quand une valeur singulière est petite par rapport à la plus grande valeur singulière de la matrice. Une bonne chose est que svd peut nous dire à quel point la matrice est proche de la singularité, et s'il y a plus d'une petite valeur singulière, nous donne des informations sur le rang de la matrice.

La bonne chose est qu'aucun des outils que j'ai montrés ne demande à l'utilisateur d'effectuer des opérations de ligne élémentaires ou quoi que ce soit de fantaisiste.

MAIS S'IL VOUS PLAÎT N'UTILISEZ PAS DET! Oui, cela apparaît dans les manuels. Oui, peut-être que votre instructeur ou votre patron vous a dit de l'utiliser. Ils avaient tout simplement tort, car des outils comme celui-ci échouent lorsqu'ils sont appliqués sur un ordinateur, qui utilise l'arithmétique à virgule flottante. Et vous ne voulez tout simplement pas calculer un déterminant symbolique, qui sera terriblement inefficace.

Je suis désolé si cette lecture a été longue. Je vais sortir de ma boîte à savon maintenant.

104
user85109

Calculez le rang et comparez avec la dimension. Si le rang est inférieur à la dimension, alors la matrice est singulière.

9
mathematician1975

L'approche la plus fiable consiste à effectuer une décomposition en valeurs singulières sur la matrice. Le rapport des valeurs singulières les plus grandes aux plus petites doit se situer dans une certaine tolérance raisonnable. Ce rapport est le numéro de condition de la matrice. Avec des valeurs de double précision, les choses deviennent très difficiles avec des valeurs de double précision lorsque le nombre de conditions dépasse un million ou plus, et c'est une limite plutôt élevée. Notez qu'une fois que vous avez le SVD, il est utile pour beaucoup d'autres choses que le calcul du numéro de condition.

La décomposition en valeurs singulières est la tronçonneuse de l'armée suisse de l'analyse numérique; cela peut être un peu lourd d'outil si vous savez que la matrice n'est pas singulière/mal conditionnée. Mais si vous ne le savez pas, c'est un bon outil à savoir. Surtout avec Matlab car c'est un outil intégré.

4
David Hammen

J'utiliserais cond. Cela vous donne une estimation numérique de la proximité du singulier d'une matrice (où Inf est une matrice singulière).

Par exemple:

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
3
Pursuit