物理实验猿 发布的文章

缘起

"用冷却法测金属的比热容"是大学物理实验中的经典项目,我觉得它适合做成一个3D场景,把它搬进浏览器——打开网页就能操作,不用安装软件,不用担心烫伤。仿真实验在线地址:https://aphysics.cn/new3D/bireshang.html

最终呈现:一个浏览器里的完整实验台

打开页面,你会看到一个用 three.js 搭建的三维实验台。左边是加热仪器——底座、立柱、齿轮齿条、手轮、可升降的加热炉体、透明风罩、隔热盖,一样不少。右边是测试仪器——银色箱体上嵌着两块 LED 数字屏(一块显示热电势、一块显示计时),还有加热指示灯、加热电流输出口、热电偶输入端子。两台仪器之间,热电偶引线和加热导线按照实际走线方式连接:黑红相间的热电偶线从探针底部接到插孔,再经保温杯(冰水混合物,冷端参考)分路到红黑端子;褐色加热线从输出口绕到仪器面板前方,再折回到加热器顶部。

实验流程被拆成了 8 个步骤,顶部有一排步骤指示点实时高亮。操作者首先从"铜 Cu""铁 Fe""铝 Al"三个按钮中选择样品(页面上有一行小字说明:实际实验中三种样品表面都是银白色的,这里用不同颜色是为了方便识别),然后依次执行:下降加热器、设置目标温度并加热、等待自动恒温后加热器升起、盖上隔热盖开始冷却测量。

冷却阶段是整个实验的核心。系统基于牛顿冷却定律做数值模拟,热电偶信号通过一张 Cu-Constantan 分度表实时换算——当热电势从 4.20 mV 降到 4.00 mV,系统自动完成计时,记录 Δt。每种金属重复测量 6 次,三种金属共 18 次测量全部完成后,系统以铜的标准比热容为基准,用比较公式算出铁和铝的比热容,弹出结果面板。

整个过程中,右侧状态面板实时显示当前样品、质量、热电势、温度、计时和加热状态;右下方数据表格逐行填入每次测量的原始数据,并自动汇总各金属的平均 Δt。三维场景支持鼠标拖拽旋转和滚轮缩放,方便从不同角度观察。

需要说明的是,这个虚拟实验并不追求与真实实验完全一致。在一些细节上我做了取舍——比如加热过程简化为线性升温、散热系数做了理想化处理、部分操作步骤的顺序和真实实验有差异——这样做的目的是减少开发工作量,把精力集中在核心物理过程的模拟上。操作流程也不完全照搬真实实验,毕竟虚拟环境有自己的交互特点,有些步骤用鼠标点击比手动操作更自然。但实验的目的完全一致:通过比较三种金属在相同条件下的冷却时间,用已知比热容的铜作为基准,推导出铁和铝的比热容。

开发手记:在反复打磨中逼近真实

从零到一:先让东西"能看"

最初版本只有几个基本几何体——方盒子当底座,圆柱体当炉子,勉强能看出是台仪器。然后一步步细化:给立柱加上齿轮齿条(用 InstancedMesh 做了 25 个小方块),给加热器装上可旋转的手轮(圆环加辐条),给测试仪器面板贴上 Canvas 纹理的 LED 数字显示。场景从"能看"慢慢变成"像那么回事"。

热电偶的布线是早期花心思比较多的地方。真实的实验台上,线缆在仪器之间蜿蜒穿梭,如果直接用直线连接就会穿模——线从箱体中间穿过去,视觉上很假。我改用 CatmullRomCurve3 来定义空间曲线,让线缆沿着合理的路径绕行,经过保温杯、贴着面板前方走,最终到达端子。每根线用 TubeGeometry 生成管状网格,视觉上就有了线缆的质感。

物理模拟:让数据"说得通"

三维场景搭好之后,真正的挑战是物理模拟。这个实验的灵魂在于冷却过程的数据必须自洽——三种金属的冷却时间之比要能反推出正确的比热容关系。

根据牛顿冷却定律,样品的温度变化率 dT/dt = -k(T - T₀)/(M·c),其中 k 是散热系数,M 是质量,c 是比热容。当三种样品几何形状相同、表面状态相同(实验中都是银白色),k 可以视为相同,于是冷却时间 Δt 正比于 M·c 的乘积。代入比较公式 C₂ = C₁ × (M₁/M₂) × (Δt₂/Δt₁),就能从铜的已知比热容推出铁和铝的值。

