麦克斯韦速率分布曲线互动课件

这个程序要实现的是沪科版选择性必修三 第十章 第三节 分子运动速率分布的统计规律中的图 10–15 和图 10–16,如下图所示。

图 10–15  0℃时氧分子在各速率区间分布的直方图
图 10 – 16 麦克斯韦气体分子速率分布曲线

之前曾用 Geogebra 做过类似的课件,对应的文章为用 Geogebra 绘制麦克斯韦速率分布曲线。网页版做出的成品如下所示:

核心代码解读

麦克斯韦气体分子速率分布曲线的理论证明在大学物理热力学教材中都应该有,例如《新概念物理教程——热学》的第 64 页起的内容。

麦克斯韦速率分布函数 f(v) 可以表达为:

\[f(v) = 4\pi {\left( {\frac{M}{{2\pi RT}}} \right)^{\frac{3}{2}}}{v^2}{e^{ - \frac{{M{v^2}}}{{2RT}}}}\tag{1}\]

式中 R 为气体常数,为 8.314 J/(mol·K),M 为气体的摩尔质量。

fv)dv 是速率区间 v ~ v + dv 内分子数占总分子数的比例,fv)的单位是速度单位的倒数 s/m。

在速率区间 v1 ~ v2 之内,或者在 v − Δv/2 ~ vv/2 之内(Δv = v2v1),分子数占总分子数的比例近似为

\[\frac{{\Delta N}}{{{N_0}}} = 4\pi {\left( {\frac{M}{{2\pi RT}}} \right)^{\frac{3}{2}}}{v^2}{e^{ - \frac{{M{v^2}}}{{2RT}}}}\Delta v\]

可知:分布函数下的面积表示分子数占总分子数的比例。

此函数的最大值称为最概然速率。在相同的速率间隔之间,最概然速率附近的分子数最多。表达式为

\[{v_{\rm{m}}} = \sqrt {\frac{{2RT}}{M}} \tag{2}\]

以上两个公式的对应代码如下:

// 麦克斯韦-玻尔兹曼分布函数
// v: 速率 (m/s)
// T: 温度 (K)
// M: 摩尔质量 (kg/mol)
function maxwellBoltzmannDistribution(v, T, M) {
    // 使用摩尔质量M和气体常数R直接计算
    const vSquared = Math.pow(v, 2);
    const denominator = 2 * R * T;
    return 4 * Math.PI * Math.pow(M / (2 * Math.PI * R * T), 3 / 2) * vSquared * Math.exp(-M * vSquared / denominator);
}

// 计算最概然速率
function mostProbableSpeed(T, M) {
    return Math.sqrt(2 * R * T / M);
}

绘制直方图矩形的思路是:若绘制的是 0 ~ 100 m/s 速率区间,则根据分布函数求出中值 50 m/s 对应的值,然后乘以 Δv = 100,这个数值就是 0 ~ 100 m/s 速率区间分子数占总分子数的比例,实际求的是矩形的面积。但这样做误差较大,在 0℃ 时,可求出速率在 0 ~ 100 m/s 之内的氧气分子数占总分子数的比例约为 1.04%,但教科书上的真实值约为 1.4%。从图中直方图面积(计算值)和曲线面积(真实值)就可看出,中间部分的误差相对较小,在 0 ~ 100 m/s 范围内误差是最大的。

因此取 Δv = 1,计算 100 个细长矩形的面积,然后将它们相加作为 0 ~ 100 m/s 范围的总百分比。

习惯上蓝色对应的温度低,红色对应的温度高,因此程序中的颜色与图 10–16 是相反的。


// 计算区间数量
const numBins = Math.ceil(fixed_v_max / interval);

