2017-08-23 25 views
1

行列が負の半限定であるかどうかを調べようとしています。このため、すべての固有値がゼロより小さいか等しいかどうかをチェックします。一例行列である:STATAによって算出行列計算の精度R対Stata

   [,1]   [,2]   [,3]   [,4] 
[1,] -1.181830e-05 0.0001576663 -2.602332e-07 1.472770e-05 
[2,] 1.576663e-04 -0.0116220027 3.249607e-04 -2.348050e-04 
[3,] -2.602332e-07 0.0003249607 -2.616447e-05 3.492998e-05 
[4,] 1.472770e-05 -0.0002348050 3.492998e-05 -9.103073e-05 

固有値が1.045e-12、-0.00001559、-0.00009737、-0.01163805あります。しかしながら、Rによって計算される固有値は、-1.207746e-20、-1.558760e-05、-9.737074e-05、-1.163806e-02である。したがって、最後の3つの固有値は非常に似ていますが、ゼロに非常に近い最初の固有値はありません。 stataで得られた固有値では、行列は半定理ではないが、Rで得られた固有値は半定理である。どの計算がより正確であるかを知る方法はありますか?または、無限に小さい固有値を避けるために、行列を再スケーリングすることも可能でしょうか?

は事前にありがとうございました。すべてのヒントは高く評価されます。

+1

(0.000000000003696385 )。 Rは有限精度演算を使用しているため、小数点以下15桁または16桁を超える回答は正確ではありません。 – user108363

+0

私はRで別の結果を得ています。行列に 'dput'の結果を与えて、あなたが使っているRのバージョンと固有値を計算する関数を教えてください。 – James

+0

お二人のおかげで!ジェームス、dputは '構造(C(-1.18182990902922e-05、0.000157666259977248、-2.60233161187324e-07、 1.47276984589202e-05、0.000157666259977248、-0.0116220026732496、 0.000324960673501042、-0.000234805002079655、-2.60233161187324e-07、 0.000324960673501042、あります-2.61644706608917e-05、3.49299778208411e-05、 1.47276984589202e-05、-0.000234805002079655、3.49299778208411e-05、 -9.10307332256831e-05)、.Dim = C(4L、4L)) ' IはRStudioを使用していバージョン1.0.44であり、固有値を計算する関数はeigen()です。 – SWimmer8

答えて

3

倍精度浮動小数点数を使用する数値アルゴリズムでは、それほど高い精度は期待できません。

小数点以下17桁までを想定できます。ゼロ周辺の相対精度の低下は珍しくありません。これは、両方のインスタンスの場合は0

からほとんど見分けがつかない数値誤差、1E-12と-1e-20与えられた、ある、(あなたがあなたのコメントに与える係数を使用して)最小の固有値のために、私が取得:

  • R 3.4.1:5.929231e-21、
  • MATLAB R2017a:3.412972022812169e-19
  • のStata 15:MKLと3.2998e-20(matrix eigenvalues)又は4.464e-19(matrix symeigen
  • インテルFortran (DSYEV関数):2.2608e-19

最大固有値との比が1e-10未満の場合、固有値をゼロに強制することができます。

とにかく、1e-12は少し大きく見えます。 StataとRの間でデータを転送するときに、ある精度が失われている可能性があります。行列の相対誤差が小さいと、固有値の誤差が大きくなる可能性があります。 Stataとあなたの質問(コメントにはない)のデータを使って、私は最小固有値の例3.696e-12を得ます。テキスト

  • アルゴリズムとしてあなたの番号を入力すると、

    • パーサ:

      しかし、同じ行列で、まだ原因の変化に、(上記の、ある)差異があるかもしれません固有値計算のために同じアルゴリズム(浮動小数点演算子は、例えば、連想されない)

    • 演算ルーチンをコンパイルするために使用されるコンパイラ、またはコンパイラオプション
    • 実装の詳細を使用
    • 浮動小数点ハードウェア

    伝統が質問のこの種のための読書提案:私は(= 999 scipen)オプションを使用し、最初の固有値ごとに異なる結果を得た

    What Every Computer Scientist Should Know About Floating-Point Arithmetic

  • +0

    python( 'np.linalg.eigvals')は私に' 5.96768236e-20'を与えて、例の数を増やします – jeremycg

    関連する問題