2017-03-27 54 views
1

我想計算python中二階導數矩陣的特徵向量。根據數學,第一個向量應該等於0和pi之間的正弦函數,第二個向量等於0和2 * pi之間的正弦函數。因此,我的代碼看起來像具有適當符號的Numpy eigh-function

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()-功能將無濟於事。

回答

1

There is a gotchascipy.linalg.eigh()功能:

要非常小心使用eigh()例行程序來獲取特徵值,雖然。 有一個「陷阱」埋在裏面。

的語法是:

(eigenvalues, eigenvectors) = eigh(matrix) 

這將返回的特徵值的陣列和特徵向量 的2D陣列(每個特徵向量由許多組件)。

還有一個問題。假設您想要第個特徵值和特徵向量。我會寫:

eigenvalues[n] 
eigenvectors[n] 

而且我會是可怕的錯誤。特徵向量,特徵值做 共享一個指數,但在特徵向量的指數是第二欄:

eigenvectors[:,n] 

因此,你的代碼的最後四行必須改成:

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