for (let i = 0; i < numBins; i++) {
    const v_start = i * interval;
    const v_end = v_start + interval;

    // 累加法:每隔1计算一次,累加
    let percentage = 0;
    for (let v = v_start+0.5; v < v_end; v += 1) {
        const f = maxwellBoltzmannDistribution(v, T, M);
        percentage += f * 1 * 100;
    }

    // 计算矩形的位置和大小
    const x_start = margin + (v_start / fixed_v_max) * graphWidth;
    const x_end = margin + (v_end / fixed_v_max) * graphWidth;
    const bar_width = x_end - x_start;

    // 使用百分比进行归一化,确保与纵坐标刻度一致
    const normalized_height = Math.min(percentage / yAxisMax, 1);
    const bar_height = normalized_height * graphHeight;
    const y = 900 - bar_height;

    // 绘制矩形
    const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
    rect.setAttribute('x', x_start);
    rect.setAttribute('y', y);
    rect.setAttribute('width', bar_width);
    rect.setAttribute('height', bar_height);
    rect.setAttribute('fill', colors.fill);
    rect.setAttribute('stroke', colors.stroke);
    rect.setAttribute('stroke-width', '1');
    dynamicContent.appendChild(rect);

    // 在矩形中显示百分比数值,如果矩形高度过矮则不显示
    if (bar_height > 5) {
        const textX = x_start + bar_width / 2;
        const textY = y + bar_height / 2;

        // 计算文字颜色(使用矩形填充颜色的补色)
        const textColor = getComplementaryColor(colors.fill);

        const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');
        text.setAttribute('x', textX);
       text.setAttribute('y', textY);
        text.setAttribute('text-anchor', 'middle');
        text.setAttribute('dominant-baseline', 'middle');
        text.setAttribute('font-size', '20');
        text.setAttribute('fill', textColor);
        text.textContent = percentage.toFixed(1) + '%';
        dynamicContent.appendChild(text);
    }
}

完整代码

code

另一个版本

人教版的插图如下,与沪科版的图并不相同——它不使用直方图。

图 1.3–2  氧气分子的速率分布图像

我觉得人教版的图更加合理!因为纵坐标的物理意义不是概率而是概率密度,如果使用沪科版的直方图,当讨论到图像面积的时候,会给学生错误的引导——认为各直方图的纵坐标之和为 100%,但事实上是直方图的面积之和是 100%。

参考《MATLAB 可视化大学物理学》第 297 页的内容,节选如下:

(1)如图 1 所示,取速率间隔为 100 m/s,速率分布函数由直方条组成,其顶部呈阶梯形折线。速率在 0 ~ 100 m/s 之内的分子数占总分子数的比例约为 1.04%,速率在 100 m/s ~ 200 m/s 之内的分子数占总分子数的比例约为 8.11%,……,速率在 300 m/s~400 m/s 之内的分子数占总分子数比例最高,大约为 21.8%,……,速率在 900 m/s ~ 1000 m/s 之内的分子数占总分子数比例只有 0.658%。由于速率间隔比较大,分子数比例的误差也比较大。

图 1

(2)如图 2 所示,取速率间隔为 50 m/s,直方条变窄,顶部的阶梯变小。

图 2

速率在 0 ~ 50 m/s 之内的分子数占总分子数比例约为 0.131%,速率在 50 ~ 100 m/s 之内的分子数占总分子数比例约为 1.14%,因此速率在 0 ~ 100 m/s 之内的分子数占总分子数比例约为 1.27%。这个值精确了一点。速率间隔为 100 m/s 的分子数比例都可分为两个间隔为 50 m/s 的分子数比例之和。由于速率间隔减小了,分子数比例的误差也减小了。极大值在 350 m/s ~ 400 m/s 速率区间,极大值为 0.0022043。

(3)如图 3 所示,取速率间隔为 25 m/s,直方条更窄,顶部的阶梯更小。

图 3

速率在 0 ~ 100 m/s 之内的分子数占总分子数比例约为 1.33%,这个值当然更精确。速率间隔为 100 m/s 的分子数比例都可分为四个间隔为 25 m/s 的分子数比例之和。速率间隔越小,分子数比例就越精确。极大值在 375 m/s~400 m/s 速率区间,极大值为 0.0022007。

(4)速率间隔不断减小,直方条越来越窄。当速率间隔很小时,如图 4 所示,直方条很窄,直线都连成一片,顶部的阶梯几乎消失。速率在 0 ~ 100 m/s 之内的分子数占总分子数比例约为 1.35%。这个值相当精确了。极大值在 376.6 m/s~378.1 m/s 速率区间,极大值为 0.0022044。由此可知,当速率间隔趋于零时,顶部将趋于光滑的曲线,极大值范围趋于一点,极大值越精确。

图 4

按上述思路的课件展示如下:

完整代码

code

发布时间:2026/2/23 下午4:38:25  阅读次数:33

2006 - 2026,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号