본문 바로가기

Engineering

[물리전자공학] 에너지에 따른 전자의 농도를 구해보자

반응형

D=(8√2 π)/h^3  (m^* )^(3/2) (E_kin )^(1/2), N_C=(4√2(〖πm^* kT)〗^(3/2))/h^3 , E_kin=E-E_C, m=1.08m_0, m_0=9.019*10^31  [kg]
페르미-디락 분포 : f(E)=1/[1+e^((E-E_F)/kT)]
맥스웰-볼츠만 근사 : 〖f(E)=e〗^(-(E-E_F)/kT)
E_F가 다음 세 위치 (E_C-E_F=10kT,5kT,0kT)에 있고 상온에서 kT=0.02585 [eV]이다.

 페르미-디락 분포와 맥스웰-볼츠만 근사식을 이용해 상온에서 E_C-E_F=10kT,5kT,0kT 각각의 경우에 대해 전자 상태가 채워질 확률을 구해보자.
E_F=[10kT,5kT,0kT]-E_C , E_kin-E=E_C
페르미-디락 : f(E)=1/[1+e^((E+[10kT,5kT,0kT]-E_C)/kT)]= 1/[1+e^((E_kin+[10kT,5kT,0kT])/kT)] 로 정리된다.
맥스웰-볼츠만 근사 : e^(-(E_kin+[10kT,5kT,0kT])/kT)
이제 E_kin을 10~150[meV]로 변화시키며 각각의 경우에 대해 전자 상태가 채워질 확률을 그래프로 plot하면 다음과 같다. 
 

페르미-디락 분포를 이용한 전자 상태가 채워질 확률
맥스웰-볼츠만 근사를 이용해서 구한 전자 상태가 채워질 확률




 위에서 구한 페르미-디락 분포와 맥스웰-볼츠만 근사식으로 구한 전자 상태가 채워질 확률의 차이를 그래프로 표시하면 다음과 같다. 

 

전자상태가 채워질 확률 오차(FD-MB)


 그래프를 보면 페르미-디락 분포와 맥스웰-볼츠만 근사식의 오차는 E_C-E_F가 작아질수록 작아진다. 즉 컨덕션 밴드와 페르미 레벨의 차이가 작을수록 오차가 작아지며 에너지(E)가 높을수록 그 차이가 줄어든다. 그 이유는 페르미-디락 분포 식 f(E)=1/[1+e^((E-E_F)/kT)] 에서 분모의 1이 없는 것이 맥스웰-볼츠만 근사식 e^(-(E-E_F)/kT)이다. 결론적으로 e^((E-E_F)/kT)가 1보다 크면 클수록 페르미-디락 분포 식과 맥스웰-볼츠만 근사식은 유사 해진다. 따라서 E가 클수록, E-E_F가 클수록(페르미레벨에서 먼 에너지대역일수록), kT가 작을수록 두 식의 오차는 작아진다.

 이제 위에서 구한 결과를 이용해 전자의 농도의 에너지 분포를 그래프로 구하려면 D*(페르미-디락 분포) or N_C*(맥스웰 볼츠만 근사)이다. 각각의 경우를 그래프로 그려보면 다음과 같다.
  

에너지에 따른 전자 농도(FD)
에너지에 따른 전자 농도(MB)


두 식으로 구한 값의 오차를 확인해 보면 다음과 같다.

 

전자 농도 오차


오차는 대략 10^50~10^54 정도로 매우 큰 것을 알 수 있다.
그 이유를 생각해보면 맥스웰-볼츠만 근사의 전자 농도 구할 때 N_C(유효상태밀도)를 곱하여 구하게 되는데 N_C는 온도에 따라 정해지는 상수로써 페르미-디락 분포를 사용해 전자농도를 구할 때(D*f(E))와는 다르게 에너지에 따른 차이를 고려할 수 없는 점이 오차를 크게 만든 것 같다.


Tool : python3(numpy, matplotlib.pyplot 라이브러리 사용)
Code
import numpy as np
import matplotlib.pyplot as plt

# 주어진 상수들
h = 6.62607015e-34  # 플랑크 상수, 단위: J·s
m_0 = 9.019e-31  # 전자의 질량, 단위: kg
m_star = 1.08 * m_0  # 유효 질량
kT = 0.02585  # 상온에서의 kT, 단위: eV
N_C = 4*np.sqrt(2)*(np.pi*m_star*kT)**(3/2)/(h**3)  #유효상태밀도

# 에너지 범위 설정 (10 mV to 150 mV)
E_range = np.linspace(0.01, 0.15, 1000)  # 단위: eV

def fermi_dirac_distribution(E_kin, E_F):
    return 1 / (1 + np.exp((E_kin + E_F) / kT))

