3

まず、 を使用して (4000x4000) 行列の固有値を見つけますnumpy.linalg.eigvalsh。次に、固有値のわずかな変化のみを期待して、境界条件を変更します。

固有値を減算すると、浮動小数点エラーが発生しやすくなるため、相対許容誤差を使用しました。

ここで、固有値A = 1.0001e-10と別のがあるとしB = 1.0050e-10ます。浮動小数点演算に関する私のささやかな知識によると、A - B != 0. 問題は、これらの数値が何桁もの線形代数計算に由来することです。他の固有値は、たとえば次数である可能性があります1

問題は、 を使用して計算された固有値の精度はどのくらいかということnumpy.linalg.eigvalshです。この精度は値 ( A * eps) に対して相対的ですか、それとも最大の固有値に対して相対的ですか? それとも元のマトリックスの要素に相対的ですか?

たとえば、次のマトリックス:

1      1e-20
1e-20  3

これと同じ固有値を与える:

1     1e-5
1e-5  3
4

2 に答える 2

3

Lapack が eigvalsh の下で使用されているかどうかはわかりませんが、これは興味深いかもしれません:

対称/非対称固有値問題の Lapack エラー境界:

http://www.netlib.org/lapack/lug/node89.html

http://www.netlib.org/lapack/lug/node91.html

于 2012-12-15T10:37:46.693 に答える
0

まず、ソルバーは正確ではありません。次に、例の行列の条件が不十分です。対角要素は、非対角要素よりも桁違いに大きくなっています。これは常に数値の問題を引き起こします。

単純な代数から、2 番目の行列の行列式は(1 * 3) - (1e5 * 1e5) = 3 - 1e-10です。精度の問題は、実際には最小要素の精度の 2 倍であることが既にわかります。(固有値にも同じことが当てはまります。) linalg は倍精度を使用していますが、ソルバーは近似であるため、同じ答えが得られます。小さな値を に変更する1e-3と、違いが見え始めます。これは、精度が数値近似のオーダーになっているためです。

この特定の問題は以前に尋ねられました。この回答では、sympy を使用して固有値を任意の精度で解く方法を確認できます。

于 2012-12-15T13:28:29.797 に答える