Cálculo numérico de densidad de estados

Estoy tratando de averiguar la interpretación numérica de la densidad de estados para un sistema fermiónico bajo un potencial periódico.

La ecuación para la densidad de estados dice

D O S ( mi ) = k B Z , norte d ( mi mi norte ( k ) ) ,

dónde mi norte ( k ) son los valores propios de la matriz hamiltoniana particular que estoy resolviendo. Me gustaría usar la aproximación de Cauchy/Lorentzian de la función Delta tal que la primera ecuación ahora se convierte en

D O S ( mi ) = 1 π límite ϵ 0 k B Z , norte ϵ ( mi mi norte ( k ) ) 2 + ϵ 2 .

De aquí en adelante, estoy confundido sobre cómo interpretar numéricamente la segunda ecuación. Tengo los valores propios respectivos del hamiltoniano, pero no sé cómo obtener el DOS usando mi . como incluyo mi en mi código? Discretizar E para mí significa que tomo una cierta ventana de energía alrededor de un cierto valor mi , pero no sé cómo estructurarlo, o si necesita ser una matriz, una cuadrícula... o algo más. Si E debe ser una cuadrícula, ¿debería ser una cuadrícula entre los valores mínimo y máximo de los valores propios de la energía?

EDITAR: Hola a todos. Después de reflexionar sobre la respuesta de Murali, se me ocurrió un pseudocódigo que es bastante malo, pero me gustaría saber si voy en la dirección correcta.

Básicamente codifiqué una función para la función delta ampliada de Lorentzian así:


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

Aquí a épsilon se le da un valor de 0.1 solo para probar. Los vectores propios del hamiltoniano se obtuvieron ingresando puntos de la FBZ:


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()

Entonces obtengo todos los valores propios de la FBZ en esta matriz. ¿Voy en la dirección correcta?

Ingenuamente, habría pensado que querrías definir una función DOS que tome como entrada mi y devuelve la densidad de estados en ese valor de mi . Luego puede hacer cosas como trazar la densidad de estados frente a la energía pasando una matriz de mi valores a esta función.
Necesita realizar una suma/integración numérica sobre k y norte por cada valor de mi . en caso de que k es en realidad una variable continua, es mejor que primero realice la integración analíticamente en términos de las raíces mi norte ( k ) = mi y luego simplemente sumando las contribuciones - esto evitaría cualquier incertidumbre debido al valor de ϵ .
@RogerVadim k en este caso no es continuo. Lo que estoy haciendo es elegir una cuadrícula en el espacio de impulso de modo que tenga alrededor de 10 000 puntos K que cubran una parte de la zona de Brillouin.
@MadLad No estoy seguro de entenderte: ¿lo discretizas para hacer cálculos de computadora, pero inicialmente es continuo (porque el cristal es infinito)?
Correcto, lo siento @RogerVadim. Partimos de una celda irreducible en el espacio de cantidad de movimiento, y luego, naturalmente, haríamos una integral en k, pero como estoy haciendo los números, solo tomo algunas matrices en k que cubren el área de esta celda.
Lo que estaba sugiriendo es tomar una integral antes de hacer números: la función delta casi te obliga a hacer esto.

Respuestas (1)

Creo que no entendiste correctamente qué significa densidad de estados (DOS). DOS es una función de densidad de probabilidad (PDF). Como señaló Andrew, toma energía como entrada y devuelve el número de estados para una energía dada.

No puedes discretizar mi ya que no son valores propios de ningún observable. Es el parámetro de entrada, y discretizarlo simplemente no tiene ningún sentido. los valores de mi norte ( k ) se discretizan ya que son valores propios del hamiltoniano electrónico.

Si considera la primera ecuación en su pregunta,

D O S ( mi ) = k B Z , norte d ( mi mi norte ( k ) ) ,
Para Energías mi mi norte ( k ) , D O S ( mi ) = 0 . Sin embargo, esto no es lo que observas en los experimentos. Por lo general, vemos algunos DOS finitos para energías que no son iguales a los estados propios debido a la incertidumbre de Heisenberg. Para dar cuenta de esto, agregamos un pequeño parámetro de ensanchamiento electrónico finito ( ϵ ) como se muestra en la segunda ecuación de su pregunta.

Para calcular el DOS, toma E como un parámetro que puede tomar cualquier valor y corregir ϵ , luego calcule la doble suma sobre la zona de Brillouin (BZ) y las bandas (n), que son los valores propios de su hamiltoniano. Sumar sobre BZ es simplemente sumar sobre k puntos en la zona de Brillouin y dividir la suma obtenida por el número total de k puntos. Elija una cuadrícula de puntos k razonable y asegúrese de que converja. Eche un vistazo al siguiente enlace ( http://www.iiserpune.ac.in/~smr2626/hands_on/week1/july1/bzsums_mastani.pdf ) si no tiene idea sobre la suma BZ

Pseudocódigo:

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

    
Soy consciente de que necesito sumar sobre K puntos en la zona de Brillouin, y también sobre las bandas. "Tomas E como un parámetro que puede tomar cualquier valor". Esto es con lo que estoy mayormente confundido. Entonces, ¿E debería ser una matriz en incrementos que van desde la energía mínima hasta la energía máxima en el sistema? El Lorentziano en ese caso me daría valores cercanos a 1 para cada energía que esté cerca de una banda de energía, y así DOS será mayor si las bandas en puntos específicos de Kx,Ky tienen energía cercana a ese valor de E.
El Lorentziano no es 1 en E = E(k). Explota (1/épsilon). Sí, E puede tomar cualquier valor, no solo entre Min y Max. Daré un análogo. Considere una distribución gaussiana 1D ( ~e^-{kx^2}). no importa cuál sea su x, obtiene algún valor para la distribución (lo que está encontrando es densidad de probabilidad en x). Es la distribución, que es una función de x. continuación
A medida que se acerca más a la media, sus valores caen muy rápidamente. De manera similar, desea una cantidad de estados para una energía dada. Si no hay estados con esa energía, su DOS es 0 (por ejemplo, si elige E en el intervalo de banda, su DOS = 0, ya que no hay estados en el intervalo de banda). Por supuesto, tus dosis serán más altas si coinciden con las energías de la banda.
Creo que me diste una mejor idea sobre cómo pensarlo y calcularlo. Probaré algunas cosas, gracias! Comentaré cualquier cosa si tengo dudas. @murali
@MadLad: agregué un pseudocódigo, échale un vistazo. Esto es solo para entender. puedes escribir un código mucho mejor.