调参的过程颇为曲折。最初我凭直觉设了一组冷却常数,结果铜的 Δt 只有几秒,铁铝的偏差更大,算出来的比热容跟理论值相去甚远。后来我反过来从目标 Δt 出发,先确定铜的冷却时间约 15+ 秒,再根据 M·c 的比值推算铁和铝的冷却时间,由此反推出每种金属的 coolK 参数。最终代入公式后铁算出 0.1121(理论值 0.112)、铝算出 0.2171(理论值 0.217),完美吻合。

热电偶的分度表也是一个细节。我用了 Cu-Constantan 的标准数据,从 -10°C 到 200°C 逐 10°C 一个节点,线性插值实现双向换算。4.20 mV 对应约 98.3°C,4.00 mV 对应约 94.0°C,5°C 的冷却区间在时间尺度上足够拉开差异,又不会让等待太久。

反复打磨:细节里藏着魔鬼

开发过程中最耗时间的不是大功能的实现,而是一个个细节的修正。

加热线的连接就是一例。褐色加热线从测试仪器的输出口连到加热器顶部,最初端点位置不对,跟输出口之间差了约 0.2 的距离,悬在空中。我用 getWorldPosition 加 worldToLocal 动态计算端口在局部坐标系中的精确位置,再把曲线的第一个控制点显式设为该位置,才彻底解决了"对不上"的问题。后来用户又反馈线缆从仪器面板中间穿了过去,于是加了 z=1.2 的前绕路径,让线缆先走到面板前方再折回来。高处弧顶最初比加热器顶部高出太多,调了几轮才降到合适的位置。这根线前后改了四五轮,每次都是肉眼可见的小问题,但修起来需要精确定位坐标系和曲线参数。

手轮的旋转也是反复调过的。手轮通过一根轴连到立柱上,加热器升降时手轮跟着上下移动,同时绕轴旋转——模拟真实齿轮传动的效果。旋转角度用 lerp 平滑插值逼近目标值,视觉上就有了"转着圈升上去"的感觉。用户要求手轮整体向 z 负方向移动 0.2,虽然只是一行代码的改动,但说明他在认真观察三维场景里每个部件的相对位置。

元素符号的显示也踩过坑。最初用 toUpperCase() 来显示金属符号,结果铜显示成"CU"、铁显示成"FE"、铝显示成"AL"——化学上正确的写法应该是 Cu、Fe、Al,第二个字母小写。后来在 METALS 对象里加了 sym 属性,所有显示位置统一改用 sym,才修正了这个看起来不起眼但化学老师一定会指出的问题。

还有一个逻辑上的坑:切换金属样品时,最初代码会清空测量数据数组,导致前一种金属的 6 次测量数据全部丢失。用户希望三种金属的数据同时保留在表格里,最后一起参与计算。去掉那一行清空语句后,数据表格就能完整展示 18 次测量的全部记录了。

加热状态的显示也有类似问题。状态面板里的"加热状态"始终显示"关闭",但仪器面板上的 LED 指示灯是对的。原因是 LED 状态在物理更新函数里实时刷新,而状态面板的文字只在步骤切换时才更新。把加热状态的刷新也放进物理更新的定时显示逻辑里,问题就解决了。

一些让自己满意的小设计

隔热盖的联锁逻辑是我比较满意的一个设计。真实实验中,隔热盖放在风罩顶部之前,加热器不能下降(否则会撞到盖子);加热器升起之后才能放盖子。在仿真里,隔热盖初始状态在台面左侧,只有当加热器处于升起位置时才能被放到风罩口上;而加热器只有在隔热盖回到台面时才能下降。这种操作顺序的约束避免了物理上不可能的状态,也让操作流程更接近真实实验的手感。

数据表格的设计也花了心思。最终版本是一个统一的表格,三种金属的测量数据按时间顺序排列在一起,下方自动汇总每种金属的平均 Δt。这样用户可以直观地对比三种金属的冷却时间差异,而不是在三个分开的表格之间来回切换。

最后一步的计算结果面板会展示完整的公式推导过程:以铜为标准,列出每种金属的平均 Δt 和计算得到的比热容,让用户能清楚地看到从原始数据到最终结果的完整链路。

