GNU General Public License v2.0

技术解读

以下内容由 GitRead 中文社区 编辑团队基于项目 README 与官方资料整理, 结合中文开发者的常见使用场景补充技术选型建议。具体以项目官方文档为准。

CircuitJS1 离线版:把浏览器里的电路实验室装进口袋

项目背景与痛点

Falstad 的 Circuit Simulator 是很多电子工程师和物理教师的“启蒙工具”:拖几个电阻电容、接上示波器,几秒钟就能看到 RC 充放电曲线。但它长期以网页形态存在,核心入口是 falstad.com 上的在线页面。这个形态在课堂投影、机房演示、出差路上做拓扑速验时,都会带来问题——没网就意味实验无法进行。

社区里不缺“把网页打包成桌面应用”的尝试,但大多数只是给 Chromium 套个壳,代价是本地文件读写、窗口状态、剪贴板、多实例这些原生能力全部丢失,最后变成一个“离线但难用”的浏览器。SEVA77/circuitjs1 的价值就在于此:它用定制版 NW.js 做外壳,把 CircuitJS1 变成真正意义上的 standalone 应用——双击即开、断网可用、能直接读写本地电路文件。这不是炫技,而是把一个教学工具从“网页”拉回“软件”的形态。

核心技术揭秘

要理解这个仓库,必须先看清它继承的技术债与红利。CircuitJS1 的源码主体是 Java,通过 GWT(Google Web Toolkit) 编译成 JavaScript 在浏览器里跑。也就是说,你在界面上看到的每一个元件、每一次矩阵求解,源头都是 Java 类。这个选择在 2010 年代很聪明:算法层与 UI 层同语言,工程师不用在 JS 里手写数值代码;代价是构建链沉重,调试只能对着混淆后的 JS,GWT 生态如今也基本停更。

电路求解走的是经典的 改进节点分析(MNA):把电路抽象成 G·v = i 的线性方程组,节点电压是未知量,独立电压源额外引入支路电流作为未知量。难点从来不在“列方程”,而在“解方程”:

  • 非线性元件(二极管、BJT、MOS)用 Newton-Raphson 迭代线性化,每轮把器件替换成“等效电导 + 等效电流源”的伴随模型,重新装配矩阵;
  • 动态元件(电容、电感)用梯形法或后向欧拉离散,历史状态折算成历史电流源注入右端项;
  • 矩阵求解靠 LU 分解,并在稀疏结构上做优化;
  • 时间步长自适应:一旦迭代不收敛或残差超限,就缩小步长重算,避免在开关瞬间“炸掉”。

数据流可以概括为下面这条闭环:

graph TD A[用户放置元件] --> B[CircuitElm 子类实例] B --> C[属性编辑与参数变更] C --> D[装配 MNA 矩阵] D --> E[Newton-Raphson 迭代求解] E --> F{"残差收敛?"} F -->|"否"| G[缩小时间步长] G --> E F -->|"是"| H[回填节点电压与支路电流] H --> I[Canvas 渲染与示波器] I --> J[序列化为文本电路] J --> K[NW.js 本地文件系统] K --> L[离线重载与分享]

值得单独说的是元件模型的设计:CircuitElm 是抽象基类,电阻、电容、晶体管各自实现 doStep、calculateCurrent、getVoltageDiff 等钩子,渲染与仿真逻辑绑在同一个对象上。这种“元件即对象、状态即字段”的做法牺牲了模型与视图的彻底解耦,却换来了极高的开发效率——加一个新器件,基本就是写一个子类。

功能亮点与差异

第一,电路文件是纯文本。 CircuitJS1 的 .circuitjs.txt 一行描述一个元件,字段顺序固定、人类可读。这一点被严重低估:它意味着电路可以被脚本批量生成、可以进 Git 做 diff、可以在 CI 里做“拓扑回归”。很多同类模拟器的工程文件是二进制或 XML 黑盒,天然拒绝版本控制。

第二,离线 + 原生文件系统。 NW.js 把 Node 运行时塞进 Chromium,应用可以直接调 fs 读写任意路径,配合定制外壳,窗口尺寸、最近打开记录这些状态都能持久化。这正是纯浏览器方案做不到的。

第三,交互式探针与实时波形。 相比 SPICE 那套“写网表、跑批处理、看输出文件”的流程,CircuitJS1 是所见即所得的:拖动探针即可看任意两点波形,改参数立刻重算。对教学和快速验证,这个反馈回路短得多。

第四,SPICE 网表的有限导入。 它提供了对常见 SPICE 子集的解析,能把一部分外部网表拉进来做可视化,算是与专业工具之间的一座便桥。

