请耐心等待,我知道这是一篇很长的文字,但我现在已经好几天了,似乎无法让它发挥作用,尽管我认为解决方案一定很漂亮很简单,我似乎无法找到它。
我在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 ]
有些值非常接近,但有些值是。感谢所有读过这篇文章的人,也许你有一些想法,为什么期望值不匹配,我将非常感激。提前致谢! (也许它与某些数字错误或类似错误有关)