state_sum.py 技術ドキュメント
プログラムの動作
このプログラム state_sum.py は、複数の独立した粒子が存在し、各粒子が複数の異なるエネルギー状態を取り得る系において、統計力学における分配関数 (Partition Function) \(Z\) を計算するPythonスクリプトです。このプログラムの主な目的は、以下の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\) は次のように計算されます。
ここで、\(N_s\) は各粒子が取りうる状態の数、\(N_p\) は粒子の数です。この方法は、プログラムの itertools.product を用いた部分で実装されています。
方法2: 各粒子の分配関数の積による計算
粒子が互いに独立である場合、系全体の分配関数は、個々の粒子の分配関数の積として表現できます。まず、各粒子 \(p\) の分配関数 \(Z_p\) を計算します。粒子 \(p\) が取りうる各状態 \(s\) の正規化されたエネルギーを \(\epsilon_{p,s}\) とすると、その粒子の分配関数 \(Z_p\) は次のように計算されます。
そして、系全体の分配関数 \(Z\) は、全ての粒子の分配関数の積として計算されます。
この方法は、プログラムの 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
実行結果の例:
(エネルギー準位は乱数で生成されるため、実際の出力値は毎回異なりますが、Ztot と Ztot2 はほぼ一致します。)
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
実行結果の例:
(同様に、エネルギー準位と各値は乱数に依存して変動しますが、最終的な Ztot と Ztot2 はほぼ一致します。)
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