バンド理論入門 - なぜ金属は導電性があり、絶縁体にはないのか
この章を完了すると、以下を説明できるようになります:
銅線は電気を通すのに、なぜゴムは電気を通さないのでしょうか?どちらも原子から構成されているのに、この違いはどこから来るのでしょう。
この単純な疑問に答えるために、物理学者たちは20世紀前半に「バンド理論」を確立しました。この理論は材料科学の最も重要な基礎理論の一つであり、以下を説明できます:
バンド理論の基礎は1920年代にFelix BlochとRudolf Peierlsによって築かれました。1930年代にはWilson、Brillouin、Wannierらがこれを発展させ、固体の電子構造を記述する普遍的な枠組みを確立しました。この理論は半導体革命(トランジスタの発明、1947年)を支える理論的基盤となりました。
古典物理学(19世紀)では、電子を自由に動き回る粒子として扱うDrudeモデル(1900年)が提案されました。このモデルは導電性をある程度説明できましたが、以下の重大な問題がありました:
| 現象 | Drudeモデルの予測 | 実験結果 |
|---|---|---|
| 比熱への電子の寄与 | 大きい(3/2 Nk_B) | 非常に小さい(~0.01 Nk_B) |
| 絶縁体の存在 | 説明不可 | 明確に存在 |
| 半導体の温度依存性 | 金属と同じ | 全く異なる(指数関数的) |
これらの矛盾を解決するには、量子力学と結晶の周期的構造を考慮する必要があることが明らかになりました。
量子力学の基本原理(de Broglie、1924)によれば、すべての粒子は波としての性質を持ちます:
電子のような軽い粒子では、この波長が原子間距離(~数Å)と同程度になるため、波としての性質が顕著に現れます。
1次元の「箱」(長さ L)に閉じ込められた電子を考えます。シュレーディンガー方程式を解くと、エネルギーは離散的な値しか取れません:
ここで重要なポイント:
現実の金属を体積 V = L³ の箱と考えると、電子の状態は3つの量子数 (n_x, n_y, n_z) で指定されます:
この式は、エネルギー E を持つ状態が3次元の n-空間で半径 R = √(n_x² + n_y² + n_z²) の球面上に分布することを意味します。
金属中の電子はフェルミ粒子(パウリの排他原理に従う)であり、1つの量子状態には最大2個(スピン↑↓)しか入れません。
N 個の電子が最低エネルギー状態から順に詰まっていくと、絶対零度(T=0K)で最も高いエネルギーを持つ電子のエネルギーをフェルミエネルギー E_Fと呼びます:
ここで n = N/V は電子密度です。
銅(Cu)の場合:
室温(300K)は T_F の 0.4% にすぎません。これが電子の比熱が小さい理由です。熱的に励起される電子は全体のごく一部(~T/T_F)だけなのです。
エネルギー E から E+dE の範囲に何個の量子状態があるかを示す関数を状態密度 D(E)といいます。自由電子モデルでは:
重要な特徴:
状態密度は材料の物性を理解する上で極めて重要です。電気伝導度、比熱、磁化率など、多くの物理量は D(E_F)(フェルミエネルギーでの状態密度)に比例します。
import numpy as np
import matplotlib.pyplot as plt
from scipy import constants
# 物理定数
hbar = constants.hbar # 換算プランク定数 (J·s)
m_e = constants.m_e # 電子質量 (kg)
e = constants.e # 電気素量 (C)
def fermi_energy(n):
"""
自由電子モデルでのフェルミエネルギーを計算
Args:
n (float): 電子密度 [m^-3]
Returns:
float: フェルミエネルギー [eV]
"""
E_F = (hbar**2 / (2 * m_e)) * (3 * np.pi**2 * n)**(2/3)
return E_F / e # JをeVに変換
# 典型的な金属の電子密度
metals = {
'Li': 4.70e28, # リチウム
'Na': 2.65e28, # ナトリウム
'Cu': 8.45e28, # 銅
'Ag': 5.85e28, # 銀
'Au': 5.90e28 # 金
}
print("金属のフェルミエネルギー")
print("-" * 40)
for metal, n in metals.items():
E_F = fermi_energy(n)
T_F = E_F * e / constants.k # フェルミ温度 [K]
print(f"{metal:3s}: E_F = {E_F:5.2f} eV, T_F = {T_F/1000:5.1f} × 10³ K")
# 出力例:
# 金属のフェルミエネルギー
# ----------------------------------------
# Li : E_F = 4.74 eV, T_F = 55.0 × 10³ K
# Na : E_F = 3.24 eV, T_F = 37.6 × 10³ K
# Cu : E_F = 7.00 eV, T_F = 81.2 × 10³ K
# Ag : E_F = 5.49 eV, T_F = 63.7 × 10³ K
# Au : E_F = 5.53 eV, T_F = 64.2 × 10³ K
def density_of_states(E, V):
"""
3次元自由電子の状態密度
Args:
E (array): エネルギー [J]
V (float): 体積 [m^3]
Returns:
array: 状態密度 [J^-1 m^-3]
"""
factor = V / (2 * np.pi**2) * (2 * m_e / hbar**2)**(3/2)
DOS = factor * np.sqrt(E)
return DOS
# 銅のパラメータ
n_Cu = 8.45e28 # m^-3
E_F_Cu = fermi_energy(n_Cu) * e # J
V = 1e-6 # 1 mm³
# エネルギー範囲(0から2E_Fまで)
E = np.linspace(0.01 * E_F_Cu, 2 * E_F_Cu, 1000)
DOS = density_of_states(E, V)
# プロット
plt.figure(figsize=(10, 6))
plt.plot(E / e, DOS * e, 'b-', linewidth=2, label='D(E)')
plt.axvline(E_F_Cu / e, color='r', linestyle='--', linewidth=2, label=f'E_F = {E_F_Cu/e:.2f} eV')
plt.fill_between(E / e, 0, DOS * e, where=(E <= E_F_Cu), alpha=0.3, color='blue', label='占有状態 (T=0K)')
plt.xlabel('Energy (eV)', fontsize=12)
plt.ylabel('Density of States (eV⁻¹ mm⁻³)', fontsize=12)
plt.title('3D Free Electron Model: Density of States', fontsize=14, fontweight='bold')
plt.legend(fontsize=11)
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()
# 絶対零度での全電子数を検証
occupied_DOS = DOS[E <= E_F_Cu]
dE = E[1] - E[0]
N_electrons = 2 * np.sum(occupied_DOS) * dE # 因子2はスピン
print(f"計算された電子数: {N_electrons:.2e}")
print(f"期待値 (n×V): {n_Cu * V:.2e}")
# 両者は一致するはず
def fermi_dirac(E, E_F, T):
"""
フェルミ-ディラック分布関数
Args:
E (array): エネルギー [J]
E_F (float): フェルミエネルギー [J]
T (float): 温度 [K]
Returns:
array: 占有確率 [0, 1]
"""
if T == 0:
return (E <= E_F).astype(float)
else:
k_B = constants.k
return 1 / (1 + np.exp((E - E_F) / (k_B * T)))
# 銅の場合
E = np.linspace(0, 2 * E_F_Cu, 1000)
temperatures = [0, 300, 1000, 3000, 10000] # K
plt.figure(figsize=(12, 5))
# (a) フェルミ-ディラック分布
plt.subplot(1, 2, 1)
for T in temperatures:
f = fermi_dirac(E, E_F_Cu, T)
label = f'T = {T} K' if T > 0 else 'T = 0 K'
plt.plot(E / e, f, linewidth=2, label=label)
plt.xlabel('Energy (eV)', fontsize=12)
plt.ylabel('Occupation Probability f(E)', fontsize=12)
plt.title('Fermi-Dirac Distribution', fontsize=14, fontweight='bold')
plt.axvline(E_F_Cu / e, color='k', linestyle='--', alpha=0.5)
plt.legend(fontsize=10)
plt.grid(alpha=0.3)
# (b) 有効的に励起される電子(T > 0で変化する部分)
plt.subplot(1, 2, 2)
E_range = np.linspace(E_F_Cu - 0.5*e, E_F_Cu + 0.5*e, 500)
for T in [300, 1000, 3000]:
f = fermi_dirac(E_range, E_F_Cu, T)
thermal_width = 2 * constants.k * T / e # ~k_B T のエネルギー幅
plt.plot(E_range / e, f, linewidth=2, label=f'T = {T} K (Δ ≈ {thermal_width*1000:.1f} meV)')
plt.xlabel('Energy (eV)', fontsize=12)
plt.ylabel('Occupation Probability f(E)', fontsize=12)
plt.title('Thermal Broadening near E_F', fontsize=14, fontweight='bold')
plt.axvline(E_F_Cu / e, color='k', linestyle='--', alpha=0.5)
plt.axhline(0.5, color='gray', linestyle=':', alpha=0.5)
plt.legend(fontsize=10)
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()
# 室温での励起される電子の割合
T_room = 300 # K
thermal_energy = constants.k * T_room
fraction = T_room / (E_F_Cu / constants.k)
print(f"\n室温({T_room} K)での解析:")
print(f"熱エネルギー k_B T ≈ {thermal_energy/e*1000:.1f} meV")
print(f"フェルミエネルギー E_F = {E_F_Cu/e:.2f} eV")
print(f"励起される電子の割合: ~{fraction*100:.2f}%")
自由電子モデルは多くの定性的予測に成功しますが、以下は説明できません:
これらを理解するには、結晶の周期的ポテンシャルを考慮する必要があります。
結晶中の電子は、規則正しく配列した原子核が作る周期的なポテンシャル中を運動します。この周期性が電子のエネルギー構造に劇的な変化をもたらします。
孤立した原子では電子は離散的なエネルギー準位(1s, 2s, 2p, ...)を持ちます。N個の原子が集まって結晶を作ると:
周期的ポテンシャル V(r + R) = V(r) 中のシュレーディンガー方程式の解は、Bloch関数という特別な形を取ります:
ここで:
エネルギーはkとnに依存します:E = E_n(k)
1次元の単純な例(格子定数 a)を考えると、波数 k は第一ブリルアンゾーン -π/a ≤ k ≤ π/a の範囲で物理的に独立です。
ブリルアンゾーンの境界(k = ±π/a)で何が起こるか?
自由電子では E ∝ k² と滑らかに変化しますが、周期ポテンシャルがあると:
最も単純な「ほぼ自由電子近似」では、周期ポテンシャルを弱い摂動として扱うと、分散関係は次のように変化します:
ここで V_G は周期ポテンシャルのフーリエ成分、G は逆格子ベクトルです。
def band_structure_1d(k, a, V_G):
"""
1次元ほぼ自由電子モデルのバンド構造
Args:
k (array): 波数 [m^-1]
a (float): 格子定数 [m]
V_G (float): 周期ポテンシャル [J]
Returns:
tuple: (E_lower, E_upper) 下側と上側のバンド [J]
"""
E_free = (hbar * k)**2 / (2 * m_e) # 自由電子
# ブリルアンゾーン境界でのギャップ
G = 2 * np.pi / a
gap = 2 * V_G
# 摂動を含むバンド構造(簡略化)
cos_term = np.cos(k * a)
E_lower = E_free - V_G * np.abs(cos_term)
E_upper = E_free + V_G * np.abs(cos_term)
return E_lower, E_upper
# パラメータ
a = 3e-10 # 3 Å の格子定数
V_G = 2 * e # 2 eV のポテンシャル
# 第一ブリルアンゾーン
k = np.linspace(-np.pi/a, np.pi/a, 500)
E_lower, E_upper = band_structure_1d(k, a, V_G)
# 自由電子(比較用)
E_free = (hbar * k)**2 / (2 * m_e)
# プロット
plt.figure(figsize=(10, 7))
plt.plot(k * a / np.pi, E_free / e, 'k--', linewidth=1.5, alpha=0.5, label='Free electron')
plt.plot(k * a / np.pi, E_lower / e, 'b-', linewidth=2.5, label='Lower band')
plt.plot(k * a / np.pi, E_upper / e, 'r-', linewidth=2.5, label='Upper band')
# バンドギャップ領域を強調
k_gap = np.pi / a
E_gap_lower = band_structure_1d(np.array([k_gap]), a, V_G)[0][0] / e
E_gap_upper = band_structure_1d(np.array([k_gap]), a, V_G)[1][0] / e
plt.fill_between([-1, 1], E_gap_lower, E_gap_upper, alpha=0.2, color='gray', label='Band gap')
plt.xlabel('Wave vector k (π/a)', fontsize=12)
plt.ylabel('Energy (eV)', fontsize=12)
plt.title('1D Band Structure: Nearly Free Electron Model', fontsize=14, fontweight='bold')
plt.axhline(0, color='k', linewidth=0.5)
plt.axvline(-1, color='k', linewidth=0.5, linestyle=':')
plt.axvline(1, color='k', linewidth=0.5, linestyle=':')
plt.text(0.7, E_gap_upper + 0.5, f'Band gap\n~{(E_gap_upper - E_gap_lower):.2f} eV', fontsize=10, ha='center')
plt.legend(fontsize=11, loc='upper right')
plt.grid(alpha=0.3)
plt.xlim(-1, 1)
plt.tight_layout()
plt.show()
バンド構造 E_n(k) が与えられたとき、エネルギー E での状態密度は:
実際の計算では、等エネルギー面 E_n(k) = E の面積を計算します。
自由電子の D(E) ∝ √E とは異なり、バンド構造を持つ系では:
def dos_from_band(E_array, E_band, V):
"""
バンド構造から状態密度を計算(ヒストグラム法)
Args:
E_array (array): エネルギー軸 [J]
E_band (array): バンドのエネルギー [J](1Dの場合はk点の配列)
V (float): 体積 [m^3]
Returns:
array: 状態密度 [J^-1 m^-3]
"""
hist, bin_edges = np.histogram(E_band, bins=E_array, density=False)
dE = E_array[1] - E_array[0]
# 1Dの場合の規格化(実際には3Dで異なる)
DOS = hist / (dE * V) * 2 # スピン因子2
return DOS
# 1次元バンド構造の例
k = np.linspace(-np.pi/a, np.pi/a, 10000)
E_lower, E_upper = band_structure_1d(k, a, V_G)
# エネルギー軸
E_axis = np.linspace(-2*e, 20*e, 500)
# 各バンドのDOSを計算
DOS_lower = dos_from_band(E_axis, E_lower, 1e-9)
DOS_upper = dos_from_band(E_axis, E_upper, 1e-9)
DOS_total = DOS_lower + DOS_upper
# プロット
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
# (a) バンド構造
ax1.plot(k * a / np.pi, E_lower / e, 'b-', linewidth=2.5, label='Lower band')
ax1.plot(k * a / np.pi, E_upper / e, 'r-', linewidth=2.5, label='Upper band')
ax1.set_xlabel('Wave vector k (π/a)', fontsize=12)
ax1.set_ylabel('Energy (eV)', fontsize=12)
ax1.set_title('(a) Band Structure', fontsize=13, fontweight='bold')
ax1.legend(fontsize=11)
ax1.grid(alpha=0.3)
ax1.set_xlim(-1, 1)
# (b) 状態密度
E_plot = E_axis / e
ax2.plot(DOS_total * e, E_plot, 'k-', linewidth=2.5, label='Total DOS')
ax2.fill_betweenx(E_plot, 0, DOS_total * e, alpha=0.3, color='blue')
ax2.set_xlabel('Density of States (arb. units)', fontsize=12)
ax2.set_ylabel('Energy (eV)', fontsize=12)
ax2.set_title('(b) Density of States', fontsize=13, fontweight='bold')
ax2.axhline(E_gap_lower, color='gray', linestyle='--', alpha=0.5)
ax2.axhline(E_gap_upper, color='gray', linestyle='--', alpha=0.5)
ax2.text(0.7 * np.max(DOS_total * e), (E_gap_lower + E_gap_upper) / 2,
'Band gap\n(D=0)', fontsize=10, ha='center', va='center',
bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))
ax2.legend(fontsize=11)
ax2.grid(alpha=0.3)
ax2.set_ylim(E_plot[0], E_plot[-1])
plt.tight_layout()
plt.show()
材料の導電性は、フェルミエネルギー E_F がバンド構造のどこに位置するかで決まります。
| 材料タイプ | バンド占有 | バンドギャップ | 導電性(室温) | 典型例 |
|---|---|---|---|---|
| 金属 | 価電子帯が部分的に占有 または複数バンドが重複 |
なし(または負) | 10⁴-10⁶ S/cm | Cu, Al, Na |
| 半導体 | 価電子帯が完全に占有 伝導帯は空 |
小さい(0.1-3 eV) | 10⁻⁶-10² S/cm | Si, GaAs, GaN |
| 絶縁体 | 価電子帯が完全に占有 伝導帯は空 |
大きい(>3 eV) | <10⁻¹⁰ S/cm | SiO₂, Al₂O₃ |
金属では:
Na原子は電子配置 [Ne] 3s¹ を持ちます。結晶中では:
絶縁体(例: ダイヤモンド)では:
半導体は絶縁体と似た構造ですが、バンドギャップが小さい(Si: 1.1 eV, GaAs: 1.4 eV)ため:
シリコン(T = 300 K):
ドーピング(例: 10¹⁶ cm⁻³ のリン)により、キャリア密度を100万倍に増やせます。
def plot_band_occupation():
"""
金属・半導体・絶縁体のバンド占有状態を可視化
"""
fig, axes = plt.subplots(1, 3, figsize=(15, 6))
E_range = np.linspace(-3, 3, 100)
# (a) 金属
ax = axes[0]
# 重なったバンド
ax.fill_between([-1, 1], -2, 0, alpha=0.6, color='blue', label='Valence band (filled)')
ax.fill_between([-1, 1], 0, 2, alpha=0.3, color='blue', label='Conduction band (partial)')
ax.axhline(0.5, color='red', linewidth=2, linestyle='--', label='Fermi level (E_F)')
ax.text(0, 0.7, 'E_F', fontsize=12, color='red', ha='center', fontweight='bold')
ax.set_ylim(-3, 3)
ax.set_xlim(-1.5, 1.5)
ax.set_ylabel('Energy (eV)', fontsize=12)
ax.set_title('(a) Metal', fontsize=13, fontweight='bold')
ax.legend(fontsize=9, loc='upper right')
ax.grid(alpha=0.3)
ax.set_xticks([])
# (b) 半導体
ax = axes[1]
ax.fill_between([-1, 1], -2, -0.5, alpha=0.6, color='blue', label='Valence band (filled)')
ax.fill_between([-1, 1], 0.5, 2, alpha=0.3, color='lightblue', label='Conduction band (empty)')
ax.axhline(0, color='red', linewidth=2, linestyle='--', label='Fermi level (E_F)')
ax.text(0, 0.15, 'E_F', fontsize=12, color='red', ha='center', fontweight='bold')
# バンドギャップ
ax.annotate('', xy=(1.2, -0.5), xytext=(1.2, 0.5),
arrowprops=dict(arrowstyle='<->', color='black', lw=2))
ax.text(1.5, 0, 'E_g\n~1 eV', fontsize=11, va='center', ha='left')
ax.set_ylim(-3, 3)
ax.set_xlim(-1.5, 1.8)
ax.set_title('(b) Semiconductor', fontsize=13, fontweight='bold')
ax.legend(fontsize=9, loc='upper right')
ax.grid(alpha=0.3)
ax.set_xticks([])
ax.set_yticks([])
# (c) 絶縁体
ax = axes[2]
ax.fill_between([-1, 1], -2, -1, alpha=0.6, color='blue', label='Valence band (filled)')
ax.fill_between([-1, 1], 2, 3, alpha=0.3, color='lightblue', label='Conduction band (empty)')
ax.axhline(0.5, color='red', linewidth=2, linestyle='--', label='Fermi level (E_F)')
ax.text(0, 0.7, 'E_F', fontsize=12, color='red', ha='center', fontweight='bold')
# バンドギャップ
ax.annotate('', xy=(1.2, -1), xytext=(1.2, 2),
arrowprops=dict(arrowstyle='<->', color='black', lw=2))
ax.text(1.5, 0.5, 'E_g\n>3 eV', fontsize=11, va='center', ha='left')
ax.set_ylim(-3, 3.5)
ax.set_xlim(-1.5, 1.8)
ax.set_title('(c) Insulator', fontsize=13, fontweight='bold')
ax.legend(fontsize=9, loc='upper right')
ax.grid(alpha=0.3)
ax.set_xticks([])
ax.set_yticks([])
plt.tight_layout()
plt.show()
plot_band_occupation()
3次元のk空間(波数空間、逆格子空間とも呼ぶ)で、E_n(k) = E_F を満たす点の集合をフェルミ面と呼びます。
なぜ重要か:
自由電子モデルでは E = ℏ²k²/(2m) なので、E = E_F を満たすkは:
つまり、フェルミ面は半径 k_F の球です(フェルミ球)。
結晶の周期ポテンシャルにより、フェルミ面は球から歪みます:
def fermi_surface_2d():
"""
2次元の簡単なバンド構造からフェルミ面を計算
"""
# 2次元グリッド
kx = np.linspace(-np.pi/a, np.pi/a, 200)
ky = np.linspace(-np.pi/a, np.pi/a, 200)
KX, KY = np.meshgrid(kx, ky)
# 簡単なバンド構造(tight-binding model)
t = 2 * e # hopping parameter
E = -2 * t * (np.cos(KX * a) + np.cos(KY * a))
# いくつかのフェルミエネルギーでのフェルミ面
E_F_values = [-3*t, -2*t, 0, 2*t]
fig, axes = plt.subplots(2, 2, figsize=(12, 12))
axes = axes.flatten()
for idx, E_F in enumerate(E_F_values):
ax = axes[idx]
# バンド構造のコンター
contour = ax.contourf(KX*a/np.pi, KY*a/np.pi, E/t, levels=50, cmap='RdBu_r', alpha=0.7)
# フェルミ面(E = E_F の等高線)
ax.contour(KX*a/np.pi, KY*a/np.pi, E/t, levels=[E_F/t], colors='black', linewidths=3)
# ブリルアンゾーン境界
ax.plot([-1, 1, 1, -1, -1], [-1, -1, 1, 1, -1], 'k--', linewidth=2, alpha=0.5)
ax.set_xlabel('k_x (π/a)', fontsize=11)
ax.set_ylabel('k_y (π/a)', fontsize=11)
ax.set_title(f'E_F = {E_F/t:.1f}t', fontsize=12, fontweight='bold')
ax.set_aspect('equal')
ax.grid(alpha=0.3)
# カラーバー
plt.colorbar(contour, ax=ax, label='E/t')
plt.suptitle('Fermi Surface Evolution in 2D Tight-Binding Model',
fontsize=14, fontweight='bold', y=0.995)
plt.tight_layout()
plt.show()
fermi_surface_2d()
from mpl_toolkits.mplot3d import Axes3D
def fermi_surface_3d_sphere():
"""
自由電子のフェルミ面(球)を3Dプロット
"""
# 銅の例
n_Cu = 8.45e28 # m^-3
k_F = (3 * np.pi**2 * n_Cu)**(1/3)
# 球面パラメータ
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
kx = k_F * np.outer(np.cos(u), np.sin(v))
ky = k_F * np.outer(np.sin(u), np.sin(v))
kz = k_F * np.outer(np.ones(np.size(u)), np.cos(v))
# プロット
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(kx * 1e-10, ky * 1e-10, kz * 1e-10,
color='cyan', alpha=0.6, edgecolor='navy', linewidth=0.1)
# ブリルアンゾーン境界(立方体)
G = np.pi / a
# 立方体のエッジを描画
for i in [-1, 1]:
for j in [-1, 1]:
ax.plot([i*G*1e-10, i*G*1e-10], [j*G*1e-10, j*G*1e-10],
[-G*1e-10, G*1e-10], 'k--', alpha=0.3)
ax.plot([i*G*1e-10, i*G*1e-10], [-G*1e-10, G*1e-10],
[j*G*1e-10, j*G*1e-10], 'k--', alpha=0.3)
ax.plot([-G*1e-10, G*1e-10], [i*G*1e-10, i*G*1e-10],
[j*G*1e-10, j*G*1e-10], 'k--', alpha=0.3)
ax.set_xlabel('k_x (Å⁻¹)', fontsize=12)
ax.set_ylabel('k_y (Å⁻¹)', fontsize=12)
ax.set_zlabel('k_z (Å⁻¹)', fontsize=12)
ax.set_title('Fermi Surface of Copper (Free Electron Approximation)',
fontsize=14, fontweight='bold')
# 等方的なアスペクト比
max_range = G * 1e-10
ax.set_xlim([-max_range, max_range])
ax.set_ylim([-max_range, max_range])
ax.set_zlim([-max_range, max_range])
plt.tight_layout()
plt.show()
print(f"銅のフェルミ波数: k_F = {k_F:.2e} m⁻¹ = {k_F*1e-10:.2f} Å⁻¹")
fermi_surface_3d_sphere()
フェルミ面の幾何学的性質が物性に直結します:
| フェルミ面の特徴 | 物理的影響 | 典型例 |
|---|---|---|
| 球形に近い | 等方的な導電性 | Cu, Al |
| 楕円体 | 異方的な導電性 | Bi(結晶方向で100倍の差) |
| ネスティング (並行な部分) |
電荷密度波、超伝導 | 層状化合物 |
| トポロジカルな変化 | Lifshitz転移 | 圧力下の金属 |
最も直接的にバンド構造を測定できる手法:
これにより、超伝導ギャップ(~1 meV)や電荷秩序の形成過程まで観測可能。
半導体のバンドギャップは光学吸収で精密に測定できます:
ここで α は吸収係数、ω は光の角振動数です。
def optical_absorption(photon_energy, E_g, A=1.0, indirect=False):
"""
半導体の光学吸収係数を計算
Args:
photon_energy (array): 光子エネルギー [eV]
E_g (float): バンドギャップ [eV]
A (float): 比例定数
indirect (bool): 間接遷移の場合True
Returns:
array: 吸収係数 [任意単位]
"""
alpha = np.zeros_like(photon_energy)
above_gap = photon_energy > E_g
if indirect:
# 間接遷移: α ∝ (ℏω - E_g)²
alpha[above_gap] = A * (photon_energy[above_gap] - E_g)**2
else:
# 直接遷移: α ∝ √(ℏω - E_g)
alpha[above_gap] = A * np.sqrt(photon_energy[above_gap] - E_g)
return alpha
# 典型的な半導体のパラメータ
semiconductors = {
'GaN': {'E_g': 3.4, 'type': 'direct'},
'Si': {'E_g': 1.12, 'type': 'indirect'},
'GaAs': {'E_g': 1.42, 'type': 'direct'},
'Ge': {'E_g': 0.66, 'type': 'indirect'}
}
# プロット
photon_energy = np.linspace(0, 4, 500)
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
axes = axes.flatten()
for idx, (name, params) in enumerate(semiconductors.items()):
ax = axes[idx]
E_g = params['E_g']
indirect = (params['type'] == 'indirect')
alpha = optical_absorption(photon_energy, E_g, A=1.0, indirect=indirect)
ax.plot(photon_energy, alpha, 'b-', linewidth=2.5)
ax.axvline(E_g, color='r', linestyle='--', linewidth=2, label=f'E_g = {E_g:.2f} eV')
ax.fill_between(photon_energy, 0, alpha, where=(photon_energy > E_g), alpha=0.3, color='blue')
ax.set_xlabel('Photon Energy (eV)', fontsize=11)
ax.set_ylabel('Absorption Coefficient α (arb. units)', fontsize=11)
ax.set_title(f'{name} ({params["type"]} gap)', fontsize=12, fontweight='bold')
ax.legend(fontsize=10)
ax.grid(alpha=0.3)
ax.set_xlim(0, 4)
ax.set_ylim(0, np.max(alpha) * 1.1)
plt.suptitle('Optical Absorption Spectra of Semiconductors', fontsize=14, fontweight='bold')
plt.tight_layout()
plt.show()
# Tauc plotによるバンドギャップ決定(実験データ解析法)
fig, ax = plt.subplots(figsize=(10, 6))
for name, params in semiconductors.items():
E_g = params['E_g']
indirect = (params['type'] == 'indirect')
alpha = optical_absorption(photon_energy, E_g, A=1.0, indirect=indirect)
# Tauc plot: (αhν)^(1/n) vs hν (n=1/2 for direct, n=2 for indirect)
if indirect:
y_axis = (alpha * photon_energy)**0.5 # (αhν)^1/2
else:
y_axis = (alpha * photon_energy)**2 # (αhν)^2
ax.plot(photon_energy, y_axis, linewidth=2, label=name)
ax.axvline(E_g, linestyle=':', alpha=0.5)
ax.set_xlabel('Photon Energy (eV)', fontsize=12)
ax.set_ylabel('(αhν)^n (arb. units)', fontsize=12)
ax.set_title('Tauc Plot for Band Gap Determination', fontsize=14, fontweight='bold')
ax.legend(fontsize=11)
ax.grid(alpha=0.3)
ax.set_xlim(0, 4)
plt.tight_layout()
plt.show()
print("\n💡 Tauc plotの使い方:")
print("グラフの立ち上がり部分を直線外挿してx軸との交点を求めると、")
print("それがバンドギャップ E_g に対応します。")
de Haas-van Alphen効果は、強磁場中で磁化が振動する現象で、フェルミ面の断面積を精密に測定できます:
この方法で、フェルミ面のトポロジー、有効質量、散乱率などを決定できます。
このchapterを完了したあなたは、以下を説明できるようになりました:
Q1: フェルミエネルギーの定義として最も適切なものはどれですか?
a) 金属中の電子の平均エネルギー
b) 絶対零度で最もエネルギーの高い電子が持つエネルギー
c) 伝導帯の最低エネルギー
d) バンドギャップの中央のエネルギー
正解: b) 絶対零度で最もエネルギーの高い電子が持つエネルギー
解説:
フェルミエネルギー E_F は、T=0K で電子が最低エネルギー状態から順に詰まっていったとき、最も高いエネルギーを持つ電子のエネルギーです。フェルミ粒子(電子)はパウリの排他原理に従うため、1つの状態に最大2個(スピン↑↓)しか入れません。
補足:
選択肢c)とd)は半導体や絶縁体の説明であり、金属の定義ではありません。a)の平均エネルギーは E_F よりも低い値になります(T=0Kで約3E_F/5)。
Q2: 銅(Cu)のフェルミエネルギーは約7.0 eVです。フェルミ温度 T_F は何Kですか?(k_B = 8.617 × 10⁻⁵ eV/K)
正解: 約81,000 K
計算:
T_F = E_F / k_B = 7.0 eV / (8.617 × 10⁻⁵ eV/K) ≈ 81,200 K
重要ポイント:
室温(300 K)は T_F のわずか0.4%にすぎません。これが、電子の比熱が古典論の予測(3/2 Nk_B)よりはるかに小さい理由です。実際に熱的に励起される電子は、フェルミエネルギー近傍のごく一部(~kT の範囲内)だけです。
Q3: 金属と絶縁体のバンド構造の違いを説明してください。
正解例:
キーポイント:
金属か絶縁体かは、バンドの形ではなく「バンドがどこまで電子で埋まっているか」で決まります。同じバンド構造でも電子数が異なれば性質が変わります。
Q4: シリコン(Si)のバンドギャップは 1.12 eV です。可視光(波長 400-700 nm)を吸収できますか?計算して説明してください。(h = 4.136 × 10⁻¹⁵ eV·s, c = 3 × 10⁸ m/s)
結論: 可視光の一部(青〜紫)は吸収できるが、赤色は吸収できない
計算:
光子エネルギー E = hc/λ より:
E_g = 1.12 eV なので:
実用上の意味:
これがSiが太陽電池材料として使われる理由の一つです。太陽光の主要部分(可視〜近赤外)をカバーしています。ただし、赤外線は透過するため、バンドギャップがより小さいGe(0.66 eV)やGaAs(1.42 eV)と組み合わせたタンデム型太陽電池も研究されています。
Q5: 3次元自由電子モデルで、状態密度 D(E) ∝ √E です。これがフェルミエネルギーでの電子比熱 C_v ∝ T に繋がることを定性的に説明してください。
説明:
重要な点:
Q6: Example 1のコードを修正して、アルカリ金属(Li, Na, K, Rb, Cs)の電子密度からフェルミエネルギーとフェルミ温度を計算し、プロットしてください。原子番号が増えると E_F はどう変化するか考察せよ。
コード例:
alkali_metals = {
'Li': 4.70e28,
'Na': 2.65e28,
'K': 1.40e28,
'Rb': 1.15e28,
'Cs': 0.91e28
}
names = list(alkali_metals.keys())
E_F_values = [fermi_energy(n) for n in alkali_metals.values()]
T_F_values = [E_F * e / constants.k / 1000 for E_F in E_F_values]
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))
ax1.bar(names, E_F_values, color='skyblue', edgecolor='navy', linewidth=2)
ax1.set_ylabel('Fermi Energy (eV)', fontsize=12)
ax1.set_title('Fermi Energy of Alkali Metals', fontsize=13, fontweight='bold')
ax1.grid(axis='y', alpha=0.3)
ax2.bar(names, T_F_values, color='salmon', edgecolor='darkred', linewidth=2)
ax2.set_ylabel('Fermi Temperature (10³ K)', fontsize=12)
ax2.set_title('Fermi Temperature of Alkali Metals', fontsize=13, fontweight='bold')
ax2.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.show()
考察:
Q7: 2次元材料(グラフェンなど)では、自由電子モデルの状態密度はどうなるか導出してください。3次元の D(E) ∝ √E との違いを議論せよ。
導出:
2次元の場合、波数空間は平面(k_x, k_y)。自由電子のエネルギー:
k空間での状態密度(単位面積あたり): 1/(2π)² = 1/(4π²)
エネルギー E を持つ状態は半径 k = √(2mE/ℏ²) の円周上にある。
エネルギー幅 dE に対応する k 幅: dk = (m/ℏ²k) dE
状態数: dN = [円周長 2πk] × dk × [1/(4π²)] × 2(スピン)
重要な違い:
| 次元 | D(E) | 特徴 |
|---|---|---|
| 1D | ∝ E^(-1/2) | 低エネルギーで発散 |
| 2D | = 定数 | エネルギーに依存しない |
| 3D | ∝ E^(1/2) | 高エネルギーで増加 |
物理的意味:
Q8: ダイヤモンド(C)とグラファイト(C)は同じ元素からなるのに、片方は絶縁体でもう片方は半金属です。バンド理論の観点から、この違いを生む構造的要因を説明してください。
構造の違い:
電子構造の違い:
ダイヤモンド:
グラファイト:
重要なポイント:
実用的意味:
Q9: (プログラミング課題)tight-binding モデルで、1次元鎖の最近接ホッピング積分 t を変化させたとき、バンド幅とバンドギャップがどう変化するかを計算し、プロットしてください。物理的意味を考察せよ。
コード例:
def tight_binding_1d(k, a, t, epsilon_0=0):
"""
1次元tight-bindingモデルのバンド構造
Args:
k (array): 波数
a (float): 格子定数
t (float): ホッピング積分
epsilon_0 (float): オンサイトエネルギー
Returns:
array: エネルギー
"""
return epsilon_0 - 2 * t * np.cos(k * a)
a = 3e-10 # 3 Å
k = np.linspace(-np.pi/a, np.pi/a, 500)
t_values = [0.5*e, 1.0*e, 2.0*e, 4.0*e] # eV
plt.figure(figsize=(10, 7))
for t in t_values:
E = tight_binding_1d(k, a, t)
bandwidth = np.max(E) - np.min(E)
plt.plot(k*a/np.pi, E/e, linewidth=2.5, label=f't = {t/e:.1f} eV (BW = {bandwidth/e:.2f} eV)')
plt.xlabel('Wave vector k (π/a)', fontsize=12)
plt.ylabel('Energy (eV)', fontsize=12)
plt.title('1D Tight-Binding Model: Effect of Hopping Parameter', fontsize=14, fontweight='bold')
plt.axhline(0, color='k', linewidth=0.5, linestyle='--')
plt.legend(fontsize=11)
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()
# バンド幅の t 依存性
t_range = np.linspace(0.1*e, 5*e, 50)
bandwidth = [4*t for t in t_range] # BW = 4t (理論値)
plt.figure(figsize=(8, 6))
plt.plot(t_range/e, np.array(bandwidth)/e, 'b-', linewidth=3)
plt.xlabel('Hopping parameter t (eV)', fontsize=12)
plt.ylabel('Bandwidth (eV)', fontsize=12)
plt.title('Bandwidth vs Hopping Parameter', fontsize=14, fontweight='bold')
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()
print("📊 解析結果:")
print(f"バンド幅 = 4t (t が大きいほどバンドが広がる)")
print(f"物理的意味: t が大きい → 電子の波動関数が隣接サイトと強く重なる")
print(f" → 電子が結晶中を移動しやすい(有効質量 m* ∝ 1/t)")
考察:
Q10: (発展問題)Mott絶縁体は、バンド理論では金属と予測されるが実際は絶縁体です(例: NiO, La₂CuO₄)。この現象をバンド理論の枠組みだけでは説明できない理由を調べ、電子相関の役割について簡潔にまとめてください。
Mott絶縁体とは:
バンド理論が失敗する理由:
相図(U vs W):
動的平均場理論(DMFT)の成功:
実用的重要性:
結論:
バンド理論は多くの材料を理解する強力な枠組みですが、電子相関が強い系(遷移金属酸化物、f電子系など)では不十分です。これらを理解するには、多体効果を考慮した手法(DMFT、量子モンテカルロ、密度汎関数理論+U など)が必要です。
第1章では固体電子論の基礎として、バンド理論の基本概念を学びました。次章では、この知識を基に実際の材料の電子構造を計算する手法を学びます。