Julia: isposdef() est incorrect

Créé le 12 janv. 2017  ·  3Commentaires  ·  Source: JuliaLang/julia

isposdef() affirme que certaines matrices semi-définies positives (mais pas toutes) sont définies positives alors qu'elles ne le sont pas :

julia> A = [1.69  2.21; 2.21  2.89]
2×2 Array{Float64,2}:
 1.69  2.21
 2.21  2.89
julia> det(A)
0.0
julia> isposdef(A)
true
julia> isposdef(ones(2,2))
false

Je ne sais pas ce qui cause ce comportement - il semble que isposdef() tente de faire une décomposition Cholesky de la matrice, et toutes les matrices semi-définies positives ont une décomposition Cholesky (bien qu'IIRC il n'y ait pas d'algorithme général pour les trouver) . Il me semble qu'il serait plus simple de simplement implémenter le critère de Sylvestor avec quelque chose comme

sylvestor(A) = issymmetric(A) & all([det(A[1:j, 1:j]) > 0 for j = 1:size(A)[1]])

Informations sur la version :

julia> versioninfo()
Julia Version 0.5.0
Commit 3c9d753 (2016-09-19 18:14 UTC)
Platform Info:
  System: NT (x86_64-w64-mingw32)
  CPU: Intel(R) Xeon(R) CPU E3-1240 v3 @ 3.40GHz
  WORD_SIZE: 64
  BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Haswell)
  LAPACK: libopenblas64_
  LIBM: libopenlibm
  LLVM: libLLVM-3.7.1 (ORCJIT, haswell)
doc linear algebra

Commentaire le plus utile

L'arrondi lors du calcul de la factorisation de Cholesky peut en être la cause. Généralement, il n'est pas possible de tester de manière fiable la singularité des matrices à virgule flottante. La matrice que vous avez fournie n'est en fait pas singulière dans sa représentation binaire en virgule flottante

julia> det(big(A))
2.13162820728030047872728228063319445882714347172137703267935663215914838016073e-16

Les déterminants sont généralement assez peu fiables dans les calculs numériques car les termes croissent si vite que le critère de Sylverster n'est pas vraiment pratique. Dans les calculs numériques, le test via Cholesky est dans la plupart des cas ce que vous voulez et il est assez bon marché donc je ne pense pas que nous le changerons. Cependant, il peut être judicieux d'étendre la documentation pour expliquer la méthode et peut-être également d'utiliser l'exemple ici pour montrer les limites. J'ajouterai l'étiquette de documentation au problème.

Tous les 3 commentaires

L'arrondi lors du calcul de la factorisation de Cholesky peut en être la cause. Généralement, il n'est pas possible de tester de manière fiable la singularité des matrices à virgule flottante. La matrice que vous avez fournie n'est en fait pas singulière dans sa représentation binaire en virgule flottante

julia> det(big(A))
2.13162820728030047872728228063319445882714347172137703267935663215914838016073e-16

Les déterminants sont généralement assez peu fiables dans les calculs numériques car les termes croissent si vite que le critère de Sylverster n'est pas vraiment pratique. Dans les calculs numériques, le test via Cholesky est dans la plupart des cas ce que vous voulez et il est assez bon marché donc je ne pense pas que nous le changerons. Cependant, il peut être judicieux d'étendre la documentation pour expliquer la méthode et peut-être également d'utiliser l'exemple ici pour montrer les limites. J'ajouterai l'étiquette de documentation au problème.

@andreasnoack Cela peut-il être le résumé de la situation ici. Je vais l'ajouter à la documentation avec l'exemple après approbation.
isposdef(A) → Bool
Tester si une matrice est définie positive en utilisant la décomposition de Cholesky car le critère de Sylvester devient impraticable en raison de calculs déterminants peu fiables de grands nombres. Dans le cas de matrices à virgule flottante semi-définies positives singulières (non inversibles), la fonction peut ne pas fonctionner comme souhaité en raison de l'arrondi impliqué dans la factorisation de Cholesky et de la représentation en virgule flottante binaire non singulière de la matrice.

Je ne pense pas qu'il soit nécessaire de mentionner le critère de Sylvester.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

TotalVerb picture TotalVerb  ·  3Commentaires

manor picture manor  ·  3Commentaires

sbromberger picture sbromberger  ·  3Commentaires

musm picture musm  ·  3Commentaires

StefanKarpinski picture StefanKarpinski  ·  3Commentaires