Julia: isposdef()が正しくありません

作成日 2017年01月12日  ·  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

最も参考になるコメント

コレスキー分解の計算中の丸めにより、これが発生する可能性があります。 一般に、浮動小数点行列の特異点を確実にテストすることはできません。 提供した行列は、実際には2進浮動小数点表現で特異ではありません

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

行列式は、項が非常に速く成長するため、数値計算では一般に非常に信頼性が低く、Sylversterの基準は実際には実用的ではありません。 数値計算では、コレスキーによるテストはほとんどの場合あなたが望むものであり、それはかなり安いので、私たちはそれを変更するとは思わない。 ただし、方法を説明するためにドキュメントを拡張し、制限を示すためにここの例を使用することもお勧めします。 ドキュメントラベルを問題に追加します。

全てのコメント3件

コレスキー分解の計算中の丸めにより、これが発生する可能性があります。 一般に、浮動小数点行列の特異点を確実にテストすることはできません。 提供した行列は、実際には2進浮動小数点表現で特異ではありません

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

行列式は、項が非常に速く成長するため、数値計算では一般に非常に信頼性が低く、Sylversterの基準は実際には実用的ではありません。 数値計算では、コレスキーによるテストはほとんどの場合あなたが望むものであり、それはかなり安いので、私たちはそれを変更するとは思わない。 ただし、方法を説明するためにドキュメントを拡張し、制限を示すためにここの例を使用することもお勧めします。 ドキュメントラベルを問題に追加します。

@andreasnoackこれはここでの状況の要約でしょうか。 承認後、例とともにドキュメントに追加します。
isposdef(A)→Bool
シルベスターの基準は、多数の行列式の計算の信頼性が低いために実用的ではなくなるため、コレスキー分解を使用して行列が正定値であるかどうかをテストします。 特異(非可逆)の正の半確定浮動小数点行列の場合、コレスキー分解に含まれる丸めと行列の非特異な2進浮動小数点表現のために、関数が期待どおりに機能しない可能性があります。

シルベスターの基準について言及する必要はないと思います。

このページは役に立ちましたか?
0 / 5 - 0 評価