三体问题求解器 - 纯Python方案
一个用于模拟和可视化三体问题的Python库。使用四阶龙格-库塔法数值求解牛顿引力下的三体运动。
功能特性
- 纯Python实现:无需外部依赖(除可视化外)
- 高精度数值积分:使用四阶龙格-库塔法(RK4)
- 多种初始条件:预置8字形轨道、拉格朗日点等经典配置
- 完整可视化:3D轨迹、2D投影、相空间图、能量分析
- 物理守恒验证:动量、角动量、能量守恒检查
- 模块化设计:易于扩展和自定义
安装要求
必需依赖
- Python 3.7+
- NumPy
- Matplotlib
安装方法
# 克隆仓库
git clone <repository-url>
cd three_body_problem
# 安装依赖
pip install numpy matplotlib
快速开始
基本使用
import numpy as np
from three_body_problem import ThreeBodySolver, Particle, ThreeBodyConfig, ThreeBodyVisualizer
# 创建8字形轨道配置
particles = ThreeBodyConfig.create_figure8_config()
# 创建求解器
solver = ThreeBodySolver(particles, dt=0.001)
# 模拟10年
solver.simulate(total_time=10.0)
# 可视化
visualizer = ThreeBodyVisualizer()
visualizer.plot_trajectories(solver, title="8字形三体轨道")
visualizer.show()
运行示例
# 运行8字形轨道示例
from three_body_problem.examples import figure8
solver = figure8.run_figure8_example()
# 运行拉格朗日点示例
from three_body_problem.examples import lagrange
solver_l4 = lagrange.run_lagrange_example(lagrange_point=4, total_time=50.0)
# 运行随机系统示例
from three_body_problem.examples import random
solver_random = random.run_random_example(seed=42, total_time=15.0)
核心组件
1. Particle(质点类)
表示三体问题中的一个天体。
# 创建质点
particle = Particle(
mass=1.0, # 质量(太阳质量)
position=[1.0, 0.0, 0.0], # 位置向量 [AU]
velocity=[0.0, 6.28, 0.0], # 速度向量 [AU/年]
name="Earth", # 名称
color="blue" # 可视化颜色
)
2. ThreeBodySolver(求解器类)
主求解器,使用RK4方法积分运动方程。
# 创建求解器
solver = ThreeBodySolver(particles, dt=0.001)
# 模拟一段时间
solver.simulate(total_time=10.0, progress_interval=1000)
# 获取轨迹
trajectories = solver.get_trajectories()
# 计算质心
center_of_mass = solver.get_center_of_mass()
# 检查守恒定律
momentum_error, angular_momentum_error, energy_error = solver.get_conservation_errors()
3. ThreeBodyConfig(配置管理)
提供多种预置初始条件。
# 8字形轨道(著名的稳定解)
particles = ThreeBodyConfig.create_figure8_config()
# 拉格朗日点配置(L4或L5)
particles_l4 = ThreeBodyConfig.create_lagrange_point_config(lagrange_point=4)
particles_l5 = ThreeBodyConfig.create_lagrange_point_config(lagrange_point=5)
# 随机配置
particles_random = ThreeBodyConfig.create_random_config(
masses=None, # 随机质量
position_range=2.0, # 位置范围 ±2 AU
velocity_scale=1.0 # 速度缩放因子
)
# 自定义配置
config_dict = {
'particle_1': {'mass': 1.0, 'position': [1,0,0], 'velocity': [0,1,0], 'name': 'Star A'},
'particle_2': {'mass': 1.0, 'position': [-1,0,0], 'velocity': [0,-1,0], 'name': 'Star B'},
'particle_3': {'mass': 0.1, 'position': [0,1,0], 'velocity': [-1,0,0], 'name': 'Star C'}
}
particles_custom = ThreeBodyConfig.create_custom_config(config_dict)
4. ThreeBodyVisualizer(可视化类)
提供多种可视化选项。
visualizer = ThreeBodyVisualizer(figsize=(12, 10))
# 3D轨迹图
visualizer.plot_trajectories(solver, show_current_positions=True, show_com=True)
# 2D投影
fig, ax = visualizer.plot_2d_projection(solver, projection='xy')
# 相空间图
fig, ax = visualizer.plot_phase_space(solver, particle_index=0, dimension='x')
# 显示图形
visualizer.show()
# 保存图形
visualizer.save_figure("trajectory.png", dpi=300)
物理模型
运动方程
对于三个质点 $i=1,2,3$,每个质点的加速度为:
\vec{a}_i = G \sum_{j \neq i} \frac{m_j}{|\vec{r}_{ij}|^3} \vec{r}_{ij}
其中:
G = 4\pi^2(天文单位制)\vec{r}_{ij} = \vec{r}_j - \vec{r}_im_j是质点j的质量
单位系统
- 距离:天文单位(AU)
- 质量:太阳质量($M_\odot$)
- 时间:年(yr)
- 速度:AU/yr
- 引力常数:
G = 4\pi^2AU³/(M⊙·yr²)
数值方法
使用四阶龙格-库塔法(RK4)积分运动方程:
- 时间步长:
dt(默认0.001年) - 状态向量:18维(3个质点 × 6个自由度)
示例
示例1:8字形轨道
from three_body_problem.examples import figure8
# 运行8字形轨道示例
solver = figure8.run_figure8_example()
# 分析稳定性
figure8.analyze_figure8_stability()
示例2:拉格朗日点
from three_body_problem.examples import lagrange
# 运行L4点示例
solver_l4 = lagrange.run_lagrange_example(lagrange_point=4, total_time=100.0)
# 运行L5点示例
solver_l5 = lagrange.run_lagrange_example(lagrange_point=5, total_time=100.0)
# 比较L4和L5稳定性
lagrange.compare_lagrange_points()
示例3:随机系统
from three_body_problem.examples import random
# 运行单个随机系统
solver = random.run_random_example(seed=42, total_time=20.0)
# 运行多个随机系统比较
results = random.run_multiple_random_simulations(n_simulations=5, total_time=10.0)
运行测试
# 运行所有测试
cd three_body_problem
python -m pytest tests/ -v
# 或直接运行测试脚本
python tests/test_solver.py
性能优化建议
-
时间步长选择:
- 对于稳定轨道:
dt = 0.001(默认) - 对于快速运动系统:
dt = 0.0001 - 对于长期模拟:
dt = 0.01
- 对于稳定轨道:
-
内存管理:
- 长时间模拟时考虑定期清理轨迹历史
- 使用
reset()方法清除历史记录
-
精度控制:
- 检查能量守恒误差:应小于1e-5
- 检查动量守恒误差:应小于1e-10
扩展开发
添加新的初始条件
from three_body_problem.config import ThreeBodyConfig
class MyCustomConfig(ThreeBodyConfig):
@staticmethod
def create_my_config():
# 实现自定义配置
particles = [...]
return particles
自定义可视化
from three_body_problem.visualizer import ThreeBodyVisualizer
class MyVisualizer(ThreeBodyVisualizer):
def plot_custom_view(self, solver):
# 实现自定义可视化
pass
实现新的积分器
from three_body_problem.integrator import RK4Integrator
class MyIntegrator(RK4Integrator):
def step(self, particles, acceleration_func):
# 实现新的积分方法
pass
已知问题与限制
-
数值稳定性:
- 近距离接近可能导致数值不稳定
- 建议使用较小时间步长
dt
-
能量漂移:
- 长期模拟可能出现能量漂移
- 使用辛积分器可改善(未来版本)
-
性能:
- 纯Python实现,性能有限
- 对于大规模模拟考虑使用Numba或Cython加速
参考文献
- Chenciner, A., & Montgomery, R. (2000). A remarkable periodic solution of the three-body problem in the case of equal masses.
- Murray, C. D., & Dermott, S. F. (1999). Solar System Dynamics.
- Hairer, E., Nørsett, S. P., & Wanner, G. (1993). Solving Ordinary Differential Equations I.
许可证
MIT License
贡献
欢迎提交Issue和Pull Request!
版本历史
- v1.0.0 (2024) - 初始版本
- 实现RK4数值积分器
- 提供多种初始条件配置
- 完整的可视化功能
- 包含测试和示例
Description
Languages
Python
100%