Численный расчет плотности состояний

Я пытаюсь выяснить числовую интерпретацию плотности состояний для фермионной системы при периодическом потенциале.

Уравнение для плотности состояний читается

Д О С ( Е ) "=" к е Б Z , н дельта ( Е Е н ( к ) ) ,

где Е н ( к ) являются собственными значениями конкретной гамильтоновой матрицы, которую я решаю. Я хотел бы использовать аппроксимацию Коши/Лоренца дельта-функции, чтобы первое уравнение теперь стало

Д О С ( Е ) "=" 1 π лим ϵ 0 к е Б Z , н ϵ ( Е Е н ( к ) ) 2 + ϵ 2 .

С этого момента я не понимаю, как численно интерпретировать второе уравнение. У меня есть соответствующие собственные значения гамильтониана, но я не знаю, как получить DOS, используя Е . Как мне включить Е в моем коде? Дискретизация E для меня означает, что я беру определенное энергетическое окно вокруг определенного значения. Е , но я не знаю, как его структурировать, или если это должен быть массив, сетка... или что-то еще. Если E должно быть сеткой, то должна ли она быть сеткой между минимальным и максимальным значениями собственных значений энергии?

РЕДАКТИРОВАТЬ: Всем привет. Обдумав ответ Мурали, я придумал довольно плохой псевдокод, но я хотел бы знать, иду ли я в правильном направлении.

Я в основном закодировал функцию для расширенной дельта-функции Лоренца следующим образом:


def delta_l(x):
  return (1/np.pi)*(epsilon/(epsilon**2 + x**2))


def dos(Egrid,Eigen):
    DOS = np.zeros((AllK,1))

    for j in range(Allk):
    DOS[j] = (1/AllK)*sum([delta(Egrid[j]-Eigen[i]) for i in range(np.shape(Eigen)[0])])

  return DOS

Здесь эпсилон получает значение 0,1 просто для проверки. Собственные векторы гамильтониана были получены путем ввода точек ФБЗ:


AllK = len(np.arange(0, 1, 0.01)) * len(np.arange(0, 1, 0.01))

E  = np.zeros((AllK,4*n), float)

count = 0
for m in np.arange(0, 1, 0.01):
    for f in np.arange(0, 1, 0.01):
        kx = (m-f) * np.sqrt(3)/2
        ky = (m+f) * 3.0/2 - 1
        E[count] = Hamiltonian(kx*Kmag, ky*Kmag)
        count = count + 1

import pandas as pd
EinBZ = E.flatten()

Итак, я получаю все собственные значения FBZ в этом массиве. Я иду в правильном направлении?

Наивно я бы подумал, что вы хотите определить функцию DOS, которая принимает на вход Е и возвращает плотность состояний при этом значении Е . Затем вы можете делать такие вещи, как график зависимости плотности состояний от энергии, передавая массив Е значения этой функции.
Вам необходимо выполнить численное суммирование/интегрирование по к и н для каждого значения Е . В случае, если к на самом деле непрерывная переменная, вам может быть лучше сначала провести интеграцию аналитически с точки зрения корней Е н ( к * ) "=" Е а затем просто суммировать вклады - это позволит избежать любой неопределенности из-за значения ϵ .
@RogerVadim k в этом случае не является непрерывным. Что я делаю, так это выбираю сетку в импульсном пространстве так, чтобы у меня было около 10 000 тысяч точек, покрывающих часть зоны Бриллюэна.
@MadLad Я не уверен, что понимаю вас: вы дискретизируете его, чтобы выполнять компьютерные вычисления, но изначально он непрерывен (потому что кристалл бесконечен)?
Хорошо, извините за это @RogerVadim. Мы начинаем с неприводимой ячейки в импульсном пространстве, а затем, естественно, вычисляем интеграл по k, но, поскольку я занимаюсь числовыми вычислениями, я просто беру несколько массивов по k, покрывающих площадь этой ячейки.
Я предлагал взять один интеграл, прежде чем приступать к числовым вычислениям - дельта-функция почти обязывает вас сделать это.

