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 de la densidad de estados es la siguiente
$$ DOS(E) = \sum_{k \in BZ, n} \delta(E-E_n(k)), $$
donde $E_n(k)$ son los valores propios de la matriz hamiltoniana particular que estoy resolviendo. Me gustaría utilizar la aproximación Cauchy/Lorentziana de la función Delta de manera que la primera ecuación se convierta en
$$ DOS(E) = \frac{1}{\pi} \lim_{\epsilon\to 0} \sum_{k \in BZ, n} \frac{\epsilon}{(E-E_n(k))^2+\epsilon^2}. $$
A partir de aquí, estoy confundido sobre cómo interpretar numéricamente la segunda ecuación. Tengo los respectivos valores propios del hamiltoniano, pero no sé cómo obtener el DOS utilizando $E$ . ¿Cómo puedo incluir $E$ en mi código? Discretizar E para mí significa que tomo una determinada ventana de energía alrededor de un determinado valor $E$ pero no sé cómo estructurarlo, o si debe ser un array, una rejilla... o algo más. Si E debe ser una cuadrícula, ¿debe ser una cuadrícula entre los valores mínimos y máximos de los valores propios de energía?
EDITAR: Hola a todos. Después de reflexionar sobre la respuesta de Murali se me ha ocurrido un pseudocódigo 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 lorentziana 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í se le da a epsilon un valor de 0,1 sólo para probar. Los vectores propios del Hamiltoniano se obtuvieron introduciendo 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()
Así que entonces obtengo todos los valores propios de la FBZ en esta matriz. ¿Voy en la dirección correcta?