Maxwell Velocity Distribution
The probability distribution of the speed \(v\) of particles in an ideal gas:
\[
f(v) = 4\pi \left(\frac{m}{2\pi k_B T}\right)^{3/2} v^2 e^{-\frac{mv^2}{2k_B T}}
\]
Most probable speed:
\[
v_{\text{mp}} = \sqrt{\frac{2k_B T}{m}}
\]
Mean speed:
\[
\langle v \rangle = \sqrt{\frac{8k_B T}{\pi m}}
\]
Root-mean-square speed:
\[
v_{\text{rms}} = \sqrt{\langle v^2 \rangle} = \sqrt{\frac{3k_B T}{m}}
\]
# Requirements:
# - Python 3.9+
# - matplotlib>=3.7.0
# - numpy>=1.24.0, <2.0.0
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import quad
# Physical constants
k_B = 1.380649e-23 # J/K
m_N2 = 4.65e-26 # Mass of N₂ molecule (kg)
def maxwell_speed_distribution(v, m, T, k_B):
"""Maxwell velocity distribution"""
factor = 4 * np.pi * (m / (2 * np.pi * k_B * T))**(3/2)
return factor * v**2 * np.exp(-m * v**2 / (2 * k_B * T))
def most_probable_speed(m, T, k_B):
"""Most probable speed"""
return np.sqrt(2 * k_B * T / m)
def mean_speed(m, T, k_B):
"""Mean speed"""
return np.sqrt(8 * k_B * T / (np.pi * m))
def rms_speed(m, T, k_B):
"""Root-mean-square speed"""
return np.sqrt(3 * k_B * T / m)
# N₂ gas
temperatures = [200, 300, 500, 800] # K
colors = ['blue', 'green', 'orange', 'red']
v_range = np.linspace(0, 2000, 1000) # m/s
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# Maxwell distribution
ax1 = axes[0]
for T, color in zip(temperatures, colors):
f_v = maxwell_speed_distribution(v_range, m_N2, T, k_B)
ax1.plot(v_range, f_v, color=color, linewidth=2, label=f'T = {T} K')
# Mark the most probable speed
v_mp = most_probable_speed(m_N2, T, k_B)
f_mp = maxwell_speed_distribution(v_mp, m_N2, T, k_B)
ax1.plot(v_mp, f_mp, 'o', color=color, markersize=8)
ax1.set_xlabel('Speed v (m/s)')
ax1.set_ylabel('Probability density f(v)')
ax1.set_title('Maxwell Velocity Distribution (N₂)')
ax1.legend()
ax1.grid(True, alpha=0.3)
# Temperature dependence of characteristic speeds
ax2 = axes[1]
T_range = np.linspace(100, 1000, 100)
v_mp_array = [most_probable_speed(m_N2, T, k_B) for T in T_range]
v_mean_array = [mean_speed(m_N2, T, k_B) for T in T_range]
v_rms_array = [rms_speed(m_N2, T, k_B) for T in T_range]
ax2.plot(T_range, v_mp_array, 'b-', linewidth=2, label='Most probable')
ax2.plot(T_range, v_mean_array, 'g-', linewidth=2, label='Mean')
ax2.plot(T_range, v_rms_array, 'r-', linewidth=2, label='RMS')
ax2.set_xlabel('Temperature (K)')
ax2.set_ylabel('Speed (m/s)')
ax2.set_title('Temperature Dependence of Characteristic Speeds')
ax2.legend()
ax2.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('stat_mech_maxwell_distribution.png', dpi=300, bbox_inches='tight')
plt.show()
# Numerical results
print("=== Maxwell Velocity Distribution (N₂ at 300 K) ===")
T = 300
v_mp = most_probable_speed(m_N2, T, k_B)
v_mean = mean_speed(m_N2, T, k_B)
v_rms = rms_speed(m_N2, T, k_B)
print(f"Most probable speed: {v_mp:.1f} m/s")
print(f"Mean speed: {v_mean:.1f} m/s")
print(f"Root-mean-square speed: {v_rms:.1f} m/s")
print(f"\nRatio:")
print(f" v_mp : v_mean : v_rms = {v_mp/v_mp:.3f} : {v_mean/v_mp:.3f} : {v_rms/v_mp:.3f}")
print(f" Theoretical ratio: 1 : {np.sqrt(8/(2*np.pi)):.3f} : {np.sqrt(3/2):.3f}")