state_sum.py 技術ドキュメント

プログラムの動作

このプログラム state_sum.py は、複数の独立した粒子が存在し、各粒子が複数の異なるエネルギー状態を取り得る系において、統計力学における分配関数 (Partition Function) \(Z\) を計算するPythonスクリプトです。このプログラムの主な目的は、以下の2つの異なる方法で分配関数を計算し、その結果が一致することを示すことで、独立な粒子系の統計力学の基本的な性質をデモンストレーションすることです。

  1. 全系の状態の組み合わせから直接計算する: 全ての粒子が取りうる状態の組み合わせを網羅し、それぞれの組み合わせに対応する全系のエネルギーを計算し、そのボルツマン因子を合計します。

  2. 各粒子の分配関数を計算し、それらを乗算する: 各粒子が単独で取りうる状態から、それぞれの粒子の分配関数を計算し、それらをすべて掛け合わせます。

このプログラムは、粒子間の相互作用がない独立な粒子系では、全系の分配関数が個々の粒子の分配関数の積に等しいという統計力学の原理を確認します。粒子の数と状態の数はコマンドライン引数で指定可能であり、各エネルギー準位は乱数で生成されます。

原理

このプログラムは、統計力学の基本的な概念である分配関数 \(Z\) に基づいています。分配関数は、熱平衡状態にある系のマクロな特性をミクロな状態から導出するために用いられる中心的な量です。

1. 正規化されたエネルギーとボルツマン因子

各粒子のエネルギー準位 \(E_i\) は、ボルツマン定数 \(k_B\) と絶対温度 \(T\) の積で割られた「正規化されたエネルギー」\(\epsilon_i = E_i / (k_B T)\) として扱われます。これにより、ボルツマン因子は次元を持たない \(e^{-\epsilon_i}\) の形で表現されます。

2. 分配関数の計算方法

方法1: 全ての可能な状態の合計による計算

系全体の分配関数 \(Z\) は、系が取りうる全ての可能なミクロ状態 \(j\) について、その状態の全エネルギー \(E_j\) に対応するボルツマン因子を合計することで定義されます。独立な粒子系では、系全体のエネルギーは個々の粒子のエネルギーの和として表されます。もし粒子が \(N_p\) 個あり、それぞれが状態 \(s_1, s_2, \dots, s_{N_p}\) を取るときの正規化されたエネルギーを \(\epsilon_{p, s_p}\) とすると、全系の正規化されたエネルギーは \(\sum_{p=1}^{N_p} \epsilon_{p, s_p}\) となります。 このとき、分配関数 \(Z\) は次のように計算されます。

\[\begin{split}Z = \sum_{\substack{s_1=0 \\ \dots \\ s_{N_p}=0}}^{N_s-1} \exp\left(-\sum_{p=1}^{N_p} \epsilon_{p, s_p}\right)\end{split}\]

ここで、\(N_s\) は各粒子が取りうる状態の数、\(N_p\) は粒子の数です。この方法は、プログラムの itertools.product を用いた部分で実装されています。

方法2: 各粒子の分配関数の積による計算

粒子が互いに独立である場合、系全体の分配関数は、個々の粒子の分配関数の積として表現できます。まず、各粒子 \(p\) の分配関数 \(Z_p\) を計算します。粒子 \(p\) が取りうる各状態 \(s\) の正規化されたエネルギーを \(\epsilon_{p,s}\) とすると、その粒子の分配関数 \(Z_p\) は次のように計算されます。

\[Z_p = \sum_{s=0}^{N_s-1} \exp(-\epsilon_{p,s})\]

そして、系全体の分配関数 \(Z\) は、全ての粒子の分配関数の積として計算されます。

\[Z = \prod_{p=1}^{N_p} Z_p\]

この方法は、プログラムの Zp を計算し、それらを乗算する部分で実装されています。

粒子間相互作用がない独立な粒子系では、これら2つの方法で計算された分配関数は数学的に厳密に一致します。このプログラムは、ランダムに生成されたエネルギー準位を用いてこの一致を実証します。

必要な非標準ライブラリとインストール方法

このプログラムの実行には、以下の非標準ライブラリが必要です。

  • NumPy: 数値計算、特に指数関数 exp() の高速な計算のために使用されます。

インストールは、Pythonのパッケージマネージャー pip を使用して行います。

pip install numpy

sys, random, itertools はPythonの標準ライブラリに含まれているため、別途インストールする必要はありません。

必要な入力ファイル

このプログラムは、外部の入力ファイルを必要としません。 粒子の数 (np) と状態の数 (ns) は、プログラム内でデフォルト値が設定されており、コマンドライン引数を通じて変更することも可能です。各粒子のエネルギー準位は、プログラム実行時に0から1の間の乱数として内部で生成されます。

