isposdef() утверждает, что некоторые (хотя и не все) положительно-полуопределенные матрицы являются положительно определенными, хотя это не так:
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
Я не уверен, что вызывает такое поведение - похоже, что isposdef() пытается сделать разложение Холецкого матрицы, а все положительные полуопределенные матрицы имеют разложение Холецкого (хотя у IIRC нет общего алгоритма для их нахождения) . Мне кажется, проще было бы просто реализовать критерий Сильвестра чем-то вроде
sylvestor(A) = issymmetric(A) & all([det(A[1:j, 1:j]) > 0 for j = 1:size(A)[1]])
Информация о версии:
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)
Это может быть вызвано округлением при вычислении факторизации Холецкого. Как правило, невозможно надежно проверить сингулярность матриц с плавающей запятой. Предоставленная вами матрица на самом деле не является единственной в своем двоичном представлении с плавающей запятой.
julia> det(big(A))
2.13162820728030047872728228063319445882714347172137703267935663215914838016073e-16
Детерминанты, как правило, весьма ненадежны в численных вычислениях, потому что члены растут так быстро, что критерий Сильвестра не очень практичен. В численных расчетах тест с помощью Холецкого в большинстве случаев является тем, что вам нужно, и он довольно дешев, поэтому я не думаю, что мы его изменим. Тем не менее, было бы неплохо расширить документацию для объяснения метода и, возможно, также использовать приведенный здесь пример, чтобы показать ограничения. Я добавлю метку документации к проблеме.
@andreasnoack Может ли это быть краткое изложение ситуации здесь? Я добавлю его в документы вместе с примером после утверждения.
isposdef(A) → Bool
Проверить, является ли матрица положительно определенной, используя разложение Холецкого, поскольку критерий Сильвестра становится непрактичным из-за ненадежных вычислений определителя больших чисел. В случае сингулярных (необратимых) положительно-полуопределенных матриц с плавающей запятой функция может работать не так, как хотелось бы, из-за округления, связанного с факторизацией Холецкого, и несингулярного двоичного представления матрицы с плавающей запятой.
Я не думаю, что нужно упоминать критерий Сильвестра.
Самый полезный комментарий
Это может быть вызвано округлением при вычислении факторизации Холецкого. Как правило, невозможно надежно проверить сингулярность матриц с плавающей запятой. Предоставленная вами матрица на самом деле не является единственной в своем двоичном представлении с плавающей запятой.
Детерминанты, как правило, весьма ненадежны в численных вычислениях, потому что члены растут так быстро, что критерий Сильвестра не очень практичен. В численных расчетах тест с помощью Холецкого в большинстве случаев является тем, что вам нужно, и он довольно дешев, поэтому я не думаю, что мы его изменим. Тем не менее, было бы неплохо расширить документацию для объяснения метода и, возможно, также использовать приведенный здесь пример, чтобы показать ограничения. Я добавлю метку документации к проблеме.