Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?

闲谈

对于Mathematica,我发现对于两个相同的矩阵,也就是Mathematica判断为True的两个矩阵,分别解本征值和本征矢,本征值是一样的,本征矢却差别挺大!

这个是在我求解Kane-Mele模型的矩阵的Pfaffian时遇到的问题。本文在这里记录一下这个问题,暂时还未解决, 如果大家有想法,欢迎留言交流。

问题

这里说明一下我遇到的问题,主要为Mathematica的“精确解”和“数值解”得到的本征矢不一样,所以造成了求解矩阵的Pfaffian时会出现问题!

精确解

哈密顿量为

图片[1]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客

时间反演算符为

图片[2]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客

注意实际作用时需要先作用Conjugate,再作用UT

正格子基矢为

图片[3]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客

倒格子基矢为

图片[4]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客

四个时间反演不变点为

图片[5]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客

矩阵的定义为

图片[6]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客

我们用Mathematica定义函数并求解,发现在四个时间反演不变点得到的矩阵确实是反对称矩阵。

图片[7]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客

通过Mathematica求解矩阵的Pfaffian,得到

图片[8]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客

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这个函数数值化。

图片[9]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客

可以看到,后续相关结果都会数值化,如下

图片[10]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客

再往下进行,可以发现wk[GPi0]wk[GPiPi]不是反对称矩阵了,所以它们的Pfaffian无法计算,如下

图片[11]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客

这样,我们看到“数值解”出现了问题!为了进一步查找原因,我们选择“精确解”的GPiPi点进行测试。

测试

“精确解”的GPiPi点为

图片[12]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客

它的“精确解”和“数值解”对应的矩阵分别定义为t1t2,可以看到在Chop函数下,它们是相等的(用==判断),但是在精度上它们是不相等的(用===判断)。

图片[13]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客

求解本征值和本征矢,发现本征矢不一样!

图片[14]-Mathematica的“精确解”和“数值解”得到的本征矢为何不一样?-不念博客

我不清楚Mathematica是如何求解“精确解”和“数值解”的,所以这个问题没有解决。如果你有一些想法,欢迎留言交流。

总结起来,对于Kane-Mele模型,我们知道“精确解”,但是对于实际模型,晶格基矢往往是“数值解”,这个时候我们可能无法给出反对称矩阵并且计算它的Pfaffian了。

当然,如果我们关注四个时间反演不变点,有,大概可以通过这样替换解决问题。

© 版权声明
THE END