生成される出力ファイル

このプログラムは、いかなるファイルも生成しません。 計算結果はすべて標準出力 (コンソール) に表示されます。表示される内容は以下の通りです。

  • 設定された粒子の数 (nparticles)

  • 設定された状態の数 (nstates)

  • 各粒子に対してランダムに生成された正規化エネルギー準位 (normalized energies)

  • 「全ての状態の組み合わせ」から計算される途中のボルツマン因子と部分的な分配関数 (Ztot(partial))

  • 「全ての状態の組み合わせ」から計算された最終的な分配関数 (Ztot)

  • 各粒子ごとの分配関数 (Zp)

  • 「各粒子の分配関数の積」から計算された最終的な分配関数 (Ztot)

コマンドラインでの使用例 (Usage)

基本的な実行コマンドは以下の通りです。

python state_sum.py [粒子の数] [状態の数]
  • [粒子の数] (オプション): 系の粒子の数を整数で指定します。省略した場合、デフォルト値の 2 が使用されます。

  • [状態の数] (オプション): 各粒子が取りうる状態の数を整数で指定します。省略した場合、デフォルト値の 3 が使用されます。

引数を指定しない場合、プログラムはデフォルト値 (np=2, ns=3) で実行されます。

コマンドラインでの具体的な使用例

例1: デフォルト値での実行

粒子の数 2、状態の数 3 で実行します。

python state_sum.py

実行結果の例: (エネルギー準位は乱数で生成されるため、実際の出力値は毎回異なりますが、ZtotZtot2 はほぼ一致します。)

nparticles= 2
nstates= 3
normalized energies:
  particle 0: [0.12345678, 0.56789012, 0.90123456]
  particle 1: [0.34567890, 0.78901234, 0.21098765]

Calculate Z using all combinations of states
  combination 0: (0, 0)   Etot= 0.469136  Ztot(partial)= 0.625447
  combination 1: (0, 1)   Etot= 0.912469  Ztot(partial)= 1.03152
  combination 2: (0, 2)   Etot= 0.334444  Ztot(partial)= 1.73715
  combination 3: (1, 0)   Etot= 0.890204  Ztot(partial)= 2.14073
  combination 4: (1, 1)   Etot= 1.35677   Ztot(partial)= 2.30252
  combination 5: (1, 2)   Etot= 0.778744  Ztot(partial)= 2.7712
  combination 6: (2, 0)   Etot= 1.24671   Ztot(partial)= 3.06451
  combination 7: (2, 1)   Etot= 1.69024   Ztot(partial)= 3.24355
  combination 8: (2, 2)   Etot= 1.11222   Ztot(partial)= 3.57011
Ztot= 3.570113110386629

Calculate Z using the product of Zp
  particle 0 Zp= 2.155708892795874
  particle 1 Zp= 1.656093339008986
Ztot= 3.570113110386629

例2: 粒子の数を 3、状態の数を 2 で実行

粒子の数 3、状態の数 2 で実行します。

python state_sum.py 3 2

実行結果の例: (同様に、エネルギー準位と各値は乱数に依存して変動しますが、最終的な ZtotZtot2 はほぼ一致します。)

nparticles= 3
nstates= 2
normalized energies:
  particle 0: [0.23456789, 0.87654321]
  particle 1: [0.45678901, 0.12345678]
  particle 2: [0.67890123, 0.34567890]

Calculate Z using all combinations of states
  combination 0: (0, 0, 0)   Etot= 1.37026   Ztot(partial)= 0.254145
  combination 1: (0, 0, 1)   Etot= 0.903935  Ztot(partial)= 0.658249
  combination 2: (0, 1, 0)   Etot= 1.03699   Ztot(partial)= 0.992683
  combination 3: (0, 1, 1)   Etot= 0.570668  Ztot(partial)= 1.57962
  combination 4: (1, 0, 0)   Etot= 1.97023   Ztot(partial)= 1.66699
  combination 5: (1, 0, 1)   Etot= 1.5039    Ztot(partial)= 1.88414
  combination 6: (1, 1, 0)   Etot= 1.63696   Ztot(partial)= 2.00762
  combination 7: (1, 1, 1)   Etot= 1.17064   Ztot(partial)= 2.34213
Ztot= 2.3421327857218684

Calculate Z using the product of Zp
  particle 0 Zp= 1.4883908851726716
  particle 1 Zp= 1.8028710352934253
  particle 2 Zp= 1.1963297079633215
Ztot= 2.3421327857218684