數學雜記1: 使用Poisson分佈推導Stirling近似
Stirling 近似公式 (Stirling's approximation),或者表示成\[\
\ln n! \simeq n\ln n - n
\]當\(n\)極大的時候,Stirling近似和精確值如圖1所示。
\ln n! \simeq n\ln n - n
\]當\(n\)極大的時候,Stirling近似和精確值如圖1所示。
關於這條近似公式我們有一個簡單的推導,可以從 Poisson 分佈著手,其表示式如下\[
P(n|\lambda)=e^{-\lambda}\frac{\lambda^n}{n!}.
\]而當\(\lambda\)很大 (\(>10\)) 的時候,Poisson分佈在\(n\sim \lambda\)附近可以被一個平均值和變異數皆為\(\lambda\)的高斯分佈來近似,即\[
e^{-\lambda}\frac{\lambda^n}{n!}\simeq \frac{1}{\sqrt{2\pi \lambda}}e^{-\frac{(n-\lambda)^2}{2\lambda}} \]取\(n=\lambda\)我們有\[\begin{eqnarray*}
e^{-\lambda}\frac{\lambda^{\lambda}}{\lambda!}&\simeq&\frac{1}{\sqrt{2\pi\lambda}}\\\Rightarrow\lambda!&\simeq&\lambda^\lambda e^{-\lambda}\sqrt{2\pi \lambda} \end{eqnarray*} \]等式兩邊取\(\ln\)後我們得到\[
\ln \lambda! \simeq \lambda \ln \lambda -\lambda + \frac{1}{2}\ln 2\pi \lambda
\]即 Stirling 近似公式!其中最後一項\(\frac{1}{2}\ln 2\pi \lambda\)為 next-to-leading-order 修正 (NLO correction),我們從 Poisson 分佈出發的解在\(\lambda \gtrsim 0.2\)時似乎比原來的近似公式還要來的更接近\(\ln \lambda !\)的精確值,見圖1。
比較值得注意的一點是,由於 Poisson 分佈是離散分佈,故\(\lambda\)應取整數值,而由於一開始 Stirling 近似中的\(n\)在統計力學內是表示一個正則系綜 (canonical ensemble) 內可能的系統數 (如果是微正則系綜 (microcanonical ensemble) 的話則表是狀態數\(\Omega\),但其實都是等價的),而系統的數量必然是正整數。但即使如此,用 Poisson 推導出來的結果仍然適用於所有正實數的情況,對於非整數 \(z\) 的情況,\(z !\)可以用 Gamma 函數表示:\[
z!=\Gamma (z+1) = \int_0^\infty t^z e^{-t} dt
\]但上述不適用於負整數。上述的作圖可以用個簡單的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()
留言
張貼留言