def maxwell_boltzmann_distribution(E_kin, E_F):
    return np.exp(-(E_kin + E_F) / kT)

# 페르미 레벨에 대한 에너지 차이 설정
E_F_diffs = np.array([10, 5, 0]) * kT

# 전자 상태가 채워질 확률
FD_distributions = [fermi_dirac_distribution(E_range, E_F_diff) for E_F_diff in E_F_diffs]
MB_distributions = [maxwell_boltzmann_distribution(E_range, E_F_diff) for E_F_diff in E_F_diffs]

# 그래프를 그리기 위한 함수
def plot_distribution(E_range, distributions, E_F_diffs, title):
    plt.figure(figsize=(10, 6))
    labels = [f'E_C - E_F = {E_F_diff/kT:.1f} kT' for E_F_diff in E_F_diffs]
    for distribution, label in zip(distributions, labels):
        plt.semilogy(E_range, distribution, label=label)
    plt.xlabel('Energy (eV)')
    plt.ylabel('State Probability') 
    plt.title(title)
    plt.legend()
    plt.show()

# 페르미-디락 분포 그래프
plot_distribution(E_range, FD_distributions, E_F_diffs, 'Fermi-Dirac Distribution')

# 맥스웰-볼츠만 분포 그래프
plot_distribution(E_range, MB_distributions, E_F_diffs, 'Maxwell-Boltzmann Distribution')

# 오차율 계산 및 그래프 플롯
def plot_error_rate(E_range, FD_distributions, MB_distributions, E_F_diffs):
    plt.figure(figsize=(10, 6))
    labels = [f'E_C - E_F = {E_F_diff/kT:.1f} kT' for E_F_diff in E_F_diffs]
    
    for FD, MB, label in zip(FD_distributions, MB_distributions, labels):
        error_rate = np.abs(FD - MB)
        plt.semilogy(E_range, error_rate, label=label)
    
    plt.xlabel('Energy (eV)')
    plt.ylabel('Error Rate')
    plt.title('Error Rate between FD and MB Distributions')
    plt.legend()
    plt.show()

plot_error_rate(E_range, FD_distributions, MB_distributions, E_F_diffs)

# 상태 밀도
def density_of_states(E_kin):
    return 8 * np.sqrt(2 * np.pi) / (h**3) * (m_star)**(3/2) * np.sqrt(E_kin)

# 전자의 농도의 에너지 분포를 계산하는 함수
def electron_concentration_FD(E_kin, E_F):
    D = density_of_states(E_kin)
    FD = fermi_dirac_distribution(E_kin, E_F)
    return D * FD

def electron_concentration_MB(E_kin, E_F):
    MB = maxwell_boltzmann_distribution(E_kin, E_F)
    return N_C * MB

# 전자 농도의 에너지 분포 계산
electron_concentrations_FD = [electron_concentration_FD(E_range, E_F_diff) for E_F_diff in E_F_diffs]
electron_concentrations_MB = [electron_concentration_MB(E_range, E_F_diff) for E_F_diff in E_F_diffs]

# 전자 농도의 에너지 분포를 그래프로 나타내는 함수
def plot_electron_concentration(E_range, concentrations, E_F_diffs, title):
    plt.figure(figsize=(10, 6))
    labels = [f'E_C - E_F = {E_F_diff/kT:.1f} kT' for E_F_diff in E_F_diffs]
    for concentration, label in zip(concentrations, labels):
        plt.semilogy(E_range, concentration, label=label)
    plt.xlabel('Energy (eV)')
    plt.ylabel('Electron Concentration (log scale)')
    plt.title(title)
    plt.legend()
    plt.show()

# 전자 농도의 에너지 분포 그래프
plot_electron_concentration(E_range, electron_concentrations_FD, E_F_diffs, 'Electron Concentration of FD')
plot_electron_concentration(E_range, electron_concentrations_MB, E_F_diffs, 'Electron Concentration of MB')

#전자 농도의 에너지 분포 오차 그래프로 나타내는 함수
def plot_error_rate_conc(E_range, FD_conc, MB_conc, E_F_diffs):
    plt.figure(figsize=(10, 6))
    labels = [f'E_C - E_F = {E_F_diff/kT:.1f} kT' for E_F_diff in E_F_diffs]
    for FD, MB, label in zip(FD_conc, MB_conc, labels):
        error_rate = np.abs(FD - MB)
        plt.semilogy(E_range, error_rate, label=label)
    plt.xlabel('Energy (eV)')
    plt.ylabel('Error Rate (log scale)')
    plt.title('Error Rate between FD and MB Concentrations')
    plt.legend()
    plt.show()

plot_error_rate_conc(E_range, electron_concentrations_FD, electron_concentrations_MB, E_F_diffs)