stastical_physics.distribution_function のソースコード

"""
統計物理学における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()