闲谈
对于Mathematica,我发现对于两个相同的矩阵,也就是Mathematica判断为True
的两个矩阵,分别解本征值和本征矢,本征值是一样的,本征矢却差别挺大!
这个是在我求解Kane-Mele模型的矩阵的Pfaffian时遇到的问题。本文在这里记录一下这个问题,暂时还未解决, 如果大家有想法,欢迎留言交流。
问题
这里说明一下我遇到的问题,主要为Mathematica的“精确解”和“数值解”得到的本征矢不一样,所以造成了求解矩阵的Pfaffian时会出现问题!
精确解
哈密顿量为
时间反演算符为
注意实际作用时需要先作用Conjugate
,再作用UT
。
正格子基矢为
倒格子基矢为
四个时间反演不变点为
矩阵的定义为
我们用Mathematica定义函数并求解,发现在四个时间反演不变点得到的矩阵确实是反对称矩阵。
通过Mathematica求解矩阵的Pfaffian,得到
Mathematica求解反对称矩阵的Pfaffian在Wolfram函数资源库中,具体见
https://resources.wolframcloud.com/FunctionRepository/resources/Pfaffian
相关的参考文献见
Wimmer, M., “Algorithm 923: Efficient Numerical Computation of the Pfaffian for Dense and Banded Skew-Symmetric Matrices.” ACM Trans. Math. Softw., vol. 38, no. 4, 1–17, 2012. DOI: 10.1145/2331130.2331138.
数值解
通过上边“精确解”的计算,我们看到一路走下来没有问题!接下来,看一下“数值解”,我这里把正格子基矢用N
这个函数数值化。
可以看到,后续相关结果都会数值化,如下
再往下进行,可以发现wk[GPi0]
和wk[GPiPi]
不是反对称矩阵了,所以它们的Pfaffian无法计算,如下
这样,我们看到“数值解”出现了问题!为了进一步查找原因,我们选择“精确解”的GPiPi
点进行测试。
测试
“精确解”的GPiPi
点为
它的“精确解”和“数值解”对应的矩阵分别定义为t1
和t2
,可以看到在Chop
函数下,它们是相等的(用==
判断),但是在精度上它们是不相等的(用===
判断)。
求解本征值和本征矢,发现本征矢不一样!
我不清楚Mathematica是如何求解“精确解”和“数值解”的,所以这个问题没有解决。如果你有一些想法,欢迎留言交流。
总结起来,对于Kane-Mele模型,我们知道“精确解”,但是对于实际模型,晶格基矢往往是“数值解”,这个时候我们可能无法给出反对称矩阵并且计算它的Pfaffian了。
当然,如果我们关注四个时间反演不变点,有,大概可以通过这样替换解决问题。