回头看

这个项目前前后后经历了十几轮迭代,从最初的"几个方块搭个架子"到现在这个有完整实验流程、物理模拟自洽、交互细节到位的版本。每一轮修改都来自实际使用中的观察——有时候是我自己操作时发现数据不对、视觉穿模,有时候是用户反馈的"这里差了一点""那里不太合理"。

做虚拟仿真最大的挑战不是技术本身,而是如何在"简化"和"真实"之间找到平衡。太简化了,学生学不到东西;太复杂了,又变成了另一个让人望而却步的实验装置。我希望这个版本刚好卡在中间:操作足够直观,数据足够真实,过程足够完整——让学生能在安全的虚拟环境里,把整个实验从头到尾做一遍,真正理解冷却法测比热容的原理。

一个网页,打开就能用。这大概就是虚拟仿真最朴素的价值。

最后提一句性能方面的事。三维场景在浏览器里实时渲染,对硬件还是有一定要求的。我在开发过程中做了不少优化——帧率限制在 30fps、像素比上限 1.5 倍、关闭抗锯齿、用 InstancedMesh 合并重复几何体、加热线的几何体每帧重建但其他部分保持静态——整体 CPU 占用率控制在了比较合理的范围。不过还是建议在 PC 上使用,手机和平板上跑这么重的三维场景体验会打折扣。

做物理实验最痛苦的是什么?不是搭仪器,不是调光路,而是回到宿舍面对一堆数据时,那种"算不确定度算到怀疑人生"的感觉。

我自己教物理实验这么多年,太理解这种痛苦了。每次实验报告交上来,数据处理部分总是五花八门——有人手算逐差法算错小数点,有人用Excel拉公式拉到崩溃,还有人干脆"编"了一组看起来很像样的数据。

所以我做了一个东西:大学物理实验数据处理工具集,在线直接用,不用装软件,不用写代码,手机也能打开。

地址在这里:https://aphysics.cn/calculate/

目前能做什么

目前已经上线了 22 个计算页面,覆盖了我们学校大物实验的主要项目,分三类来说:

通用工具——不管哪个实验都可能用到:

  • 偏差计算:输入数据自动求平均值、标准偏差、A/B类不确定度
  • 坐标作图:输入数据直接画散点图,支持导出
  • 逐差法:大学物理实验的经典方法,手动算太容易出错
  • 不确定度计算:通用型,输入直接出结果
  • 理论声速:根据温度算声速,其他实验有时也要查

专项实验数据处理——针对具体实验定制:

  • 长度测量(含肖维纳判据剔除异常值)
  • 等倾干涉 / 等厚干涉(迈克尔逊干涉仪、牛顿环等)
  • 单臂电桥测热敏电阻
  • 声速测量
  • 复摆测重力加速度
  • 液体表面张力系数
  • 光电效应(普朗克常量)
  • 亥姆霍兹线圈磁场
  • 密立根油滴
  • 钨的逸出功
  • 多普勒效应(含线性拟合+自动画图)
  • 杨氏模量
  • 波尔共振
  • 巨磁电阻
  • 光磁共振
  • 塞曼效应

每个页面都是针对实验的实际计算公式做的,不是简单的通用计算器。比如密立根油滴那个,空气粘滞系数、修正常数、板间距这些参数都内置好了,你只需要输入电压和下落时间就行。

怎么用

很简单——打开网页,选对应的实验,填数据,点计算,结果就出来了。

支持手机和电脑,数据直接复制粘贴到实验报告里。部分页面(比如多普勒效应)还能自动画拟合直线,省得你拿坐标纸手描。

有些页面我加了密码验证——不是不想让大家用,是防止直接丢进去算答案、不动手理解过程。密码每天会变,上课的时候我会告诉学生。

后续计划

22 个只是开始。后面我还会陆续增加更多实验的数据处理工具,比如:

  • 更多光学实验(法布里-珀罗干涉等)
  • 近代物理实验相关计算
  • 一些数据处理方法的扩展(比如更复杂的拟合、误差传递分析)

如果你有需要的实验项目,或者发现哪个计算有bug,欢迎在 留言板 提出来,也可以去B站 @物理实验猿 私信我。

这个工具集会持续更新,目标很简单:让大家把时间花在理解物理上,而不是花在按计算器上。

写在前面

作为一名高校物理实验教师,我一直在寻找一个轻量、好用的在线考试工具。市面上的系统要么太重,部署复杂;要么功能单一,无法满足实际教学需求。于是,我决定自己动手做一个。

经过一段时间的开发和迭代,这个在线考试系统已经基本成型,今天就来介绍一下它的主要功能和一些设计上的思考。

系统地址:https://aphysics.cn/exam/
教师测试账号不再提供
学生测试账号20261234密码123456


系统概览

这是一个基于 PHP + MySQL 的在线考试系统,前端采用单页应用(SPA)架构,整体风格是深色主题,支持响应式布局。系统分为三个角色:管理员教师学生,各自有不同的功能权限。


核心功能

1. 用户与权限管理

系统支持三级权限体系:

  • 管理员:负责创建和管理所有用户账号(包括教师和学生),可以分配班级、设置角色。
  • 教师:可以创建试卷、发布考试、批改作业、查看统计数据。
  • 学生:参加考试、查看成绩、查看错题汇总。

学生忘记密码时,只能由管理员手动重置——这是一个刻意的设计,避免学生随意修改密码导致账号混乱。

2. 试卷与题目管理

教师可以创建试卷,支持三种题型:

  • 选择题:支持多个选项(A/B/C/D...)
  • 填空题:学生输入答案
  • 判断题:对/错二选一

题目支持批量导入,教师可以快速录入大量题目。试卷可以设置目标班级,只允许特定班级的学生参加。

3. 在线考试

学生登录后,可以看到分配给自己的试卷列表,点击进入考试界面。考试界面简洁清晰,每道题都有题号标识,方便学生导航。

提交后系统自动批改(客观题),学生可以立即看到成绩和详细解析。

4. 防作弊机制

这是我在设计时重点考虑的功能。系统支持两个可选的防作弊选项:

  • 题目顺序随机化:每个学生的题目顺序不同
  • 选项打乱:选择题的选项顺序随机打乱

这两个选项教师可以在发布试卷时自由开关。关键的是,随机化只在前端进行,后端存储和统计的数据格式保持不变,这样就不会影响错题统计等功能的准确性。

5. 试卷克隆

教师经常需要出多套难度相近的试卷。为了简化这个流程,我加入了试卷克隆功能。教师可以一键克隆现有试卷(包括所有题目),然后在此基础上微调,快速生成新卷。

6. 学生记录与数据分析

这是学生端的一个亮点功能——"我的记录"页面:

  • 成绩趋势图:用 Canvas 绘制折线图,展示学生历次考试的得分率变化,直观反映学习进步情况。
  • 错题汇总:自动收集学生所有做错的题目,按时间排序,方便复习和查漏补缺。

这个功能的设计初衷是让学生不只是"考完就忘",而是能看到自己的成长轨迹,知道哪些知识点还需要加强。

7. 教师统计与错题分析

教师端有专门的统计页面,可以查看每道题的正确率、常见错误选项等,帮助教师了解学生的薄弱环节,调整教学重点。


技术栈与架构

  • 后端:PHP + MySQL,轻量易部署
  • 前端:原生 JavaScript 单页应用,无框架依赖
  • 样式:自定义深色主题,CSS 变量管理
  • 图表:Canvas 原生绘制,无第三方库

整个系统的代码量不大,核心逻辑都在一个 index.html 文件里,后端 API 分散在多个 PHP 文件中。这种架构虽然简单,但对于中小型考试系统来说已经足够。


一些设计思考

为什么选择单页应用?

最初也考虑过传统多页面架构,但考虑到考试系统的交互性较强(比如答题过程中的状态管理),单页应用的体验会更流畅。而且部署简单,不需要复杂的前端构建流程。

为什么随机化只在前端?

如果随机化在后端进行,每个学生的题目 ID 会不同,这会给错题统计、成绩分析带来很大麻烦。前端随机化后,学生提交的答案仍然映射到原始题目 ID,后端无需做任何特殊处理。

为什么学生不能重置密码?

这是一个权衡。虽然学生自助重置密码更方便,但在实际教学场景中,学生账号往往由教师统一管理,学生随意修改密码反而会导致教师无法登录学生账号进行调试或补考。所以保留了这个"不便"的设计。


未来计划

目前系统已经可以满足基本的在线考试需求,但还有一些功能想加入:

  • 主观题批改:支持教师手动批改填空题和简答题
  • 考试监控:实时监控学生答题进度,防止切屏作弊
  • 移动端适配:进一步优化手机端的考试体验
  • 数据导出:支持导出成绩为 Excel,方便教师存档

最后

这个考试系统是我在教学工作中"用脚投票"的产物。它可能不如商业产品那样功能丰富,但它贴合我的实际需求,部署简单,维护方便。

如果你也在寻找一个轻量级的在线考试解决方案,或者对物理实验教学感兴趣,欢迎交流。


如果你对这个项目感兴趣,可以关注我的后续更新。

每次看到学生在物理课上只能对着课本想象实验现象,或者在实验室里手忙脚乱地赶时间、记数据,却没来得及真正"看见"物理规律发生的那一刻,我都会觉得可惜。

物理从来不是一门背公式的学科。它最迷人的地方在于——世界运行的规律,是可以被观察、被触摸、被亲手验证的。可现实是:实验设备昂贵、课时紧张、有些现象稍纵即逝,还有些实验压根碰不到(总不能为了讲光电效应,给每个学生发一台精密仪器)。于是那份"亲手验证"的乐趣,就一点点被磨掉了。

所以我做了 aphysics.cn,全名"AI 物理实验"。

名字里的那个 A,是 All,也是 Alpha——我想做一个把物理实验搬进浏览器的地方,让任何人、在任何时间、打开网页就能动手做实验。首页写着一句"A is all...",大概就是我私心的一点执念:物理,本该包含一切。

一、虚拟仿真实验室:把大学物理实验原样搬上网

这是我最早想做、也投入最多心血的一块。里面是基于真实实验流程的虚拟仿真,不是简单的动画演示,而是可以一步步操作、读数、处理数据的"准实验"。

目前上线了 12 个,覆盖力学、热学、电磁学、声学、近代物理:

  • 长度测量 —— 游标卡尺、螺旋测微器的读数原理与精度控制
  • 杨氏弹性模量 —— 拉伸法 + 光杠杆法测微小长度变化
  • 示波器的使用 —— 观察波形,测量电压、频率、相位差
  • 光电效应 —— 改变频率和强度,验证爱因斯坦方程,测普朗克常数
  • 复摆的研究 —— 测重力加速度,分析转动惯量与摆长关系
  • 亥姆霍兹线圈 —— 研究均匀磁场,验证磁场叠加
  • 多普勒效应 —— 测频率变化与声源速度的关系
  • 密立根油滴 —— 测电子电荷量,验证电荷量子化
  • 波尔共振 —— 受迫振动的幅频相频特性
  • 钨的逸出功 —— 理查森直线法测热电子发射规律
  • 液体表面张力 —— 拉脱法,研究温度浓度的影响
  • 扭摆法测转动惯量 —— 验证平行轴定理

每个实验都配了 B 站的说明视频。我始终觉得,仿真不是为了替代真实实验,而是让你在走进实验室之前,已经心里有数;在走出实验室之后,还能反复回看。

二、交互式物理动画:调一调参数,物理就"活"了

如果说虚拟仿真是"做实验",那这部分就是"玩物理"。数量最多,目前有 80 多个,从初中的米尺读数,一直覆盖到大学的康普顿散射、量子隧穿。

我最喜欢它的地方在于——每一个参数都能拖

  • 想看抛体运动怎么随初速度和抛射角变化?拖一下,轨迹、速度矢量、射程实时刷新。
  • 想理解双缝干涉条纹间距跟波长、缝距的关系?调完立刻看到屏幕上的明暗变化。
  • 想体会科里奥利力为什么让旋转系里的物体偏转?让小球跑一圈就懂了。
  • 想看迈克尔逊干涉仪动镜移动时条纹的"吞吐"?推一下反射镜就行。

