"""
統計物理学における3つの主要な分布関数の比較プロットモジュール。
概要:
マクスウェル=ボルツマン(MB)、フェルミ=ディラック(FD)、
ボーズ=アインシュタイン(BE)の各分布関数を同一グラフ上にプロットし、
量子統計的性質の違いを可視化します。
詳細説明:
- 横軸は無次元化されたエネルギー $x = (E - \mu) / k_B T$ を使用します。
- 各分布関数は以下の通り定義されます:
- MB統計: $f(x) = \exp(-x)$
- FD統計: $f(x) = 1 / (\exp(x) + 1)$
- BE統計: $f(x) = 1 / (\exp(x) - 1)$
- $x \gg 0$ の領域で、すべての分布が指数関数(MB統計)に漸近することを確認できます。
- $x \to 0$ 付近での BE 統計の発散(ボーズ凝縮の示唆)や、FD 統計の飽和(パウリの排他原理)が視覚的に捉えられます。
関連リンク: :doc:`distribution_function_usage`
"""
import numpy as np
from numpy import exp
import matplotlib.pyplot as plt
#=============================
# 物理定数(定義のみ、計算では無次元化変数を使用)
#=============================
E_CHARGE = 1.602176634e-19 # C
KB = 1.380649e-23 # J/K
[ドキュメント]
def main():
"""
分布関数の計算とプロットを実行します。
"""
# プロット設定
figsize = (12, 8)
fontsize = 20
legend_fontsize = 16
# エネルギー軸の定義(無次元変数 x = (E - mu) / kBT)
x_range = np.arange(-5.0, 6.0, 0.01)
# 1. Maxwell-Boltzmann (MB)
mb_dist = exp(-x_range)
# 2. Fermi-Dirac (FD)
fd_dist = 1.0 / (exp(x_range) + 1.0)
# 3. Bose-Einstein (BE)
# BE統計は x > 0 で定義される(化学ポテンシャルが基底状態を超えないため)
x_be = np.arange(0.01, 6.0, 0.01)
be_dist = 1.0 / (exp(x_be) - 1.0)
# --- 描画処理 ---
fig, ax = plt.subplots(figsize=figsize)
ax.tick_params(labelsize=fontsize)
# 各統計のプロット
ax.plot(x_range, mb_dist, label='Maxwell-Boltzmann (Classical)', color='black', linewidth=1.5)
ax.plot(x_range, fd_dist, label='Fermi-Dirac (Fermions)', color='red', linewidth=2.0)
ax.plot(x_be, be_dist, label='Bose-Einstein (Bosons)', color='blue', linewidth=2.0)
# 補助線とラベル
ax.set_xlabel(r'Normalized Energy $(E - \mu) / k_B T$', fontsize=fontsize)
ax.set_ylabel('Occupancy $f(E)$', fontsize=fontsize)
ax.set_ylim([0.0, 3.0])
ax.set_xlim([-5.0, 6.0])
# f(E)=1.0(FDの飽和値)と x=0(化学ポテンシャル)のガイドライン
ax.axhline(1.0, linestyle='dotted', color='gray', linewidth=1.0)
ax.axvline(0.0, linestyle='dotted', color='gray', linewidth=1.0)
ax.set_title("Comparison of Statistical Distributions", fontsize=fontsize + 2)
ax.legend(fontsize=legend_fontsize)
ax.grid(True, alpha=0.3)
plt.tight_layout()
# 画像保存
save_name = 'distribution_function.png'
plt.savefig(save_name, dpi=300)
print(f"Graph saved as {save_name}")
plt.show(block=False)
input("\nPress ENTER to terminate>>")
if __name__ == "__main__":
main()