Ответы (1)

Думаю, вы не правильно поняли, что имеется в виду под плотностью состояний (DOS). DOS - это функция плотности вероятности (PDF). Как указал Эндрю, он принимает энергию в качестве входных данных и возвращает количество состояний для данной энергии.

Вы не можете дискретизировать Е поскольку они не являются собственными значениями какой-либо наблюдаемой. Это входной параметр, и дискретизировать его просто нет никакого смысла. значения Е н ( к ) дискретизированы, так как являются собственными значениями электронного гамильтониана.

Если вы рассмотрите 1-е уравнение в своем вопросе,

Д О С ( Е ) "=" к е Б Z , н дельта ( Е Е н ( к ) ) ,
Для энергии Е Е н ( к ) , Д О С ( Е ) "=" 0 . Однако это не то, что вы наблюдаете в экспериментах. Обычно мы видим некоторую конечную плотность состояний для энергий, не равных собственным состояниям, из-за неопределенности Гейзенберга. Чтобы учесть это, мы добавляем небольшой конечный параметр электронного уширения ( ϵ ), как показано во втором уравнении вашего вопроса.

Чтобы вычислить DOS, вы берете E в качестве параметра, который может принимать любое значение и зафиксировать ϵ , затем вычислите двойное суммирование по зоне Бриллюэна (BZ) и полосам (n), которые являются собственными значениями вашего гамильтониана. Суммирование по БЗ — это просто суммирование по k точкам в зоне Бриллюэна и деление полученной суммы на общее количество k точек. Выберите разумную сетку k точек и убедитесь, что она сходится. Взгляните на следующую ссылку ( http://www.iiserpune.ac.in/~smr2626/hands_on/week1/july1/bzsums_mastani.pdf ), если вы не имеете никакого представления о суммировании BZ.

Псевдокод:

def delta_l(x):
    return delta function(x)

def E(k):
    return Eigen values for Each k

def dos(E): (let us compute for some E value. This is very inefficient way. just writing for your understanding)
    sum = 0 
    for i in kpoints:
        for j in total_number_of_bands:
            sum = sum + delta_l(E-E(i)[j]) #where E(i)[j] is $j^{th}$ eigen value of $i^{th}$ kpoint 
    return sum/N # N is total number of kpoints

    
Я знаю, что мне нужно просуммировать K точек в зоне Бриллюэна, а также по полосам. «Вы берете E как параметр, который может принимать любое значение». Это то, что меня больше всего смущает. Итак, должно ли E быть массивом приращений, идущим от минимальной энергии к максимальной энергии в системе? Лоренциан в этом случае дал бы мне значения, близкие к 1, для каждой энергии, которая близка к энергии полосы, и поэтому DOS будет выше, если полосы в определенных точках Kx, Ky имеют энергию, близкую к этому значению E.
Лоренциан не равен 1 при E = E(k). Он взрывается (1/эпсилон). Да, E может принимать любое значение, а не только между Min и Max. Я дам аналог. Рассмотрим одномерное распределение Гаусса (~e^-{kx^2}). независимо от того, каков ваш x, вы получаете некоторое значение для распределения (то, что вы находите, - это плотность вероятности в x). Это распределение, которое является функцией x. продолжение
По мере того как вы приближаетесь к среднему значению, ваши значения очень быстро падают. Точно так же вам нужно количество состояний для данной энергии. Если нет состояний с такой энергией, ваш DOS равен 0 (например, если вы выберете E в запрещенной зоне, ваш DOS = 0, так как в запрещенной зоне нет состояний). Конечно, ваши досы будут выше, если они совпадают с энергиями полос.
Я думаю, вы дали мне лучшее представление о том, как думать об этом и вычислять его. Что-нибудь попробую, спасибо! Я прокомментирую что-нибудь, если у меня есть сомнения. @Мурали
@MadLad: я добавил псевдокод, посмотри. Это просто для понимания. вы можете написать гораздо лучший код.