數學雜記1: 使用Poisson分佈推導Stirling近似

Stirling 近似公式 (Stirling's approximation),或者表示成 lnn!nlnnnn極大的時候,Stirling近似和精確值如圖1所示。
圖1. lnλ!精確值 (藍)、Stirling 近似公式 (橘) 與利用 Poisson 分佈所推導含NLO項的值 (綠)

 關於這條近似公式我們有一個簡單的推導,可以從 Poisson 分佈著手,其表示式如下P(n|λ)=eλλnn!.而當λ很大 (>10) 的時候,Poisson分佈在nλ附近可以被一個平均值和變異數皆為λ的高斯分佈來近似,即eλλnn!12πλe(nλ)22λn=λ我們有eλλλλ!12πλλ!λλeλ2πλ等式兩邊取ln後我們得到lnλ!λlnλλ+12ln2πλ即 Stirling 近似公式!其中最後一項12ln2πλ為 next-to-leading-order 修正 (NLO correction),我們從 Poisson 分佈出發的解在λ0.2時似乎比原來的近似公式還要來的更接近lnλ!的精確值,見圖1。
 比較值得注意的一點是,由於 Poisson 分佈是離散分佈,故λ應取整數值,而由於一開始 Stirling 近似中的n在統計力學內是表示一個正則系綜 (canonical ensemble) 內可能的系統數 (如果是微正則系綜 (microcanonical ensemble) 的話則表是狀態數Ω,但其實都是等價的),而系統的數量必然是正整數。但即使如此,用 Poisson 推導出來的結果仍然適用於所有正實數的情況,對於非整數 z 的情況,z!可以用 Gamma 函數表示:z!=Γ(z+1)=0tzetdt但上述不適用於負整數。上述的作圖可以用個簡單的python來實現:

import numpy as np
import scipy.special as ss
import matplotlib.pyplot as plt

# Usual Stirling approximation
stirling = lambda x: x*np.log(x) - x

# Stirling approximation w/ NLO
stirling_nlo = lambda x: x*np.log(x) - x + 0.5*np.log(2*np.pi*x)

# Calculating N factorial
X = np.arange(0.01,10,0.01)
NFact = np.log(ss.factorial(X))
Stir = stirling(X)
StirNLO = stirling_nlo(X)

# Plot
plt.semilogx(X,NFact,label="Exact $\log \lambda!$")
plt.semilogx(X,Stir,label="Stirling's approx")
plt.semilogx(X,StirNLO,label="Stirling + NLO")
plt.xlabel("$\lambda$")
plt.ylabel("$\log \lambda!$")
plt.legend()

留言

這個網誌中的熱門文章

IA9a - K-means分群與EM算法: 理論

IA9b - K-means分群與EM算法: 實作

PS2 — 因果本無心,天機皆可洩: 統計!