利用 Runge-Kutta 4 阶方法(RK4) 对三体问题进行数值求解,通过 Python 脚本生成静态轨迹图和 GIF 动画,并提供基于 Canvas 的交互式 HTML 可视化——实时调节参数、观察混沌系统的蝴蝶效应。
三体问题(Three-Body Problem)是经典力学中著名的不可积系统:三个质点在万有引力作用下的运动不存在通解,且具有初值敏感性(混沌)——初始条件的微小差异将导致长期轨迹的彻底分岔。
本项目:
- 用 RK4 方法 对 12 维一阶 ODE 进行数值积分
- 以 Figure-8 周期轨道(Chenciner & Montgomery, 2000)为基准,通过微扰对比展示蝴蝶效应
- 提供 Python(静态输出) 和 HTML(交互式) 两种运行方式
# 1. 安装依赖
pip install -r requirements.txt
# 2. 运行模拟
python main.py
# 3. 查看结果
# 输出文件在 output/ 目录中运行效果: 自动生成 4 个场景的轨迹图、GIF 动画、能量分析图和混沌对比图。
直接双击打开 three_body.html,或:
# Windows
start three_body.html
# macOS
open three_body.html无需任何服务器、构建工具或网络连接 —— 纯浏览器前端。
天体
定义 12 维状态向量:
使用 经典 RK4 递推:
防止天体距离为零时引力发散:
TB_nummodel/
├── three_body.py # 核心模块:ODE 右端函数、RK4 积分器、能量计算
├── config.py # 配置模块:多组初始条件(Figure-8 / 微扰 / 随机 / 两体)
├── visualize.py # 可视化模块:轨迹图、GIF 动画、混沌对比图
├── main.py # 主入口:一键运行所有场景
├── three_body.html # 交互式 Web 可视化(Canvas + 实时 RK4)
├── requirements.txt # Python 依赖
├── README.md # 本文件
├── 实现步骤.md # 详细实现步骤文档
├── 项目信息.md # 原始需求
├── output/ # Python 脚本输出目录
│ ├── figure8.gif # Figure-8 周期轨道动画
│ ├── figure8_energy.png # Figure-8 能量曲线
│ ├── figure8_trajectory.png # Figure-8 静态轨迹
│ ├── perturbed.gif # 微扰轨道动画(展示混沌)
│ ├── perturbed_trajectory.png # 微扰轨迹
│ ├── chaos_comparison.png # 基准 vs 微扰对比
│ ├── random.gif # 随机三体运动
│ ├── random_trajectory.png # 随机轨迹
│ ├── two_body_test.png # 两体退化测试
│ └── two_body_energy.png # 两体能量曲线
└── screenshots/ # 代码截图目录
| 功能 | 说明 |
|---|---|
| 🎬 预设场景 | Figure-8 / 微扰 / 随机 / 两体 — 一键切换 |
| ⏯️ 实时模拟 | JS 版 RK4 求解器在 Canvas 中持续积分 |
| 🌠 拖尾轨迹 | 渐变色轨迹拖尾,长度可调(100~2000) |
| ⚡ 对比模式 | 双画面并排:基准轨道 vs 微扰轨道,直观展示蝴蝶效应 |
| 📊 能量监控 | 底部实时能量曲线(动能/势能/总能量),顶部漂移百分比 |
| 🎚️ 参数调节 | 15 个滑块:每个天体的质量、位置、速度 + G/dt/软化因子 |
| 🖱️ 视角操作 | 拖拽平移 · 滚轮缩放 · 双击自动适配 |
| ⌨️ 快捷键 | 1-4 预设 · Space 暂停 · R 重置 · C 对比 |
| 场景 | 说明 | 混沌特性 |
|---|---|---|
| Figure-8 轨道 | 三维体沿"8"字形做严格周期运动(周期 T ≈ 6.33) | 周期解,无混沌 |
| 微扰 Figure-8 | 在 Figure-8 初始条件的 vx₁ 上加 ε = 0.01 | 短时间后轨迹完全偏离 |
| 随机初始条件 | 等边三角形顶点 + 随机扰动 + 切向速度 | 一般混沌运动 |
| 两体退化测试 | m₂ = 0,验证轨道为椭圆 | 无混沌(可积系统) |
| 测试项 | 结果 |
|---|---|
| 两体退化测试(椭圆轨道) | ✅ 通过 |
| 能量守恒(Figure-8, 5T) | ✅ 漂移 < 0.0001% |
| 能量守恒(两体, 20T) | ✅ 漂移 < 0.0001% |
| Figure-8 周期性(1T 后位置误差) | ✅ < 2×10⁻⁴ |
| 混沌演示(5T 后轨迹分岔) | ✅ 视觉明显 |
| 层 | 技术 |
|---|---|
| Python 数值计算 | NumPy, SciPy |
| Python 可视化 | Matplotlib, Pillow (GIF) |
| Web 图形 | HTML5 Canvas, JavaScript (classic RK4) |
| Web 样式 | CSS Grid, CSS 自定义属性, 深色主题 |
| 参数 | Python 默认值 | HTML 默认值 | 说明 |
|---|---|---|---|
| G | 1.0 | 1.0 | 万有引力常数(归一化) |
| dt | 0.001 | 0.001 | 积分步长 |
| softening (ε) | 0.001 | 0.001 | 软化因子 |
| t_max | 31.63 | — | 总模拟时间(5 个 Figure-8 周期) |
| 积分方法 | RK4 | RK4 | 经典四阶 Runge-Kutta |
MIT — 自由使用、修改和分发。
- Chenciner, A., & Montgomery, R. (2000). A remarkable periodic solution of the three-body problem in the case of equal masses. Annals of Mathematics, 152(3), 881-901.
- Simó, C. (2002). Dynamical properties of the figure eight solution of the three-body problem.
- Hairer, E., Nørsett, S. P., & Wanner, G. (1993). Solving Ordinary Differential Equations I: Nonstiff Problems.