私はnumpyのと、単純な線形代数操作を行うことに取り組んでいます。私は彼らにシンプル固有値とベクトル私が知っている2×2行列、およびテストnumpyのを取るときすべては、今まで本当に素晴らしいとなっています。
例えば、以下の例の行列は、単一の固有値E = 1、及び単関連する固有ベクトル[-3、1]があります。
A = np.array([[-2, -9],
[ 1, 4]])
vals, vects = np.linalg.eig(A)
vals2, vects2 = np.linalg.eigh(A)
vals3 = np.linalg.eigvals(A)
print("Eigenvalues (linalg.eig): \n", vals)
print("Eigenvalues (linalg.eigvals): \n", vals3)
print("Eigenvectors: \n", vects)
以下のような結果になります。
Eigenvalues (linalg.eig):
[1.+1.89953279e-08j 1.-1.89953279e-08j]
Eigenvalues (linalg.eigvals):
[1.+1.89953279e-08j 1.-1.89953279e-08j]
Eigenvectors:
[[ 0.9486833 +0.00000000e+00j 0.9486833 -0.00000000e+00j]
[-0.31622777-2.00228337e-09j -0.31622777+2.00228337e-09j]]
私は、固有ベクトルが列形式です実現します。あなたは、小さな虚数部を無視した場合、両方のベクターは、単一の正しい固有ベクトルのほぼスカラー倍です。
私の行列は対称または共役対称ではないので、linalg.eigh
仕事ではないはずですが、私はとにかくそれを試してみました。それは私に本当の価値を提供しますが、彼らは完全に偽です。
私はまた、他の同様の質問を検索しました、そして無満たす答えを発見しました。私が来た最も近いが、その小さな虚部の固有値を除去するために関数を書くことをお勧め1つの答えです。これは動作しますが、まだ間違った固有ベクトルを残します。
何が起きてる?どのように私は単純にそれを修正することができますか?単純な計算を修正し得るようにするためには正しいようにAよく確立されたライブラリに自分自身の関数を書くために少しくらいのようです。
numpyのが戻っている正規化された各固有値のための固有ベクトルを、固有値がここに多重2を持っているとして、それは二度同じ固有ベクトルを返します。あなたは使用することができますnp.real_if_close
本物に再変換します:
In [156]: A = np.array([[-2, -9],
...: [ 1, 4]])
...:
...: w, v = np.linalg.eig(A)
...: v = np.real_if_close(v, tol=1)
...: v
Out[156]:
array([[ 0.9486833 , 0.9486833 ],
[-0.31622777, -0.31622777]])
サニティーチェック:
In [157]: v * 10**.5
Out[157]:
array([[ 3., 3.],
[-1., -1.]])
あなたが代わりにマシンエラーを起こしやすいこれらの厳密解を希望する場合は、私が提案してもよいですsympy
。
In [159]: from sympy import Matrix
...: m = Matrix(A)
...: m.eigenvects()
Out[159]:
[(1,
2,
[Matrix([
[-3],
[ 1]])])]
我々は、固有値取得する場合は1
、その多様性2
、およびそれに関連する固有ベクトルを。