數學雜記1: 使用Poisson分佈推導Stirling近似
Stirling 近似公式 (Stirling's approximation),或者表示成 lnn!≃nlnn−n當n極大的時候,Stirling近似和精確值如圖1所示。
關於這條近似公式我們有一個簡單的推導,可以從 Poisson 分佈著手,其表示式如下P(n|λ)=e−λλnn!.而當λ很大 (>10) 的時候,Poisson分佈在n∼λ附近可以被一個平均值和變異數皆為λ的高斯分佈來近似,即e−λλnn!≃1√2πλe−(n−λ)22λ取n=λ我們有e−λλλλ!≃1√2πλ⇒λ!≃λλ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)=∫∞0tze−tdt但上述不適用於負整數。上述的作圖可以用個簡單的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()
留言
張貼留言