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)
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.
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
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.