2017-03-27 6 views
1

私はPythonの二次微分行列の固有ベクトルを計算したいと思います。数学によると、最初のベクトルは0とπの間のsin関数に等しく、2番目のベクトルは0と2 *πの間のsin関数に等しくなければなりません。このように私のコードは適切な記号を付けたナンシー高機能

import numpy as np 
from matplotlib import pyplot as plt 
from scipy import sparse 
import scipy.integrate as integrate 
import scipy.special as special 
import scipy 

def create_second_deriv(size, h): 
    delta_matrix_2_second_diff = (np.eye(size, dtype=np.float)*-2+np.eye(size, k=-1,dtype=np.float)*1+np.eye(size, k=1,dtype=np.float)*1) 
    delta_matrix_2_second_diff /= (h*h) 
    return -1*delta_matrix_2_second_diff 

delta_x = 0.001 
x = np.linspace(0, 1, (int)(1/delta_x)) 
delta_matrix = create_second_deriv(len(x), delta_x) 
w, v = scipy.linalg.eigh(delta_matrix) 

plt.plot(v.tolist()[0]) 
plt.show() 
plt.plot(v.tolist()[1]) 
plt.show() 

のように見える、私は出力として得るもの、 最初の固有ベクトルのためのプロットとしてenter image description here、第二固有ベクトルのためのプロットとして enter image description hereです。私はすでに異なる値の兆候が恣意的であることをすでに知っていますが、私の場合は後の処理に重要です。結果の値が期待される関数とほぼ等しくなるように符号を "反転"する方法はありますか?その場合、単にabs()関数を使用するだけでは役に立ちません。 scipy.linalg.eigh()機能付き

答えて

1

There is a gotcha

は、しかし、固有値を取得するためにeigh()ルーチンを使用して十分に注意してください。 そこに「つかまえ」が埋め込まれています。

構文は:

(eigenvalues, eigenvectors) = eigh(matrix) 

これは固有値のアレイと固有ベクトル の2次元アレイを(各固有ベクトルは、多くのコンポーネントで構成さ)を返します。

そして、そこには問題があります。 n番目の固有値と の固有ベクトルが欲しいとします。私は書くだろう:

eigenvalues[n] 
eigenvectors[n] 

私はひどく間違っています。固有ベクトルと固有値は、インデックスを共有 んが、固有ベクトルのインデックスは、SECOND列です:

plt.plot(v[:,0]) 
plt.show() 
plt.plot(v[:,1]) 
plt.show() 

eigenvectors[:,n] 

このように、あなたのコードの最後の4行に変更する必要があります

関連する問題