闲谈
对于Mathematica,我发现对于两个相同的矩阵,也就是Mathematica判断为True
的两个矩阵,分别解本征值和本征矢,本征值是一样的,本征矢却差别挺大!
这个是在我求解Kane-Mele模型的矩阵的Pfaffian时遇到的问题。本文在这里记录一下这个问题,暂时还未解决, 如果大家有想法,欢迎留言交流。
问题
这里说明一下我遇到的问题,主要为Mathematica的“精确解”和“数值解”得到的本征矢不一样,所以造成了求解矩阵的Pfaffian时会出现问题!
精确解
哈密顿量为
![Mathematica的“精确解”和“数值解”得到的本征矢为何不一样? 图片[1]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客](https://www.bunian.cn/wp-content/uploads/2024/01/640-8.png)
时间反演算符为
![Mathematica的“精确解”和“数值解”得到的本征矢为何不一样? 图片[2]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客](https://www.bunian.cn/wp-content/uploads/2024/01/640-9.png)
注意实际作用时需要先作用Conjugate
,再作用UT
。
正格子基矢为
![Mathematica的“精确解”和“数值解”得到的本征矢为何不一样? 图片[3]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客](https://www.bunian.cn/wp-content/uploads/2024/01/640-10.png)
倒格子基矢为
![Mathematica的“精确解”和“数值解”得到的本征矢为何不一样? 图片[4]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客](https://www.bunian.cn/wp-content/uploads/2024/01/640-11.png)
四个时间反演不变点为
![Mathematica的“精确解”和“数值解”得到的本征矢为何不一样? 图片[5]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客](https://www.bunian.cn/wp-content/uploads/2024/01/640-12.png)
矩阵的定义为
![Mathematica的“精确解”和“数值解”得到的本征矢为何不一样? 图片[6]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客](https://www.bunian.cn/wp-content/uploads/2024/01/4d694c18-fe62-40f1-bbc4-21a01879cd86.png)
我们用Mathematica定义函数并求解,发现在四个时间反演不变点得到的矩阵确实是反对称矩阵。
![Mathematica的“精确解”和“数值解”得到的本征矢为何不一样? 图片[7]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客](https://www.bunian.cn/wp-content/uploads/2024/01/640-13.png)
通过Mathematica求解矩阵的Pfaffian,得到
![Mathematica的“精确解”和“数值解”得到的本征矢为何不一样? 图片[8]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客](https://www.bunian.cn/wp-content/uploads/2024/01/640-14.png)
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
这个函数数值化。
![Mathematica的“精确解”和“数值解”得到的本征矢为何不一样? 图片[9]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客](https://www.bunian.cn/wp-content/uploads/2024/01/640-15.png)
可以看到,后续相关结果都会数值化,如下
![Mathematica的“精确解”和“数值解”得到的本征矢为何不一样? 图片[10]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客](https://www.bunian.cn/wp-content/uploads/2024/01/640-16.png)
再往下进行,可以发现wk[GPi0]
和wk[GPiPi]
不是反对称矩阵了,所以它们的Pfaffian无法计算,如下
![Mathematica的“精确解”和“数值解”得到的本征矢为何不一样? 图片[11]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客](https://www.bunian.cn/wp-content/uploads/2024/01/640-17.png)
这样,我们看到“数值解”出现了问题!为了进一步查找原因,我们选择“精确解”的GPiPi
点进行测试。
测试
“精确解”的GPiPi
点为
![Mathematica的“精确解”和“数值解”得到的本征矢为何不一样? 图片[12]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客](https://www.bunian.cn/wp-content/uploads/2024/01/640-18.png)
它的“精确解”和“数值解”对应的矩阵分别定义为t1
和t2
,可以看到在Chop
函数下,它们是相等的(用==
判断),但是在精度上它们是不相等的(用===
判断)。
![Mathematica的“精确解”和“数值解”得到的本征矢为何不一样? 图片[13]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客](https://www.bunian.cn/wp-content/uploads/2024/01/640-19.png)
求解本征值和本征矢,发现本征矢不一样!
![Mathematica的“精确解”和“数值解”得到的本征矢为何不一样? 图片[14]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客](https://www.bunian.cn/wp-content/uploads/2024/01/640-20-1.png)
我不清楚Mathematica是如何求解“精确解”和“数值解”的,所以这个问题没有解决。如果你有一些想法,欢迎留言交流。
总结起来,对于Kane-Mele模型,我们知道“精确解”,但是对于实际模型,晶格基矢往往是“数值解”,这个时候我们可能无法给出反对称矩阵并且计算它的Pfaffian了。
当然,如果我们关注四个时间反演不变点,有,大概可以通过这样替换解决问题。