plotW.py 技術ドキュメント

プログラムの動作

plotW.py は、N個の要素を2つのグループに分割する際の組み合わせの数(構成数)\(W(N, n_i)\) を、一方のグループの要素数 \(n_i\) の関数としてプロットするPythonスクリプトです。具体的には、\(N\) を固定したときに、\(n_i/N\) の変化に対する \(W(N, n_i)\) の挙動を複数の異なる \(N\) の値について可視化します。これにより、\(N\) が大きくなるにつれて構成数の分布がどのように中央に集中していくかを示します。

プログラムは以下の主要な機能を提供します。

  1. 様々な \(N\) の値(N_values リストで定義された \(5.0 \times 2^0\) から \(5.0 \times 2^{31}\) までの範囲)を設定します。

  2. \(N\) に対して、一方のグループの要素数 \(n_i\) の範囲を計算します。\(n_i\) の範囲は \(N/2\) を中心に、\(6.0 \sqrt{N}\) の幅で対数スケールで500点サンプリングされます。

  3. スターリングの近似を用いて、Nと \(n_i\) に基づく構成数 \(W(N, n_i)\) の対数を計算し、その最大値 \(\ln W_{max}\) で規格化します。

  4. 計算された \(n_i/N\) 対 規格化された \(W(N, n_i)\) の関係をグラフとして描画します。

  5. 生成されたグラフを plotW.png という名前の画像ファイルとして保存し、同時に画面に表示します。

このプログラムは、統計力学や確率論における構成数の概念、特に二項分布が \(N\) の増加とともに正規分布に近づく様子を視覚的に理解するのに役立ちます。

原理

このプログラムは、統計力学や確率論で用いられる「構成数」の概念に基づいています。\(N\) 個の独立した要素を2つのグループに分け、\(n_i\) 個が一方のグループに属し、\(N-n_i\) 個がもう一方のグループに属する場合の構成数 \(W(N, n_i)\) は、二項係数で与えられます。

\[W(N, n_i) = \binom{N}{n_i} = \frac{N!}{n_i!(N-n_i)!}\]

数値計算の安定性と、大きな数に対するスターリングの近似を使用するため、プログラムでは対数で計算を進めます。スターリングの近似によると、大きな \(k\) に対して \(\ln k! \approx k \ln k - k\) が成り立ちます。

この近似を用いると、\(\ln W(N, n_i)\) は以下のように表現できます。 $\(\ln W(N, n_i) \approx (N \ln N - N) - (n_i \ln n_i - n_i) - ((N-n_i) \ln (N-n_i) - (N-n_i))\)\( \)\(\ln W(N, n_i) \approx N \ln N - n_i \ln n_i - (N-n_i) \ln (N-n_i)\)$

プログラムの W 関数では、この構成数を最大値 \(W_{max}\) で規格化しています。最大の構成数は \(n_i = N/2\) のときに得られます。 $\(\ln W_{max} \approx N \ln N - 2 \cdot \left(\frac{N}{2} \ln \frac{N}{2}\right)\)$

プログラムは最終的に \(\exp(\ln W(N, n_i) - \ln W_{max})\) を計算し、これは \(\frac{W(N, n_i)}{W_{max}}\) に相当します。この規格化された値が \(n_i/N\) に対してプロットされます。

ni_t = _ni * log(_ni) if _ni > 0 else 0 のように、\(n_i=0\)\(N-n_i=0\) の場合を特別に処理しているのは、\(\ln 0\) が未定義になるのを避けるためです。この場合、\(x \ln x\)\(x \to 0\) の極限で \(0\) に収束するという性質を利用しています。

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

このプログラムは以下の非標準ライブラリを使用します。

  • matplotlib: グラフ描画のために使用されます。

  • numpy: 高度な数値計算(配列操作、対数・指数関数など)のために使用されます。

これらのライブラリは、Pythonのパッケージマネージャ pip を使用してインストールできます。以下のコマンドをターミナルまたはコマンドプロンプトで実行してください。

pip install matplotlib numpy

必要な入力ファイル

このプログラムは、外部からの入力ファイルを必要としません。必要なデータ(\(N\) の値のリスト、\(n_i\) の範囲など)はすべてプログラム内で生成されます。

生成される出力ファイル

プログラムが正常に実行されると、以下の画像ファイルが生成され、プログラムが実行されたディレクトリに保存されます。

  • plotW.png: \(N\) の異なる値に対する \(n_i/N\) と規格化された構成数 \(W(N, n_i)\) の関係を示すグラフです。X軸は \(n_i/N\)(対数目盛)、Y軸は \(W(N, n_i)\)(線形目盛)を表し、複数の曲線が異なる \(N\) の値に対応しています。

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

plotW.py はコマンドライン引数を取らず、直接実行するだけで動作します。

python plotW.py

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

  1. plotW.py ファイルを保存したディレクトリに移動します。

  2. 以下のコマンドを実行します。

    python plotW.py
    
  3. プログラムはグラフウィンドウを表示し、同時に plotW.png という名前の画像ファイルを現在のディレクトリに保存します。グラフウィンドウは「>>」プロンプトが表示され、ユーザーが何らかの入力をする(通常はEnterキーを押す)まで開いたままになります。

  4. ユーザーがEnterキーを押すと、グラフウィンドウは閉じられ、プログラムの実行が終了します。

実行結果の説明

実行後、plotW.png ファイルには、様々な \(N\) の値に対する規格化された構成数 \(W(N, n_i)\) のグラフが描画されます。

  • X軸は \(n_i/N\) の対数スケールで、約 \(0.1\) から \(1.0\) の範囲を示します。

  • Y軸は規格化された \(W(N, n_i)\) の値で、\(0\) から \(1\) の範囲を取ります。

  • グラフには複数の曲線が表示され、それぞれの曲線が異なる \(N\) の値に対応しています。

  • \(N\) の値が小さい曲線は比較的広がりがあり、\(n_i/N = 0.5\) の最大値から離れても \(W(N, n_i)\) が高い値を示します。

  • \(N\) の値が大きくなるにつれて、曲線は \(n_i/N = 0.5\) のピークにより鋭く集中していく様子が観察できます。これは、大数の法則が示すように、\(N\) が大きいほど、ランダムな分割において \(n_i\)\(N/2\) に近づく確率が高くなることを視覚的に表現しています。

  • グラフには凡例があり、各曲線がどの \(N\) の値に対応するかを示します。グリッド線も表示され、視認性が向上しています。