三体网站:www.threebody.com.cn,三体社区

 找回密码
 注册
搜索
12
返回列表 发新帖
楼主: qianshuiyuan

怎么用pyhton解决三体问题

[复制链接]
白ice- 发表于 6 天前 | 显示全部楼层
楼上几位吵成这样 都涉及到人身攻击了 难道想不到丢到deepseek里吗?
(别跟我说用ai编程不如手搓到有实力 还有几个月我就计算机会考了都没急你倒急上了)

以下是用Python编写的三体问题模拟程序,使用数值方法模拟三个天体在引力作用下的运动轨迹:

```python
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

# 常量设置
G = 6.67430e-11  # 引力常数 (m³ kg⁻¹ s⁻²)
dt = 1000        # 时间步长 (秒)
total_time = 5e5  # 总模拟时间 (秒)
n_steps = int(total_time // dt)

# 天体初始条件 (质量、位置、速度)
m = np.array([1e24, 1e24, 1e24])  # 三个天体质量 (kg)

# 初始位置 (米)
pos = np.array([
    [-1e9, 0],      # 天体1初始位置
    [1e9, 0],       # 天体2初始位置
    [0, 1.732e9]    # 天体3初始位置 (形成等边三角形)
])

# 初始速度 (米/秒)
vel = np.array([
    [0, -5e3],
    [0, 5e3],
    [0, 0]
])

# 轨迹存储
trajectory = np.zeros((3, n_steps, 2))

def compute_acceleration(pos, m):
    """计算每个天体的加速度"""
    acc = np.zeros_like(pos)
    for i in range(3):
        for j in range(3):
            if i != j:
                r_vec = pos[j] - pos[i]
                r = np.linalg.norm(r_vec)
                acc[i] += G * m[j] * r_vec / (r**3 + 1e-9)  # 防止除以零
    return acc

# 主模拟循环
for step in range(n_steps):
    # 存储当前位置
    trajectory[:, step] = pos
   
    # 计算加速度
    acc = compute_acceleration(pos, m)
   
    # 更新速度
    vel += acc * dt
   
    # 更新位置
    pos += vel * dt

# 可视化设置
fig, ax = plt.subplots(figsize=(10, 10))
ax.set_title("Three-Body Problem Simulation")
ax.set_xlabel("X Position (m)")
ax.set_ylabel("Y Position (m)")
colors = ['red', 'blue', 'green']
plots = [ax.plot([], [], '-', c=colors[i], lw=0.5)[0] for i in range(3)]
dots = [ax.plot([], [], 'o', c=colors[i], markersize=10)[0] for i in range(3)]

def init():
    ax.set_xlim(-3e9, 3e9)
    ax.set_ylim(-3e9, 3e9)
    return plots + dots

def update(frame):
    frame = frame * 100  # 加快动画速度
    for i in range(3):
        x = trajectory[i, :frame, 0]
        y = trajectory[i, :frame, 1]
        plots[i].set_data(x, y)
        dots[i].set_data(trajectory[i, frame, 0], trajectory[i, frame, 1])
    return plots + dots

ani = FuncAnimation(fig, update, frames=n_steps//100, init_func=init, blit=True, interval=20)
plt.show()
```

### 关键特性说明:
1. **物理模型**:
- 使用牛顿万有引力定律计算天体间相互作用
- 采用显式欧拉法进行数值积分
- 包含防零除保护机制

2. **初始条件**:
- 三个质量相等的天体(1×10²⁴ kg)
- 初始位置构成等边三角形
- 赋予初始速度形成旋转系统

3. **可视化功能**:
- 实时显示天体运动轨迹
- 不同颜色区分三个天体
- 动态更新当前位置标记
- 自适应坐标系范围

4. **数值参数**:
- 时间步长:1000秒
- 总模拟时间:约5.8天
- 轨迹采样间隔:每100步记录一次

### 运行说明:
1. 需要安装NumPy和Matplotlib库
2. 模拟结果会显示天体复杂的运动轨迹
3. 由于数值积分方法的限制,长期模拟可能出现能量误差
4. 可通过调整初始条件观察不同运动模式

该程序展示了三体问题的典型特征:非线性、混沌行为以及对初始条件的极端敏感性。由于三体问题没有解析解,这种数值模拟是研究其动力学特性的主要方法。
syc55555@ETO 发表于 前天 13:44 | 显示全部楼层
报错了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|三体网站:www.threebody.com.cn,三体社区

GMT+8, 2025-4-4 06:25 , Processed in 0.045100 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表