应用场景与落地建议

适合的场景很明确:课堂教学与演示、硬件工程师做拓扑级速验(比如滤波器的截止频率、分压网络、简单放大器的偏置点)、无网环境的现场排障。如果你只是要确认“这个 RC 时间常数对不对”,它比打开 LTspice 快十倍。

但要上生产环境,有几条红线得先划清楚:

  1. 它不是精密仿真器。 器件模型是简化的,没有工艺角、没有温度模型、没有寄生参数。别拿它做电源环路稳定性或 IC 级验证。
  2. 浮空子网是雷区。 MNA 要求每个节点对地有直流通路,孤立的子电路会导致矩阵奇异。工程上要么加高阻对地电阻,要么在建模时就把参考点接好。
  3. 理想电压源环路会直接崩。 两个理想电压源并联、或电压源与电感构成纯环流回路,方程无解。换用带内阻的等效模型。
  4. GWT 产物不要轻易改。 要改行为,优先改 Java 源码后重新编译;直接改 war/ 下的 JS 是给自己挖坑。

如果把它的文本电路格式接进自动化流水线——比如用脚本生成一批参数扫描电路、批量跑仿真、提取波形特征做断言——它能变成一个轻量的“电路单元测试框架”,这是它被低估的工程价值。

综合评价

优点: 离线可用、零安装依赖;MNA + Newton-Raphson 的求解链路经典且实现相对干净;元件模型的可扩展性好;文本电路格式对版本控制和脚本化极其友好;交互反馈速度是同类工具里的第一梯队。

缺点: 技术栈明显老化,GWT 编译链维护成本高、调试体验差;UI 停留在十年前的审美与交互习惯;缺少自动化测试与 CI,发布靠手工打包;单维护者模式意味着长期演进存在不确定性;仿真精度与收敛鲁棒性无法与专业 SPICE 相比。

一句话结论: 它是一个“形态正确”的工具——把最好的教学电路模拟器从浏览器里解放出来,代价是承接了 GWT 时代的技术债。对教学与快速验证,它足够好;对严肃的工程仿真,请老老实实回到 SPICE。

关于

GitHub 原始描述(英文)

Standalone (offline) version of the Circuit Simulator with small modifications based on modified NW.js.

描述取自 GitHub 官方 API,保持仓库作者书写的原文。

简要分析

热度分
684
价值分
334
活跃状态
活跃

语言占比

CSS
HTML
Inno Setup
Java
JavaScript
Shell

贡献者

README

CircuitJS1 Desktop Mod

Circuit Simulator is renamed CircuitJS1 Desktop Mod

The source code for offline version of the Circuit Simulator with minor modifications based on modified NW.js. It was originally written by Paul Falstad as a Java Applet. It was adapted by Iain Sharp to run in the browser using GWT. The program was modified and compiled to offline version for Windows (x32, x64), Linux (x32, x64) and MacOS (x64, arm64) by Usevalad Khatkevich.

This program is distributed by me as a program for education. It is not recommended to use the program for modeling real circuits, since many components in the program are idealized.

The program supports the following languages: English, Russian, Danish, German, Polish, Spanish, French, Italian, Portuguese, Czech, Norwegian, Chinese, Japanese.

For a web version of the application see:

Paul’s Page: https://www.falstad.com/circuit/
Source code: https://github.com/pfalstad/circuitjs1

Iain’s Page: https://lushprojects.com/circuitjs/
Source code: https://github.com/sharpie7/circuitjs1

Downloads:

You can download this program for Windows (x32, x64), Linux (x32, x64) and Mac OS X (x64, arm64):

If you have problems with this application, you can try to use this offline application of the main developer based on Electron.

Building the program

The tools you will need to build the project are:

  • JDK 8+
  • Maven 3+
  • Node.js with npm

Install the dependencies in the local node_modules folder:

npm install

For full build for all platforms without rebuilding GWT app run:

npm run build

For full build with rebuilding GWT app run:

npm run full

Output folder: ./out/

Also you can build only the GWT application:

npm run buildgwt

and run it in NW.js SDK version:

npm start

Output folder: ./target/site/

Development

Various build options, checker and devmod are available in the development menu:

npm run dev

Separate commands:

Check the build steps:

npm run check

Run devmode:

npm run devmode

Devmode works directly in the war directory separate from the target/site directory.

License

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

© Usevalad Khatkevich 2025

Credits

  • Paul Falstad - Creator
  • Iain Sharp - JavaScript conversion, so there are more opportunities for the development of this application.
  • Brian Gordon - Mavenized version of circuitjs1

评论

暂无评论