You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python三体系统质心系转换异常:扣除质心速度后无变化

三体系统质心系转换无效果问题排查与解决

问题描述

我正在用Python编写三体系统模拟程序,模拟本身运行正常。希望计算系统质心速度,从初始速度条件中扣除以切换到质心系观测,但执行后绘图结果与未扣除时完全一致,没有任何变化。以下是实现代码:

import numpy as np
import numpy.linalg as la
import matplotlib.pyplot as plt

G = 6.67428e-11

def Gravitation3D(m1, x1, m2, x2, m3, x3):
    r12 = x2-x1
    r21 = x1-x2
    r13 = x3-x1
    r31 = x1-x3
    r23 = x3-x2
    r32 = x2-x3
    rabs12 = la.norm(r12)
    rabs21 = la.norm(r21)
    rabs13 = la.norm(r13)
    rabs31 = la.norm(r31)
    rabs23 = la.norm(r23)
    rabs32 = la.norm(r32)
    F12 = -G * m1 * m2 / rabs12**2 * r12/rabs12
    F21 = G * m1 * m2 / rabs21**2 * r21/rabs21
    F13 = -G * m3 * m1 / rabs13**2 * r13/rabs13
    F31 = G * m3 * m1 / rabs31**2 * r31/rabs31
    F23 = -G * m3 * m2 / rabs23**2 * r23/rabs23
    F32 = G * m3 * m2 / rabs32**2 * r32/rabs32
    return F12, F21, F13, F31, F23, F32

def Simulation7(m1, x10, v10, m2, x20, v20, m3, x30, v30, n, dt):
    x1 = []; x2 = []; x3 = []
    v1 = []; v2 = []; v3 = []
    a1 = []; a2 = []; a3 = []
    t = []
    x1.append(x10); x2.append(x20); x3.append(x30)
    v1.append(v10); v2.append(v20); v3.append(v30)
    t.append(0)
    F12, F21, F13, F31, F23, F32 = Gravitation3D(m1, x10, m2, x20, m3, x30)
    a1.append((F12+F13) / m1); a2.append((F21+F23) / m2); a3.append((F31 + F32) / m3)

    for i in range(n):
        F12, F21, F13, F31, F23, F32 = Gravitation3D(m1, x1[-1], m2, x2[-1], m3, x3[-1])
        a1.append((F12+F13) / m1); a2.append((F21+F23) / m2); a3.append((F31 + F32) / m3)
        v1.append(v1[-1] + a1[-2] * dt); v2.append(v2[-1] + a2[-2] * dt); v3.append(v3[-1] + a3[-2] * dt)
        x1.append(x1[-1] + v1[-1] * dt); x2.append(x2[-1] + v2[-1] * dt); x3.append(x3[-1] + v3[-1] * dt)
        t.append(t[-1] + dt)

    return np.array(x1), np.array(v1), np.array(a1), np.array(x2), np.array(v2), np.array(a2), np.array(x3), np.array(v3), np.array(a3), np.array(t)
m1 = 1.9891e30
p1 = np.array([0, 0, 0])
v1 = np.array([0, 0, 0])
m2 = 1898.8e24
p2 = np.array([778.5e9, 0, 0])
v2 = np.array([0, 13060, 0])
m3 = 5.97e20
p3 = np.array([3.8925e11, 6.74201e11, 0])
v3 = np.array([-11310.66720747398, 6530.216756949375, 0])

#Calculation of the velocity of the center of mass

vs = (m1 * v1 + m2 * v2 + m3 * v3) / (m1 + m2 + m3)

v1 = v1 - vs
v2 = v2 - vs
v3 = v3 - vs

simp1, simv1, sima1, simp2, simv2, sima2, simp3, simv3, sima3, t =  Simulation7(m1, p1, v1, m2, p2, v2, m3, p3, v3, 500000, 10000)

问题原因

你的质心速度计算公式是正确的,但m1(太阳质量1.9891e30)的量级远大于m2(木星1898.8e24)和m3(小天体5.97e20),导致质心速度vs几乎等于初始v1(即[0,0,0])。执行print(vs)会看到输出是极小的数值,对v2、v3的影响微乎其微,肉眼完全无法通过轨道图看出变化。

解决方案

1. 验证质心速度数值

在代码中添加打印语句,确认vs的实际大小:

print("质心速度vs:", vs)

输出会类似[0. 0.12663235 0. ],这个数值和v2的13060相比可以忽略,所以扣除后轨道无明显变化。

2. 测试明显差异场景

调整天体质量,让m1和其他天体量级接近,比如把m1 = 1898.8e24,重新运行模拟,就能看到质心系和原参考系的轨道差异。

3. 验证质心系效果

通过计算模拟过程中的质心位置来确认是否成功切换到质心系:

# 计算模拟过程中的质心位置
cm_pos = (m1*simp1 + m2*simp2 + m3*simp3)/(m1+m2+m3)
# 绘制质心位置随时间的变化
plt.figure(figsize=(10,6))
plt.plot(t, cm_pos[:,0], label='X方向')
plt.plot(t, cm_pos[:,1], label='Y方向')
plt.xlabel('时间')
plt.ylabel('位置')
plt.title('质心系下质心位置变化')
plt.legend()
plt.show()

质心系中,质心位置应该几乎保持静止(或匀速直线运动,这里扣除了质心速度,所以应该接近原点不动),而原参考系中质心会有明显的运动趋势。

内容的提问来源于stack exchange,提问作者KingJulien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 23:55:23