最近这两天对角化矩阵本征值的时候踩了大坑,这里必须整理一下。使用的是Julia
的Arpack库中,求解少量本征值的函数eigs
。本来以为是自己程序写错了,认真检查了两天了,结果是这个函数自身的问题。
烦
一直以来做计算都是要对矩阵进行对角化,通常也只是关注低能附近的情况,所以这个时候是没必要进行全矩阵对角化的,只需要得到低能的一些本征值即可。通常我是用的是Julia
的Arpack这个库,函数为
val,vec = eigs(ham,nev = 100,mt1iter = 30,which = :SM) # 取最小的100个本征值
因为此时好像是利用迭代的方法来求解本确定数量的本征值的,所以此时就会有一个迭代数量设置,我在之前的问题中一直都是设置mt1iter = 30
,也没出什么问题,得到的结果也都是正确的,但是最近在计算超导vortex中的低能激发的时候就出问题了,得到的结果会震荡的很厉害,而且将mt1iter = 100
同样发现和文献中的结果有出入,最终不得不使用直接对角化的方法,得到全部的本征值
val = eigvals(ham)
此时得到的结果才和文章是符合的。
我推测是因为此时我关注的本来就是低能激发,所以首先可能要得到精确的结果就需要迭代很多次,但是如果将迭代次数设置更大,计算时间可能就会大过直接对角化所需要的时间,所以如果我们关心的问题本身就是能量特别小的,此时可能就需要直接对角化来计算(在哈密顿量维度不是特别大的时候)。如果矩阵维度很大,那么能想到的方法就是将所有的参数都同时扩大同样的倍数,然后使用eigs(ham,nev = 100,mt1iter = 30,which = :SM)
来计算结果。
公众号
相关内容均会在公众号进行同步,若对该Blog感兴趣,欢迎关注微信公众号。