Skip to content

Shnmg33/Three-Body-Simulation

Repository files navigation

🌌 三体问题数值模拟

利用 Runge-Kutta 4 阶方法(RK4) 对三体问题进行数值求解,通过 Python 脚本生成静态轨迹图和 GIF 动画,并提供基于 Canvas 的交互式 HTML 可视化——实时调节参数、观察混沌系统的蝴蝶效应。


📖 项目简介

三体问题(Three-Body Problem)是经典力学中著名的不可积系统:三个质点在万有引力作用下的运动不存在通解,且具有初值敏感性(混沌)——初始条件的微小差异将导致长期轨迹的彻底分岔。

本项目:

  • RK4 方法 对 12 维一阶 ODE 进行数值积分
  • Figure-8 周期轨道(Chenciner & Montgomery, 2000)为基准,通过微扰对比展示蝴蝶效应
  • 提供 Python(静态输出)HTML(交互式) 两种运行方式

🚀 快速开始

方式一:Python 脚本

# 1. 安装依赖
pip install -r requirements.txt

# 2. 运行模拟
python main.py

# 3. 查看结果
# 输出文件在 output/ 目录中

运行效果: 自动生成 4 个场景的轨迹图、GIF 动画、能量分析图和混沌对比图。

方式二:交互式 HTML

直接双击打开 three_body.html,或:

# Windows
start three_body.html

# macOS
open three_body.html

无需任何服务器、构建工具或网络连接 —— 纯浏览器前端。


🧠 数学背景

运动方程

天体 $i$ 的加速度由万有引力定律给出:

$$\ddot{\mathbf{r}}_i = \sum_{j \neq i} \frac{G m_j (\mathbf{r}_j - \mathbf{r}_i)}{|\mathbf{r}_j - \mathbf{r}_i|^3}$$

降阶为一阶 ODE

定义 12 维状态向量:

$$\mathbf{Y} = [x_0, y_0, v_{x0}, v_{y0},; x_1, y_1, v_{x1}, v_{y1},; x_2, y_2, v_{x2}, v_{y2}]^T$$

使用 经典 RK4 递推:

$$\begin{aligned} k_1 &= f(t, \mathbf{Y}) \\ k_2 &= f(t + \frac{h}{2}, \mathbf{Y} + \frac{h}{2}k_1) \\ k_3 &= f(t + \frac{h}{2}, \mathbf{Y} + \frac{h}{2}k_2) \\ k_4 &= f(t + h, \mathbf{Y} + h k_3) \\ \mathbf{Y}_{n+1} &= \mathbf{Y}_n + \frac{h}{6}(k_1 + 2k_2 + 2k_3 + k_4) \end{aligned}$$

软化因子

防止天体距离为零时引力发散:

$$r = \sqrt{dx^2 + dy^2 + \varepsilon^2}, \quad \varepsilon = 10^{-3}$$


📁 项目结构

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/           # 代码截图目录

🎮 HTML 交互式功能

功能 说明
🎬 预设场景 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

📝 License

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.

About

三体问题数值模拟 — 利用龙格-库塔法(RK4)模拟三个天体在引力作用下的运动,展示混沌系统的不可预测性。含Python静态输出和HTML交互式Canvas可视化。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors