Numpy eigh-function具有适当的标志

时间:2017-03-27 09:55:22

标签: python numpy eigenvector

我想计算python中二阶导数矩阵的特征向量。根据数学计算,第一个矢量应该等于0和pi之间的sin函数,第二个矢量等于0和2 * pi之间的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() - 函数将无济于事。

1 个答案:

答案 0 :(得分:1)

带有scipy.linalg.eigh()功能的

There is a gotcha

  

尽管使用eigh()例程来获取特征值,但要非常小心。   其中埋藏着“陷阱”。

     

语法为:

(eigenvalues, eigenvectors) = eigh(matrix)
     

返回特征值数组和特征向量的2D数组   (每个特征向量由许多组件组成)。

     

而且还有问题。假设您想要n特征值和。{   特征向量。我会写:

eigenvalues[n]
eigenvectors[n]
     

我会非常错误。特征向量和特征值   共享索引,但特征向量上的索引是SECOND列:

eigenvectors[:,n]

因此,您的代码的最后四行必须更改为:

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