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하면 다음과 같다.
위에서 구한 페르미-디락 분포와 맥스웰-볼츠만 근사식으로 구한 전자 상태가 채워질 확률의 차이를 그래프로 표시하면 다음과 같다.
그래프를 보면 페르미-디락 분포와 맥스웰-볼츠만 근사식의 오차는 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*(맥스웰 볼츠만 근사)이다. 각각의 경우를 그래프로 그려보면 다음과 같다.
두 식으로 구한 값의 오차를 확인해 보면 다음과 같다.
오차는 대략 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)