ミクロカノニカル分布による計算

[] [] []


等間隔エネルギー準位の理想気体の温度τ(U,N)

ミクロカノニカル分布で計算すると

MB統計:

BE統計とFD統計は閉じた式では表せないが、

漸化式で計算できる。

ミクロカノニカル分布では、与えられた全粒子数Nと全エネルギーUでとりうる状態数g(U,N)をかぞえて、エントロピー σ(U,N)=log g(U,N)から温度τ=1/σ'(U)を計算する。なお、ここでは簡単のため、エネルギーの単位を間隔Δεとし、Uを自然数として扱う

MB統計では「全エネルギーUN個の区別できる粒子に分ける方法の数」をかぞえる

例えばU=4N=2のときは次の3とおり。

これは、一列に並べたU個の球をN個に仕切る(U-1箇所からN-1箇所を選ぶ)方法の数だから

エントロピーσ

温度τの逆数はエントロピーをUで微分したものだが、差分で計算すると

ここでUが最小値Nより少し大きければ1<τになるから、温度は大体粒子1個あたりのエネルギーになる。

(∵ U>(N-1)/(1-e-1)=1.58(N-1)ならば1<τ)

◇◇

BE統計では粒子が区別できないので「全エネルギーUN個の自然数に分ける方法の数」をかぞえる

例えばU=4N=2のときは次の2とおり。

これは、いわゆる分割数P(U,N)である。

分割数は閉じた式で表せないが、漸化式で計算することはできる。(2項係数,スターリング数,分割数)

int main() {

    unsigned long long p[N+1][M+1];

    /* P(n,m)の計算と表示 */

    for (int n=1; n<=N; n++) {

        printf("n=%0d",n);

        for (int m=1; m<=M; m++) {

            if(m==1) {

                p[n][m] = 1;

            } else if(m<=n-1) {

                p[n][m] = p[n-1][m-1] + p[n-m][m];

            } else if(m==n) {

                p[n][m] = 1;

            } else {

                p[n][m] = 0;

            }

            printf(" %0llu",p[n][m]);

        }

        printf("\n");

    }

    return 0;

}

◇◇◇

FD統計ではBE統計と同じく粒子は区別できず、さらに1つのエネルギー準位に1個しか入れないので「全エネルギーUN個の相異なる自然数に分ける方法の数」をかぞえる

例えばU=4N=2のときは次の1とおり。

これは、相異なる自然数にわける分割数Q(U,N)である。

これも閉じた式で表せないが、漸化式で計算することはできる。

int main() {

    unsigned long long q[N+1][M+1];

    unsigned long long r[N+1][M+1];

    /* 初期化 */

    for(int n=0; n<=N; n++) {

      for(int m=0; m<=M; m++) {

        if(m==0 && n==0) q[0][0] = 1;

        else             q[n][m] = 0;

      }

    }

    /* 和因子の最大がkのとき */

    for(int k=1; k<=N; k++) {

      /* QをバッファRへコピー */

      for(int n=0; n<=N; n++) {

        for(int m=0; m<=M; m++) {

            r[n][m] = q[n][m];

        }

      }

      /* バッファRを使ってQを更新 */

      for(int n=0; n<=N-k; n++) {

        for(int m=1; m<=M; m++) {

            q[n+k][m] += r[n][m-1];

        }

      }

    }

(右へ続く)

    /* Q(n,m)の表示 */

    for(int n=0; n<=N; n++) {

        printf("n=%0d",n);

        for(int m=1; m<=M; m++) {

            printf(" %0llu",q[n][m]);

        }

        printf("\n");

    }

    return 0;

}

 ◇◇◇◇

結局、エントロピーσ(U,N)=log(g(U,N))を計算すると次のグラフのようになる。ただし点線は、高温のときにMBBE,FDと一致するようにg(U,N)を「N個の区別できる粒子の並び方N!」で割ったものである。

これをUについて差分をとれば温度τUの正確なグラフが描ける。


[] [] []