紧束缚模型状态密度的数值敏感性

计算科学 Python 计算物理学 收敛 稳定
2021-12-26 08:00:21

我正在使用紧束缚模型,并且正在尝试学习如何以数值N(E)

DOS 由下式给出

N(E)=1Nkδ(Eϵk),

其中是色散关系 - 在 1D 中,它的形式,其中是我选择为 1 的参数。我们也可以将其写为积分,ϵk2tcos(k)t

N(E)=12πkδ(Eϵ(k))dk

我们有几种估计 DOS 的方法。我采用了两种方法,这两种方法似乎都对收敛的数值参数非常敏感。

  1. 使用 Delta“函数”的洛伦兹近似,代码是δ(x)limϵ0ϵϵ2+x2

    # Approximate the delta function
    def delta(x):
        return (1/pi)*(eps/(x**2 + eps**2))
    

    然后在我的k s范围内简单地计算上述总和k,如下所示的一维情况。

    # Use summation form of density of states for numeric calculation
    def N(E):
        D = sum([delta(E - disp_e(k1)) for k1 in ks])
        # Minimum D for every E should be pi/4 for the 1D case. Unfortunately,   it's going to 0 mostly. Why? How? 
        dos = (1/Num_sites) * D
        return dos
    
  2. 将状态的 DOS 计算为系统极点处格林函数的虚部,,其中再次应该是一个小参数。这是 1D 中的函数的代码,尽管我也为 2D 和 3D 完成了它们:N(E)=1Nπk1Eϵk+iϵϵ

    # Try to get DOS by summing over k-points of the lattice Green's function
    def Greens(E, e_k):
        return (1/Num_sites)*(1/(E - e_k + 0.05*1.0j))
    
    def N2(E):
        D = (-1/(N*pi))*(sum([Greens(E, disp_e(k1)) for k1 in ks])).imag
        return D
    

最后,谈谈我的问题。我花了很长时间(10 个小时)试图弄清楚为什么我的代码没有收敛到一维分析解决方案,尽管增加了更多的 k 点或对能量有更精细的分辨率。

事实证明,尽管有定义,但我选择的参数太小了。的顺序上选择数字,但最终我发现仅在格林函数方法的和 0.01 之间时才显示正确的数值结果-0.05 用于 delta 函数方法。ϵ104ϵϵ[0.1,0.5]

这是我最终得到的一维的正确解,包括解析解和数值解。这适用于 delta 函数方法的 epsilon = 0.01。Hubbard U = 0 一维模型,epsilon = 0.01。

这是我将 epsilon 参数更改为更小时得到的结果。振荡在更小的ε处变成发散,我没有得到任何数值解。ε = 0.001。 在更小的值下,解决方案会发散。

我的问题是——为什么?这些定义暗示了一个小的,此外,我看不出为什么两个单独的数值方法都不会因为相同的原因而收敛。这些近似值在任何地方都有稳定性/收敛性分析吗?ϵ

我想知道的原因是因为我想研究没有解析解的系统,如果我的解的质量随着所谓的任意参数而不规律地变化,我无法确定我的数值解!

2个回答

您可以在此处在平流 PDE 的粒子方法的上下文中找到对此方法的讨论本文末尾的一些结果将阐明这个问题。本质上,作为,您的解决方案将在积分意义上收敛,但该函数的逐点估计并不那么容易。如果太大,则解过平滑,如果太小,则您会看到这种锯齿状行为。ϵ0ϵϵ

特别是,对于您在链接论文中反映定理 2.2 的问题,可能存在错误估计。随着您获取更多点,您对密度的离散化变得更加准确,并且这些点越接近,您能够获取的越小。这是因为对于 Dirac delta 函数的平滑逼近,论文中的参数等于这发生在您的柯西近似以及狄拉克三角函数的高斯近似中。对于,必须使安全地小于 1,其中是狄拉克质量之间的间隔。ϵmm=h/ϵh

粒子方法中的一个常见选择是,它确保无论选择的足够小,这个前置因子都很小。基础分析显然与您的情况不同,这可能会导致收敛顺序略有不同,但直觉保持不变。您应该能够通过玩弄应该如何随着您使用的点数而改变来解决这个问题。ϵ=14hhϵ

状态的精确密度

DosE[x_] := 1/(2 \[Pi]) *1/Sin[ArcCos[-x/2]]

定义增量函数

Delta[e0_, \[Sigma]_] := 
1/(Sqrt[2 \[Pi] \[Sigma]^2]) *Exp[-0.5*e0^2/\[Sigma]^2]

evals是哈密顿矩阵的已知特征值,然后

DOS[e0_, \[Sigma]0_] := Module[{\[Sigma] = \[Sigma]0, sum},
sum = 0.;
Clear[k];
For[k = 1, k <= Length[evals], k++,
If[Abs[e0 - evals[[k]]] < 6*\[Sigma],
 sum = sum + Delta[(e0 - evals[[k]]), \[Sigma]]
 ];
];
Return[sum/L] (*L=system size*)
]

阴谋

Plot[{DosE[x], DOS[x, 0.01]}, {x, -1.99, 1.99}, PlotRange -> All,PlotStyle -> {Black, Red}]

数值结果(使用 Mathematica)100% 与 L=1024 的分析结果一致,高斯函数(delta 函数)的方差为 0.01。