【问题标题】:Numpy eigh-function with proper signs具有正确符号的 Numpy 八函数
【发布时间】:2017-03-27 18:18:19
【问题描述】:

我想在 python 中计算二阶导数矩阵的特征向量。根据数学,第一个向量应该等于 0 到 pi 之间的正弦函数,第二个向量应该等于 0 到 2*pi 之间的正弦函数。因此我的代码看起来像

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()

现在,我得到的输出是 作为第一个特征向量的图,以及 作为第二个特征向量的图。我已经知道不同值的符号是任意的,但就我而言,它们对于以后的处理很重要。有没有办法“翻转”符号,使结果值大约等于预期的函数?在这种情况下,简单地使用abs()-function 将无济于事。

【问题讨论】:

    标签: python numpy eigenvector


    【解决方案1】:

    There is a gotchascipy.linalg.eigh() 函数:

    不过,使用eigh() 例程获取特征值时要非常小心。 里面隐藏着一个“陷阱”。

    语法是:

    (eigenvalues, eigenvectors) = eigh(matrix)
    

    这将返回一个特征值数组和一个二维特征向量数组 (每个特征向量由许多分量组成)。

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

    eigenvalues[n]
    eigenvectors[n]
    

    我会大错特错。特征向量和特征值 共享一个索引,但特征向量上的索引是 SECOND 列:

    eigenvectors[:,n]
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      相关资源
      最近更新 更多