Julia: isposdef() ist falsch

Erstellt am 12. Jan. 2017  Â·  3Kommentare  Â·  Quelle: JuliaLang/julia

isposdef() behauptet, dass einige (wenn auch nicht alle) positiv-semi-definiten Matrizen positiv definit sind, wenn sie es nicht sind:

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

Ich bin mir nicht sicher, was dieses Verhalten verursacht - es sieht so aus, als ob isposdef() versucht, eine Cholesky-Zerlegung der Matrix vorzunehmen, und alle positiven semidefiniten Matrizen haben eine Cholesky-Zerlegung (obwohl IIRC keinen allgemeinen Algorithmus gibt, um sie zu finden) . Es scheint mir, dass es einfacher wÀre, Sylvestors Kriterium einfach mit etwas wie zu implementieren

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

Versions Information:

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

Hilfreichster Kommentar

Die Rundung bei der Berechnung der Cholesky-Faktorisierung kann dies verursachen. Im Allgemeinen ist es nicht möglich, die SingularitÀt von Gleitkommamatrizen zuverlÀssig zu testen. Die von Ihnen bereitgestellte Matrix ist in ihrer binÀren Gleitkommadarstellung eigentlich nicht singulÀr

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

Determinanten sind bei numerischen Berechnungen im Allgemeinen ziemlich unzuverlĂ€ssig, da die Terme so schnell wachsen, dass Sylversters Kriterium nicht wirklich praktikabel ist. Bei numerischen Berechnungen ist der Test ĂŒber Cholesky in den meisten FĂ€llen das, was Sie wollen, und er ist ziemlich billig, also denke ich nicht, dass wir ihn Ă€ndern werden. Es könnte jedoch eine gute Idee sein, die Dokumentation zu erweitern, um die Methode zu erklĂ€ren, und vielleicht auch das Beispiel hier zu verwenden, um die EinschrĂ€nkungen aufzuzeigen. Ich fĂŒge dem Problem das Dokumentationsetikett hinzu.

Alle 3 Kommentare

Die Rundung bei der Berechnung der Cholesky-Faktorisierung kann dies verursachen. Im Allgemeinen ist es nicht möglich, die SingularitÀt von Gleitkommamatrizen zuverlÀssig zu testen. Die von Ihnen bereitgestellte Matrix ist in ihrer binÀren Gleitkommadarstellung eigentlich nicht singulÀr

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

Determinanten sind bei numerischen Berechnungen im Allgemeinen ziemlich unzuverlĂ€ssig, da die Terme so schnell wachsen, dass Sylversters Kriterium nicht wirklich praktikabel ist. Bei numerischen Berechnungen ist der Test ĂŒber Cholesky in den meisten FĂ€llen das, was Sie wollen, und er ist ziemlich billig, also denke ich nicht, dass wir ihn Ă€ndern werden. Es könnte jedoch eine gute Idee sein, die Dokumentation zu erweitern, um die Methode zu erklĂ€ren, und vielleicht auch das Beispiel hier zu verwenden, um die EinschrĂ€nkungen aufzuzeigen. Ich fĂŒge dem Problem das Dokumentationsetikett hinzu.

@andreasnoack Kann das die Zusammenfassung der Situation hier sein. Ich werde es nach der Genehmigung zusammen mit dem Beispiel zu den Dokumenten hinzufĂŒgen.
isposdef(A) → Bool
Testen Sie, ob eine Matrix positiv definit ist, indem Sie die Cholesky-Zerlegung verwenden, da das Sylvester-Kriterium aufgrund unzuverlĂ€ssiger Determinantenberechnungen großer Zahlen unpraktisch wird. Im Fall singulĂ€rer (nicht invertierbarer) positiver semidefiniter Gleitkommamatrizen funktioniert die Funktion möglicherweise nicht wie gewĂŒnscht, da bei der Cholesky-Faktorisierung und der nicht singulĂ€ren binĂ€ren Gleitkommadarstellung der Matrix Rundungen auftreten.

Ich denke nicht, dass es notwendig ist, Sylvesters Kriterium zu erwÀhnen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen