处于热平衡态的气体分子的速度满足一个非常优雅的分布—— Maxwell 分布,它在空间中三个方向上能分解为三个高斯分布(正态分布),如果需要对这样的分布进行抽样,在 python 中使用 random.gauss(μ,σ) 即可轻松达成。

而当大量气体分子在固体壁面附近处于平衡状态时,它同样具有一定的分布,仍然可以称之为 Maxwell 分布,也有一些文献称为 corrected Maxwell–Boltzmann distribution 或 half-range Maxwellian distribution。由于这时分布发生了变化,垂直于壁面方向(壁面的法向)不再满足高斯分布,因此这里使用接受拒绝采样(Acceptance-Rejection Sampling)方法进行抽样。

法向速度分布:

$$ f \left( v_{z} \right) = 2 \left( \frac{m_{gas}}{2 k_{B} T_{gas}} \right) v_{z} e^{- \frac{m_{gas} v_{z}^{2}}{2 k_{B} T_{gas}}} $$

python 实现10万次抽样:

# -*- coding: utf-8 -*-
import random
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

T_GAS = 300
kB = 1.380649e-23 #1.380649e-23J/K=1.987204e-3kcal/(mol`K)=8.617333262145e-5eV/K
MASS = 39.948
NA = 6.02214076e23 #u = 1.66053886e-27#1.66053886×10^-27 kg
u = 1.66053886e-27

sigma = (kB * T_GAS / (MASS*u)) ** 0.5

vz_maxwell = []


for i in range(0, 100000):
    vz_sg = 0
    vz_tmp = 10000
    c = 2

    while (vz_tmp > ((2*vz_sg*(MASS / 1000 / NA)/(2*kB*T_GAS))*np.exp(-(MASS / 1000 / NA)*vz_sg*vz_sg/(2*kB*T_GAS)))/(c*((MASS / 1000 / NA)/(2*np.pi*kB*T_GAS))**0.5*np.exp(-(MASS / 1000 / NA)*(vz_sg-250)*(vz_sg-250)/(2*kB*T_GAS)))):
        vz_sg = random.gauss(250, sigma)
        vz_tmp = random.uniform(0,1)
        vz = vz_sg

    vz_maxwell.append(vz)

sns.distplot(vz_maxwell,bins=20,hist=False,kde_kws={'linestyle':'--'})
x = np.linspace(0, 2000, 500)
plt.plot(x,(2*x*(MASS / 1000 / NA)/(2*kB*T_GAS))*np.exp(-(MASS / 1000 / NA)*x*x/(2*kB*T_GAS)))
plt.xlim((0, 2000))
plt.savefig("Ini_vz.png")
plt.show()

结果如图:

Ini_vz.png

大佬论坛