Julia: isposdef() неверен

Созданный на 12 янв. 2017  ·  3Комментарии  ·  Источник: JuliaLang/julia

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)
doc linear algebra

Самый полезный комментарий

Это может быть вызвано округлением при вычислении факторизации Холецкого. Как правило, невозможно надежно проверить сингулярность матриц с плавающей запятой. Предоставленная вами матрица на самом деле не является единственной в своем двоичном представлении с плавающей запятой.

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

Детерминанты, как правило, весьма ненадежны в численных вычислениях, потому что члены растут так быстро, что критерий Сильвестра не очень практичен. В численных расчетах тест с помощью Холецкого в большинстве случаев является тем, что вам нужно, и он довольно дешев, поэтому я не думаю, что мы его изменим. Тем не менее, было бы неплохо расширить документацию для объяснения метода и, возможно, также использовать приведенный здесь пример, чтобы показать ограничения. Я добавлю метку документации к проблеме.

Все 3 Комментарий

Это может быть вызвано округлением при вычислении факторизации Холецкого. Как правило, невозможно надежно проверить сингулярность матриц с плавающей запятой. Предоставленная вами матрица на самом деле не является единственной в своем двоичном представлении с плавающей запятой.

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

Детерминанты, как правило, весьма ненадежны в численных вычислениях, потому что члены растут так быстро, что критерий Сильвестра не очень практичен. В численных расчетах тест с помощью Холецкого в большинстве случаев является тем, что вам нужно, и он довольно дешев, поэтому я не думаю, что мы его изменим. Тем не менее, было бы неплохо расширить документацию для объяснения метода и, возможно, также использовать приведенный здесь пример, чтобы показать ограничения. Я добавлю метку документации к проблеме.

@andreasnoack Может ли это быть краткое изложение ситуации здесь? Я добавлю его в документы вместе с примером после утверждения.
isposdef(A) → Bool
Проверить, является ли матрица положительно определенной, используя разложение Холецкого, поскольку критерий Сильвестра становится непрактичным из-за ненадежных вычислений определителя больших чисел. В случае сингулярных (необратимых) положительно-полуопределенных матриц с плавающей запятой функция может работать не так, как хотелось бы, из-за округления, связанного с факторизацией Холецкого, и несингулярного двоичного представления матрицы с плавающей запятой.

Я не думаю, что нужно упоминать критерий Сильвестра.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги