电学实验模拟器面向中小学电学教学,在虚拟画布上搭建电路、运行实验、观察现象。支持常见的电学元器件——电源、开关、灯泡、电阻、滑动变阻器、电压表和电流表。元器件参数可自定义,实验过程中可随时调节开关和变阻器,实时观察灯泡亮度、电表读数等变化。
模拟器在底层使用改进节点分析法(Modified Nodal Analysis, MNA)对电路进行精确求解。MNA 是 SPICE 等工业级电路仿真器的核心算法,能够处理任意拓扑的线性电路。
电路中,流过导体的电流与导体两端的电压成正比,与导体的电阻成反比:
其中 \(I\) 为电流(安培 A),\(V\) 为电压(伏特 V),\(R\) 为电阻(欧姆 Ω)。
在电路的任一节点上,流入节点的电流之和等于流出节点的电流之和:
沿任一闭合回路绕行一周,各元件电压降的代数和为零:
改进节点分析法将 KCL 和 KVL 统一为一个矩阵方程。选择电路中所有非参考节点(排除地节点),对每个节点写出 KCL 方程;对每个独立电压源补充一个方程以确保其两端电压差等于源电压。
其中各块的含义:
| 块 | 维度 | 含义 |
|---|---|---|
| \(\mathbf{G}\) | \(n \times n\) | 电导矩阵——每个电阻性元件向其两端节点贡献电导 \(g = 1/R\) |
| \(\mathbf{B}\) | \(n \times m\) | 电压源关联矩阵——标记每个电压源连接在哪个节点对上 |
| \(\mathbf{C}\) | \(m \times n\) | \(\mathbf{B}^T\),确保对称性 |
| \(\mathbf{D}\) | \(m \times m\) | 零矩阵(纯电压源无内阻时) |
| \(\mathbf{v}\) | \(n \times 1\) | 未知量——各节点电压 |
| \(\mathbf{i}\) | \(m \times 1\) | 未知量——流过各电压源的电流 |
| \(\mathbf{s}\) | \(n \times 1\) | 注入节点的已知电流源(本模拟器中全为零) |
| \(\mathbf{e}\) | \(m \times 1\) | 已知——各电压源的电压值 |
对于连接在节点 \(i\) 和 \(j\) 之间的电阻 \(R\)(电导 \(g = 1/R\)):
对于连接在节点 \(i\) (+) 和 \(j\) (−) 之间的电压源 \(V_s\)(第 \(k\) 个电压源):
组装好矩阵后,使用高斯消元法(部分选主元)求解线性方程组 \(\mathbf{A}\mathbf{x}=\mathbf{b}\)。从解向量中提取各节点电压和各元件电流,计算功率 \(P = VI\)。
| 元件 | 处理方式 |
|---|---|
| 闭合开关 | 等效为 0.001Ω 小电阻,近似短路 |
| 断开开关 | 电导为 0,从矩阵中排除 |
| 电压表 | 内阻 1MΩ,并联在被测元件两端——高内阻确保测量时不显著分流 |
| 电流表 | 内阻 0.001Ω,串联在电路支路中——低内阻确保测量时不显著分压 |
| 滑动变阻器 | 电阻值由滑块位置在 minR 和 maxR 之间线性插值 |
| 灯泡 | 非欧姆元件,两遍求解——电阻随电压变化(冷态为热态 1/10),详见第 5 节 |
| 元件 | 符号 | 默认参数 | 可调参数 |
|---|---|---|---|
| 电源(电池) | 9V | 电压 1.5–24V | |
| 开关 | 闭合 | 开/关 | |
| 灯泡 | 额定 3V, 1W | 额定电压 1–24V, 额定功率 0.1–10W | |
| 电阻 | 100Ω | 电阻 1–1000Ω | |
| 滑动变阻器 | 0–200Ω, 中点 | 最大电阻 1–1000Ω, 滑块位置 0–100% | |
| 电压表 | 内阻 1MΩ | 只读 | |
| 电流表 | 内阻 0.001Ω | 只读 |
| 操作 | 方式 | |
|---|---|---|
| 放置元件 | 左侧面板点击元件 → 画布上点击放置 | |
| 旋转元件 | 选中元件后点击"旋转"按钮(或按 R 键) | |
| 移动元件 | 拖拽选中元件 | |
| 连线 | 点击元件端子(蓝色圆点)→ 点击另一个端子完成连线 | |
| 切换开关 | 先点击选中,再点击切换开/关 | |
| 调节变阻器 | 拖拽画布上变阻器的红色箭头,或在参数面板调节滑块 | |
| 修改参数 | 选中元件后在右侧参数面板调节 | |
| 缩放画布 | 删除元件/导线 | 选中后点击"删除"按钮(或按 Delete 键) |
| 撤销操作 | Ctrl+Z 撤销最近改动 | |
| 导出/导入 | 左侧"导出电路"/"导入电路"按钮(Ctrl+S 快捷保存为 JSON 文件) | |
| 缩放画布 | 鼠标滚轮 | |
| 平移画布 | 右键拖拽(或 Ctrl+拖拽 / 中键拖拽) | |
| 取消操作 | Esc 键(或右键点击)退出放置/连线模式 |
白炽灯泡的钨丝在通电后急剧升温(可达 2500K),金属电阻率随温度升高而增大。因此灯泡是典型的非欧姆元件——其 I-V 曲线并非直线,电阻随两端电压升高而增大。
参考 PhET 交互式模拟的做法,灯泡电阻通过两遍求解确定:
该方法避免了迭代收敛问题,同时保持了物理合理性:低电压时电阻接近冷态,额定电压时达到热态设计值,过压时电阻进一步升高。
亮度在 0 到 1 之间,通过径向渐变模拟灯丝发光——低功率暗红,满功率亮白。
电路可保存为 JSON 文件,方便学生提交作业或教师分发示例。文件结构:
{
"version": 1,
"comps": [
{ "id": 0, "type": "battery", "col": -1, "row": 0, "orientation": "horizontal",
"params": { "voltage": 9 } },
...
],
"wires": [
{ "compA": 0, "termA": 0, "compB": 2, "termB": 1 },
...
]
}
每个元件保留完整参数(含额定电压、额定功率、变阻器位置等),导入时自动还原完整电路状态。Ctrl+S 可快速保存。