按领域分,大致是:

  • 力学:抛体、单摆、碰撞、弹簧振子、圆周运动、斜面摩擦、滑轮组、受迫振动、科里奥利力、陀螺进动……以及一组中学测量工具(米尺、秒表、天平、量筒)。
  • 电磁学:电场线、库仑定律、三维电场、导线磁场、RC 电路、电磁感应、平行板电容器、安培力、变压器、洛伦兹力……
  • 波动与声学:机械波、驻波、波的干涉、多普勒效应、拍频、李萨如图形、空气柱共振、马赫锥、惠更斯原理……
  • 光学:单缝衍射、双缝干涉、光栅衍射、折射、透镜成像、薄膜干涉、牛顿环、偏振与马吕斯定律、棱镜色散、迈克尔逊干涉仪,还有三原色混合、近视远视矫正、伽利略/开普勒望远镜——这部分对中学光学教学特别友好。
  • 热学:温度计使用、物态变化、布朗运动、热膨胀、理想气体、卡诺循环、热传导、麦克斯韦速率分布、黑体辐射……
  • 近代物理:光电效应、玻尔模型、放射性衰变、波粒二象性、康普顿散射、德布罗意物质波、质能方程、量子隧穿、原子能级与光谱、弗兰克-赫兹实验。

我一直相信一句话:物理学不会,多半是因为没"看见"过。 当一个学生亲手把驱动频率调到共振点,看见振幅突然飙升的那一下,他对"共振"两个字的理解,就和背公式时完全不同了。

三、物理小课堂:给更小的孩子,埋一颗种子

这块面向小学和初一的孩子,是人教版物理八年级上册的先修课,一共 9 节:

  1. 长度和时间的测量
  2. 运动与速度
  3. 声现象
  4. 温度与物态变化
  5. 光的直线传播和反射
  6. 光的折射与色散
  7. 透镜与凸透镜成像规律
  8. 眼睛、眼镜与望远镜
  9. 质量与密度的测量

我不希望物理给孩子的第一印象是"难"。所以小课堂的思路是:以实验和科技制作为载体,在动手实践里认识物理。纸杯电话体验固体传声、自制简易温度计、小孔成像、做一架简易望远镜……这些"玩具"背后,藏着的其实是最朴素的物理直觉。

早一点接触,早一点不怕。这是我做小课堂的全部理由。

四、还有一些角落

  • 实验视频:精选的大学物理实验操作视频,预习复习都能用。
  • 下载专区:实验报告模板、数据处理工具、物理常数表。
  • 学生作品:展示同学们的实验成果、创新设计——我觉得这个板块特别重要,学习是需要被"看见"的。
  • 留言板:欢迎吐槽、建议、交流。

五、我在坚持什么

做这个网站的过程里,我反复给自己定了几条规矩:

第一,能交互,就不只看。 静态图和动画的区别,就像"看别人骑车"和"自己骑"的区别。我尽量让每个页面都有能拖、能调、能玩的地方。

第二,参数要真。 抛体就是重力场里的抛物线,光电效应就是真的会算出普朗克常数。物理是诚实的,仿真也得诚实。

第三,免费、开放、不打扰。 打开网页就能用,不用注册,不用下载 App,没有弹窗广告。我希望它像一本随时能翻开的书。

第四,照顾到不同的人。 从小学的孩子,到大学做近代物理实验的学生,我希望每个人都能在这里找到适合自己的那一层。

六、还在路上

有两个板块我还没做完,老实交代一下:

  • 物理与英语(规划中):想做一个英语学习系统,学生在线背单词、练物理专业词汇,老师能在后台看进度。还在想怎么做更好。
  • 数据处理工具(修正中):面向大学物理实验的自动数据处理——偏差计算、不确定度分析、逐差法、作图。让它替学生处理那些枯燥的运算,好把精力放回实验本身。

网站会一直更新下去。下一个实验、下一个动画,我慢慢做,你们慢慢玩。

写在最后

做 aphysics.cn 这件事,没什么宏大的叙事。最初不过是觉得"物理这么好玩的东西,不该被设备和课时困住",于是动手写了起来。写到现在,它已经长成了一个我自己也会经常打开的地方。

如果你是学生,希望它能帮你多"看见"一点物理;如果你是老师,希望它能给你的课堂多一个趁手的工具;如果你只是个路过的好奇的人,那就随便点点——能在一个网页里调出彩虹、看见干涉条纹、让陀螺进动起来,这件事本身就挺浪漫的。

欢迎来 aphysics.cn 逛逛,也欢迎在留言板留下你的想法。

物理之美,值得被更多人看见。

—— aphysics.cn 站长