# 定义三体问题的常量
G = 6.67430e-11 # 引力常数,单位 m^3 kg^-1 s^-2
# 定义时间步长
dt = 0.01 # 时间步长,单位秒
# 定义三体系统的初始状态
# 每一行代表一个物体的初始位置和速度,格式为[lbk]x, y, z, vx, vy, vz, m[rbk]
bodies = np.array([lbk]
[lbk]1.0, 0.0, 0.0, 0.0, 2.0*np.pi, 0.0, 5.972e24[rbk], # 地球
[lbk]0.0, 1.0, 0.0, -2.0*np.pi, 0.0, 0.0, 5.972e24[rbk], # 地球
[lbk]1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 5.972e24[rbk] # 地球
[rbk])
# 计算两个物体之间的引力
def gravity(b1, b2):
r = np.sqrt((b1[lbk]0[rbk] - b2[lbk]0[rbk])**2 + (b1[lbk]1[rbk] - b2[lbk]1[rbk])**2 + (b1[lbk]2[rbk] - b2[lbk]2[rbk])**2)
if r == 0:
return np.zeros(3)
f = G * b1[lbk]6[rbk] * b2[lbk]6[rbk] / r**3
return f * (b2[lbk]:3[rbk] - b1[lbk]:3[rbk])
# 四阶Runge-Kutta方法
def runge_kutta(bodies, dt):
k1 = np.zeros_like(bodies)
k2 = np.zeros_like(bodies)
k3 = np.zeros_like(bodies)
k4 = np.zeros_like(bodies)
for i in range(bodies.shape[lbk]0[rbk]):
# 计算k1
forces = np.sum([lbk]gravity(bodies[lbk]i[rbk], bodies[lbk]j[rbk]) for j in range(bodies.shape[lbk]0[rbk]) if i != j[rbk], axis=0)
k1[lbk]i, :3[rbk] = bodies[lbk]i, 3:6[rbk]
k1[lbk]i, 3:6[rbk] = forces / bodies[lbk]i, 6[rbk]
# 计算k2
bodies_mid = bodies + 0.5 * k1 * dt
forces_mid = np.sum([lbk]gravity(bodies_mid[lbk]i[rbk], bodies_mid[lbk]j[rbk]) for j in range(bodies.shape[lbk]0[rbk]) if i != j[rbk], axis=0)
k2[lbk]i, :3[rbk] = bodies_mid[lbk]i, 3:6[rbk]
k2[lbk]i, 3:6[rbk] = forces_mid / bodies_mid[lbk]i, 6[rbk]
# 计算k3
bodies_mid = bodies + 0.5 * k2 * dt
forces_mid = np.sum([lbk]gravity(bodies_mid[lbk]i[rbk], bodies_mid[lbk]j[rbk]) for j in range(bodies.shape[lbk]0[rbk]) if i != j[rbk], axis=0)
k3[lbk]i, :3[rbk] = bodies_mid[lbk]i, 3:6[rbk]
k3[lbk]i, 3:6[rbk] = forces_mid / bodies_mid[lbk]i, 6[rbk]
# 计算k4
bodies_end = bodies + k3 * dt
forces_end = np.sum([lbk]gravity(bodies_end[lbk]i[rbk], bodies_end[lbk]j[rbk]) for j in range(bodies.shape[lbk]0[rbk]) if i != j[rbk], axis=0)
k4[lbk]i, :3[rbk] = bodies_end[lbk]i, 3:6[rbk]
k4[lbk]i, 3:6[rbk] = forces_end / bodies_end[lbk]i, 6[rbk]
# 更新位置和速度
G = 6.67430e-11 # 引力常数,单位 m^3 kg^-1 s^-2
# 定义时间步长
dt = 0.01 # 时间步长,单位秒
# 定义三体系统的初始状态
# 每一行代表一个物体的初始位置和速度,格式为[lbk]x, y, z, vx, vy, vz, m[rbk]
bodies = np.array([lbk]
[lbk]1.0, 0.0, 0.0, 0.0, 2.0*np.pi, 0.0, 5.972e24[rbk], # 地球
[lbk]0.0, 1.0, 0.0, -2.0*np.pi, 0.0, 0.0, 5.972e24[rbk], # 地球
[lbk]1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 5.972e24[rbk] # 地球
[rbk])
# 计算两个物体之间的引力
def gravity(b1, b2):
r = np.sqrt((b1[lbk]0[rbk] - b2[lbk]0[rbk])**2 + (b1[lbk]1[rbk] - b2[lbk]1[rbk])**2 + (b1[lbk]2[rbk] - b2[lbk]2[rbk])**2)
if r == 0:
return np.zeros(3)
f = G * b1[lbk]6[rbk] * b2[lbk]6[rbk] / r**3
return f * (b2[lbk]:3[rbk] - b1[lbk]:3[rbk])
# 四阶Runge-Kutta方法
def runge_kutta(bodies, dt):
k1 = np.zeros_like(bodies)
k2 = np.zeros_like(bodies)
k3 = np.zeros_like(bodies)
k4 = np.zeros_like(bodies)
for i in range(bodies.shape[lbk]0[rbk]):
# 计算k1
forces = np.sum([lbk]gravity(bodies[lbk]i[rbk], bodies[lbk]j[rbk]) for j in range(bodies.shape[lbk]0[rbk]) if i != j[rbk], axis=0)
k1[lbk]i, :3[rbk] = bodies[lbk]i, 3:6[rbk]
k1[lbk]i, 3:6[rbk] = forces / bodies[lbk]i, 6[rbk]
# 计算k2
bodies_mid = bodies + 0.5 * k1 * dt
forces_mid = np.sum([lbk]gravity(bodies_mid[lbk]i[rbk], bodies_mid[lbk]j[rbk]) for j in range(bodies.shape[lbk]0[rbk]) if i != j[rbk], axis=0)
k2[lbk]i, :3[rbk] = bodies_mid[lbk]i, 3:6[rbk]
k2[lbk]i, 3:6[rbk] = forces_mid / bodies_mid[lbk]i, 6[rbk]
# 计算k3
bodies_mid = bodies + 0.5 * k2 * dt
forces_mid = np.sum([lbk]gravity(bodies_mid[lbk]i[rbk], bodies_mid[lbk]j[rbk]) for j in range(bodies.shape[lbk]0[rbk]) if i != j[rbk], axis=0)
k3[lbk]i, :3[rbk] = bodies_mid[lbk]i, 3:6[rbk]
k3[lbk]i, 3:6[rbk] = forces_mid / bodies_mid[lbk]i, 6[rbk]
# 计算k4
bodies_end = bodies + k3 * dt
forces_end = np.sum([lbk]gravity(bodies_end[lbk]i[rbk], bodies_end[lbk]j[rbk]) for j in range(bodies.shape[lbk]0[rbk]) if i != j[rbk], axis=0)
k4[lbk]i, :3[rbk] = bodies_end[lbk]i, 3:6[rbk]
k4[lbk]i, 3:6[rbk] = forces_end / bodies_end[lbk]i, 6[rbk]
# 更新位置和速度