Julia: isposdef() está incorreto

Criado em 12 jan. 2017  ·  3Comentários  ·  Fonte: JuliaLang/julia

isposdef() está afirmando que algumas (embora não todas) matrizes semidefinidas positivas são definidas positivas quando não são:

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

Não tenho certeza do que está causando esse comportamento - parece que isposdef() tenta fazer uma decomposição de Cholesky da matriz e todas as matrizes semidefinidas positivas têm uma decomposição de Cholesky (embora o IIRC não exista um algoritmo geral para encontrá-las) . Parece-me que seria mais simples apenas implementar o critério de Sylvestor com algo como

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

Informação da versão:

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

Comentários muito úteis

O arredondamento durante o cálculo da fatoração de Cholesky pode causar isso. Geralmente, não é possível testar de forma confiável a singularidade de matrizes de ponto flutuante. A matriz que você forneceu na verdade não é singular em sua representação de ponto flutuante binário

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

Determinantes geralmente não são confiáveis ​​em cálculos numéricos porque os termos crescem tão rápido que o critério de Sylverster não é realmente prático. Em cálculos numéricos, o teste via Cholesky é, na maioria dos casos, o que você deseja e é bastante barato, então não acho que vamos alterá-lo. No entanto, pode ser uma boa ideia estender a documentação para explicar o método e talvez também usar o exemplo aqui para mostrar as limitações. Vou adicionar o rótulo de documentação ao problema.

Todos 3 comentários

O arredondamento durante o cálculo da fatoração de Cholesky pode causar isso. Geralmente, não é possível testar de forma confiável a singularidade de matrizes de ponto flutuante. A matriz que você forneceu na verdade não é singular em sua representação de ponto flutuante binário

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

Determinantes geralmente não são confiáveis ​​em cálculos numéricos porque os termos crescem tão rápido que o critério de Sylverster não é realmente prático. Em cálculos numéricos, o teste via Cholesky é, na maioria dos casos, o que você deseja e é bastante barato, então não acho que vamos alterá-lo. No entanto, pode ser uma boa ideia estender a documentação para explicar o método e talvez também usar o exemplo aqui para mostrar as limitações. Vou adicionar o rótulo de documentação ao problema.

@andreasnoack Este pode ser o resumo da situação aqui. Vou adicioná-lo aos documentos junto com o exemplo após a aprovação.
isposdef(A) → Bool
Testar se uma matriz é definida positiva usando a decomposição de Cholesky como critério de Sylvester torna-se impraticável por causa de cálculos determinantes não confiáveis ​​de grandes números. No caso de matrizes de ponto flutuante semidefinidas positivas singulares (não inversíveis), a função pode não funcionar como desejado devido ao arredondamento envolvido na fatoração de Cholesky e à representação de ponto flutuante binário não singular da matriz.

Não acho necessário mencionar o critério de Sylvester.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

helgee picture helgee  ·  3Comentários

StefanKarpinski picture StefanKarpinski  ·  3Comentários

thofma picture thofma  ·  3Comentários

TotalVerb picture TotalVerb  ·  3Comentários

musm picture musm  ·  3Comentários