学术, 电子态密度

数值验证“波函数模平方分布”和“格林函数计算的态密度分布”的关系(附Python代码)

波函数模平方的分布和格林函数计算出的态密度分布,这两个是否是相同的?这个问题留了很久,但一直没做数值验证。因为按直觉来说,两者描述的是同一个物理图像。先放上结论:数值计算的结果验证了两者是一样的。

这里用方格子作为测试对象,算某个能级波函数模的平方分布以及格林函数计算出的态密度分布(经过了归一化)。Python代码如下:

"""
This code is supported by the website: https://www.guanjihuan.com
The newest version of this code is on the web page: https://www.guanjihuan.com/archives/962
"""

import numpy as np


def hamiltonian(width=2, length=4):  # 有一定宽度和长度的方格子
    h00 = np.zeros((width*length, width*length))
    for i0 in range(length):
        for j0 in range(width-1):
            h00[i0*width+j0, i0*width+j0+1] = 1
            h00[i0*width+j0+1, i0*width+j0] = 1
    for i0 in range(length-1):
        for j0 in range(width):
            h00[i0*width+j0, (i0+1)*width+j0] = 1
            h00[(i0+1)*width+j0, i0*width+j0] = 1
    return h00


def main():
    h0 = hamiltonian()
    dim = h0.shape[0]
    n = 4  # 选取第n个能级
    eigenvalue, eigenvector = np.linalg.eig(h0)  # 本征值、本征矢
    # print(h0)
    # print('哈密顿量的维度:', dim)  # 哈密顿量的维度
    # print('本征矢的维度:', eigenvector.shape)  # 本征矢的维度
    # print('能级(未排序):', eigenvalue)  # 输出本征值。因为体系是受限的,所以是离散的能级
    # print('选取第', n, '个能级,为',  eigenvalue[n-1])  # 从1开始算,查看第n个能级是什么(这里本征值未排序)
    # print('第', n, '个能级对应的波函数:', eigenvector[:, n-1])  # 查看第n个能级对应的波函数
    print('\n波函数模的平方:\n', np.square(np.abs(eigenvector[:, n-1])))   # 查看第n个能级对应的波函数模的平方
    green = np.linalg.inv((eigenvalue[n-1]+1e-15j)*np.eye(dim)-h0)  # 第n个能级对应的格林函数
    total = np.trace(np.imag(green))  # 求该能级格林函数的迹,对应的是总态密度(忽略符号和系数)
    print('归一化后的态密度分布:')
    for i in range(dim):
        print(np.imag(green)[i, i]/total)  # 第n个能级单位化后的态密度分布
    print('观察以上两个分布的数值情况,可以发现两者完全相同。')


if __name__ == '__main__':
    main()

计算结果如下:

说明:

  1. 用波函数模平方计算的态密度分布,只能是严格位于能带的某个点上,即严格的k值和能量值。而用格林函数计算的态密度分布,通过调节虚数项在能量方向上可以有一定的展宽,同时k值可以偏离能带。
  2. 如果存在着简并,用格林函数求解的时候,是把几个波函数同时考虑进去了。求解波函数时用np.linalg.eigh可以得到相互正交的波函数。
2,892 次浏览

【说明:本站主要为个人笔记分享,内容可能会不定期修改。为了使全网显示的始终是最新版本,这里的文章未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com

评论说明:
(1)为了屏蔽广告,包含链接的评论会进入待审,不会立即显示,需要等待博主批准。
(2)在保留浏览器缓存的前提下,目前支持72小时自主修改或删除个人评论。如果自己无法修改或删除评论,可再次评论或联系我。
(3)评论支持Latex公式。把latexpage作为标签放在任何位置,评论中的公式可正常编译,示例:
$Latex formula$  [latexpage]

10 thoughts on “数值验证“波函数模平方分布”和“格林函数计算的态密度分布”的关系(附Python代码)”

  1. 关老师您会计算局域态密度吗(LDOS),这似乎和态密度DOS不一样,它是实空间的

    1. 这里就是实空间的例子,不求和就是局域态密度LDOS。哈密顿量和波函数中的编号/索引和实空间位置有关系,是一一对应的。

    2. 关老师您好,您这里的算法是只用了超前和延迟格林函数中的一个,但是这篇文章两个都用了(https://zhuanlan.zhihu.com/p/397762078),这其中的区别在哪呢?另外按照这篇文章的思路,计算局域态密度必须指定一个实空间的位置,也就是要涉及实空间波函数的分量,但是您的代码似乎并没有涉及波函数。

      1. (1)公式是一样的,延迟格林函数和超前格林函数是厄密共轭的关系,两个相减得到的是虚部的两倍。(2)特征矢eigenvector就是本征波函数。

        1. 关老师,也就是np.imag(green)矩阵的对角元的某一部分就是指定的位置的LDOS吗?

  2. 关老师我想问一下,态密度公式中波函数的模方不是总是等于1吗?因为是同一个波函数,那为什么态密度公式还要加上波函数的模方呢?
    或者更具体说,波函数的模方在数值计算里该怎么理解呢?

发表回复

您的电子邮箱地址不会被公开。