由不同表示形式的相同矩阵计算的值不匹配(使用numpy.linalg.eigh)

时间:2017-05-25 12:21:55

标签: python arrays numpy matrix

请耐心等待,我知道这是一篇很长的文字,但我现在已经好几天了,似乎无法让它发挥作用,尽管我认为解决方案一定很漂亮很简单,我似乎无法找到它。

我在Python工作。我会使用更小的尺寸,但这些尺寸是我的问题出现的最低尺寸。 我的程序模拟了一个有5个位置的点阵,每个位置可以有一个零或一个。我正在研究两种情况,我将三个和两个放在我的格子上。 我有两个矩阵。第一个是将两个放在长度为5的数组上的可能性,第二个是将三个放在长度为5的数组上:

occupation_three = 
[[ 1.  1.  1.  0.  0.]
 [ 1.  1.  0.  1.  0.]
 [ 1.  1.  0.  0.  1.]
 [ 1.  0.  0.  1.  1.]
 [ 1.  0.  1.  0.  1.]
 [ 1.  0.  1.  1.  0.]
 [ 0.  0.  1.  1.  1.]
 [ 0.  1.  0.  1.  1.]
 [ 0.  1.  1.  0.  1.]
 [ 0.  1.  1.  1.  0.]]
occupation_two = 
[[ 1.  1.  0.  0.  0.]
 [ 1.  0.  1.  0.  0.]
 [ 1.  0.  0.  1.  0.]
 [ 1.  0.  0.  0.  1.]
 [ 0.  1.  1.  0.  0.]
 [ 0.  1.  0.  1.  0.]
 [ 0.  1.  0.  0.  1.]
 [ 0.  0.  0.  1.  1.]
 [ 0.  0.  1.  0.  1.]
 [ 0.  0.  1.  1.  0.]]

(我使用我为可变数量的1和数组长度编写的函数生成这些) 现在我使用这些占用矩阵作为输入形成了一个矩阵(对于那些具有一点物理知识的人,这些矩阵是汉密尔顿主义者):

hamilton_three:
[[ 0.25  1.    0.    0.    0.    0.    0.    0.    1.    0.  ]
 [ 1.   -0.75  1.    0.    0.    1.    0.    1.    0.    0.  ]
 [ 0.    1.    0.25  0.    1.    0.    0.    0.    0.    0.  ]
 [ 0.    0.    0.    0.25  1.    0.    0.    1.    0.    0.  ]
 [ 0.    0.    1.    1.   -0.75  1.    0.    0.    1.    0.  ]
 [ 0.    1.    0.    0.    1.   -0.75  1.    0.    0.    1.  ]
 [ 0.    0.    0.    0.    0.    1.    0.25  1.    0.    0.  ]
 [ 0.    1.    0.    1.    0.    0.    1.   -0.75  1.    0.  ]
 [ 1.    0.    0.    0.    1.    0.    0.    1.   -0.75  1.  ]
 [ 0.    0.    0.    0.    0.    1.    0.    0.    1.    0.25]]
hamilton_two:
[[ 0.25  1.    0.    0.    0.    0.    1.    0.    0.    0.  ]
 [ 1.   -0.75  1.    0.    1.    0.    0.    0.    1.    0.  ]
 [ 0.    1.   -0.75  1.    0.    1.    0.    1.    0.    0.  ]
 [ 0.    0.    1.    0.25  0.    0.    1.    0.    0.    0.  ]
 [ 0.    1.    0.    0.    0.25  1.    0.    0.    0.    0.  ]
 [ 0.    0.    1.    0.    1.   -0.75  1.    0.    0.    1.  ]
 [ 1.    0.    0.    1.    0.    1.   -0.75  0.    1.    0.  ]
 [ 0.    0.    1.    0.    0.    0.    0.    0.25  1.    0.  ]
 [ 0.    1.    0.    0.    0.    0.    1.    1.   -0.75  1.  ]
 [ 0.    0.    0.    0.    0.    1.    0.    0.    1.    0.25]]

到目前为止,包括哈密尔顿矩阵在内的所有内容都应该是正确的,我手动检查它是用笔和纸计算的。 如您所见,占用矩阵具有相同的行,如果您切换零和1,只是按另一个顺序。如果在输入矩阵中切换1和0,即在占用矩阵中的行(在切换时彼此相等)将生成相同的顺序,我生成哈密尔顿矩阵的过程将提供相同的矩阵。那么汉密尔顿矩阵就是一样的。 因此,两个大的哈密尔顿矩阵是相同的矩阵,只是在另一个基础上。如果我使用numpy.linalg.eigh计算它们的特征值和特征向量(因为矩阵是对称的):

eigenval_three, eigenvec_three = np.linalg.eigh(hamilton_three)
eigenval_two, eigenvec_two = np.linalg.eigh(hamilton_two) 

哈密尔顿矩阵的特征值是相同的(这证实了它们确实是相同的,只是在另一个基础上):

[-3.14025688 -3.14025688 -1.31155281 -0.58785279 -0.58785279  0.70588678
  0.70588678  1.0222229   1.0222229   2.81155281]

现在出现了问题:我想计算位于格子第三个位置的数字的期望值。我为每个特征向量做这个。我将首先用某种伪代码描述它:(请注意,特征向量的每个条目都属于具有相同索引的占用矩阵的行):

将所有值val_i与i从1到10相加。
val_i =从特征向量中获取第i行中的条目并将其自身相乘,然后将其乘以占用矩阵的第i行第3列中的值。

def expectation_value(eigenvector, occupationmatrix):
    sum = 0.0
    for i in range(len(eigenvector)):
        sum += occupationmatrix[i,2] * (abs(eigenvec[i]))** 2
    return sum

从物理/数学的角度来看,三个矩阵的期望值应该与两个矩阵的期望值相同,但由于某种原因,情况并非如此:

    expectation_val_three = np.empty(len(eigenval_three))
    for i in range(len(eigenval_three)):
        expectation_val_three[i] = expectation_value(eigenvec_three.T[i], occupation_three)

    expectation_val_two = np.empty(len(eigenval_two))
    for i in range(len(eigenval_two)):
        expectation_val_two[i] = 1 - expectation_value(eigenvec_two.T[i], occupation_two)

(我使用.T,因为特征向量是colums而不是eigh返回值的行)

这给了我:

expectation_val_three= 
[ 0.40531834  0.79468166  0.6         0.59774245  0.60225755  0.75801321
  0.44198679  0.56227678  0.63772322  0.6       ]
expectation_val_two)=
[ 0.79468166  0.40531834  0.6         0.58934802  0.61065198  0.62080767
  0.57919233  0.56725061  0.63274939  0.6       ]

有些值非常接近,但有些值是。感谢所有读过这篇文章的人,也许你有一些想法,为什么期望值不匹配,我将非常感激。提前致谢! (也许它与某些数字错误或类似错误有关)

0 个答案:

没有答案