python中的特征向量给出看似随机的元素符号

python中的特征向量给出看似随机的元素符号,python,numpy,linear-algebra,eigenvector,Python,Numpy,Linear Algebra,Eigenvector,我正在运行以下代码: import numpy as np import matplotlib matplotlib.use("TkAgg") import matplotlib.pyplot as plt N = 100 t = 1 a1 = np.full((N-1,), -t) a2 = np.full((N,), 2*t) Hamiltonian = np.diag(a1, -1) + np.diag(a2) + np.diag(a1, 1) eval, evec = np.li

我正在运行以下代码:

import numpy as np
import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt

N = 100
t = 1

a1 = np.full((N-1,), -t)
a2 = np.full((N,), 2*t)
Hamiltonian = np.diag(a1, -1) +  np.diag(a2) + np.diag(a1, 1)

eval, evec = np.linalg.eig(Hamiltonian)
idx = eval.argsort()[::-1]
eval, evec = eval[idx], evec[:,idx]

wave2 = evec[2] / np.sum(abs(evec[2]))
prob2 = evec[2]**2 / np.sum(evec[2]**2)

_ = plt.plot(wave2)
_ = plt.plot(prob2)
plt.show()
接下来的情节是这样的:

但我希望蓝线也是一个sinoid。这让我感到困惑,我找不到是什么导致了信号的突然变化。绘制函数绝对表明与每个x相关的值是正确的,但符号是错误的


关于什么原因或者如何解决这个问题有什么想法吗?

我可能错了,但它们不是都是有效的特征向量/值吗?符号不重要,因为特征向量的定义是:

仅仅因为标度为负并不意味着它无效

解决这个问题的一种方法是简单地选择一个符号作为开始,然后将所有不符合该符号的东西乘以-1(或者取每个元素的
abs
,然后乘以期望的符号)。对于您的结果,这应该是有效的(没有任何内容超过0)


matlab和numpy都不关心您试图解决的问题,它的简单数学表明两个带符号的特征向量/值组合都是有效的,您的值是正弦的,只是存在两组有效的特征向量/值(负和正)

这是脚本的一个修改版本,它实现了您的期望。这些变化是:

  • 修正了特征向量的索引;它们是
    evec
    的列
  • 使用
    np.linalg.eig
    代替
    np.linalg.eig
    。这并不是绝对必要的,但您也可以使用更高效的代码
  • 不要颠倒已排序特征值的顺序。我保持特征值从最低到最高排序。因为
    eigh
    以升序返回特征值,所以我刚刚注释掉了对特征值进行排序的代码
(只有第一次更改是必需的更正。)


情节:


你能告诉我为什么第三个特征向量的所有坐标都是正的吗?这应该是薛定谔方程的解。它们不应该都是正的,但应该用一个好的正弦函数(即求解薛定谔方程的波函数)来描述。本征向量不是唯一的,没有“不应该都是正的”,因为这些都是有效的本征向量/值。使用
evec[2]
,但本征向量在列中,所以它应该是
evec[:,2]
。还要注意,您将特征值从最高到最低排序。因此,振动的最低频率将是evec中的最后一列。它们不是,因为它们是scrodinger方程的解,该方程要求特征向量遵循函数exp(ikx)。所以特征值必须是一个sinoid(至少是实部)。@MitchellFaas和特征值/向量解算器不关心薛定谔方程的存在,你的特征值是正弦的,这只是因为在特征向量的定义中,这个函数
A·v=λ·v
如果你的符号被翻转,它也会给出另一个有效的特征向量。如果你取
k=-2
,对应于排序被反转的情况,你会再次得到振荡行为。因此,虽然从计算的角度来看,这一切都是正确的,提问者的问题在于理解物理,接受这样一个事实,即只有一个可观察的量应该有期望的波形,而不是v本身。是的,更高的模式有更高的频率。这里的编程问题只是
evec
的索引不正确。
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

N = 100
t = 1

a1 = np.full((N-1,), -t)
a2 = np.full((N,), 2*t)
Hamiltonian = np.diag(a1, -1) +  np.diag(a2) + np.diag(a1, 1)

eval, evec = np.linalg.eigh(Hamiltonian)
#idx = eval.argsort()[::-1]
#eval, evec = eval[idx], evec[:,idx]

k = 2
wave2 = evec[:, k] / np.sum(abs(evec[:, k]))
prob2 = evec[:, k]**2 / np.sum(evec[:, k]**2)

_ = plt.plot(wave2)
_ = plt.plot(prob2)
plt.show()