不同特征求解器的基态特征向量不同(元素中的负号不同)。有关系吗?

计算科学 线性代数 本征系统
2021-11-29 18:51:37

这是一些希望清楚地说明我在做什么的代码:

>>> sp.linalg.eig(d)[0].real; sp.linalg.eigh(d)[0]; d; sp.linalg.eig(d)[1]; sp.linalg.eigh(d)[1]
array([ 1., -1.])
array([-1.,  1.])
matrix([[ 0, -1],
        [-1,  0]])
array([[ 0.70710678,  0.70710678],
       [-0.70710678,  0.70710678]])
array([[-0.70710678, -0.70710678],
       [-0.70710678,  0.70710678]])

为了稍微解释一下代码,前两个分别是array()的特征值,后者仅适用于 Hermitian 矩阵。然后我显示矩阵,然后特征向量显示为以下两个矩阵的列,与特征值的顺序相同。eig()eigh()d

在这里,我正在做的是采用一个矩阵d,在这种情况下很简单σx,泡利 x-spin 矩阵。我正在做绝热量子模拟,所以我在这里得到了一个 1 量子位案例的横向磁场的基态。更高的量子比特情况具有对应于最低能量的初始状态向量:

D=iNII... σxi... I

所以我现在正在做的是使用通用 LAPACK eigensolver zgeev 和eig()调用 zheevd eigh(),分别是通用和 Hermitian 求解器。

为什么我从 得到基态特征向量作为一件事eig(),但eigh()我得到同样的事情但总体为负?这有关系吗?

值得注意的是,如果我说这个问题不会出现D具有正值而不是负值。这一点真的让我很困惑。

4个回答

标准特征值问题公式的特征向量解 (Av=λv) 是唯一的,直到一个常数乘数。很明显,如果存在特征向量解va满足Ava=λva, 然后对于任何实\复标量k,vb=kva也是有效的,因为Avb=kAva=kλva=λvb.

因此,两个不同的特征解算器返回相同的特征向量并以不同的方式缩放也就不足为奇了。如果您希望完全唯一地定义特征向量,则必须定义自己的重整化过程(例如:始终通过将结果特征向量除以该分量的值来强制特征向量的一个分量为 1。)

其他答案建议对特征向量进行归一化,使其第一个分量为正,但这对我来说似乎是个坏建议:如果计算出的特征向量是v = (1e-17, 1)and w =(-1e-17, 1),则将它们归一化为v_n = (1e-17, 1)andw_n =(1e-17, -1)并检查它们的距离,norm(v_n, w_n)当它们实际上非常相距彼此靠近。

我的建议是你在错误的层面上看待问题:你不需要标准化你的输出,你需要改变你在向量之间进行比较的方式。比较两个向量a,b通过计算它们的角度或相关性:|aTb|ab. 如果该数量接近 1,则两个向量仅相差一个相位。

您可以像这样在 Python 中修复特征向量以具有相同的符号: eigvects = np.sign(eigvects[0,:]).transpose()*eigvects

这会将所有特征向量的第一个特征向量分量固定为正。

我也无法弄清楚 LAPACK 签名例程与 ARPACK 的区别,这很高兴知道这样可以复制八个符号,从而使您的模拟保持可预测性。

上述关于将正或负 1e-17 作为第一个特征向量值的结果(这表明基本上为 0 值的舍入误差可能会使您的缩放特征向量无效)不受 ARPACK eigsh 例程(Python 或 eigs in MATLAB) - 它始终如一地再现相同的特征向量,仅相差 +/-1 标​​量。如果您使用另一种可能会引入舍入误差的方法,我建议您提高精度以避免出现该问题。