为什么我不能在不移动的情况下制作这个2 N体系轨道(质量中心部分代码无效?)

时间:2013-12-05 22:26:08

标签: vpython

我试图让这个2 n的身体图在vpython中工作,似乎工作但是我的中心或质量有问题,或者其他什么,我真的不知道。 2 n身体系统正在转移并且不会保持静止。

from visual import*
mt= 1.99e30 #Kg
G=6.67e-11 #N*(m/kg)^2

#Binary System stars

StarA=sphere(pos=  (3.73e11,0,0),radius=5.28e10,opacity=0.5,color=color.green,make_trail=True, interval=10)
StarB=sphere(pos=(-3.73e11,0,0),radius=4.86e10,opacity=0.5, color=color.blue,make_trail=True, interval=10)
#StarC=sphere(pos=(3.44e13,0,0),radius=2.92e11,opacity=0.5, color=color.yellow,make_trail=True, interval=10)

#mass of binary stars

StarA.mass= 1.45e30 #kg

StarB.mass= 1.37e30 #kg

#StarC.mass= 6.16e29 #kg

#initial velocities of binary system
StarA.velocity =vector(0,8181.2,0)
StarB.velocity =vector(0,-8181.2,0)
#StarC.velocity= vector(0,1289.4,0)

#Time step for each binary star

dt=1e5
StarA.pos= StarA.pos + StarA.velocity*dt
StarB.pos= StarB.pos + StarB.velocity*dt
#StarC.pos= StarC.pos + StarC.velocity*dt

#Lists

objects=[]
objects.append(StarA)
objects.append(StarB)
#objects.append(StarC)

#center of mass

Ycm=0
Xcm=0
Zcm=0
Vcmx=0
Vcmy=0
Vcmz=0
TotalMass=0
for each in objects:
   TotalMass=TotalMass+each.mass

   Xcm= Xcm + each.pos.x*each.mass
   Ycm= Ycm + each.pos.y*each.mass
   Zcm= Zcm + each.pos.z*each.mass

   Vcmx= Vcmx + each.velocity.x*each.mass
   Vcmy= Vcmy + each.velocity.y*each.mass
   Vcmz= Vcmz + each.velocity.z*each.mass

for each in objects:
    Xcm=Xcm/TotalMass
    Ycm=Ycm/TotalMass
    Zcm=Zcm/TotalMass
    Vcmx=Vcmx/TotalMass
    Vcmy=Vcmy/TotalMass
    Vcmz=Vcmz/TotalMass

each.pos=each.pos-vector(Xcm,Ycm,Zcm)
each.velocity=each.velocity-vector(Vcmx,Vcmy,Vcmz)

#Code for Triple system
firstStep=0   
while True:
rate(200)
for i in objects:
    i.acceleration = vector(0,0,0)
    for j in objects:
      if i != j:
        dist = j.pos - i.pos
        i.acceleration = i.acceleration + G * j.mass * dist / mag(dist)**3
for i in objects:
    if firstStep==0:
        i.velocity = i.velocity + i.acceleration*dt

        firstStep=1
    else:
        i.velocity = i.velocity + i.acceleration*dt


    i.pos = i.pos + i.velocity*dt

2 个答案:

答案 0 :(得分:1)

我想就你的问题提出两点:

  1. 您正在使用Euler的集成方法。这是代码中的“i.velocity = i.velocity + i.acceleration * dt”部分。这种方法不是很准确,尤其是像这样的振荡问题。这是你注意到系统漂移的部分原因。我建议使用RK4 method of integration.虽然Verlet integration对你来说可能更有用,但它有点复杂但效果非常好。

  2. 您的系统可能在某个方向上有净动力。你让它们以相同的速度开始,但具有不同的质量,因此净动量不为零。为了校正这种变换,将系统转换为零动量参考系。为此,将所有恒星的动量(质量乘以速度矢量)相加,然后除以系统的总质量。这将为您提供一个速度矢量,以减去星星的所有初始速度矢量,因此您的质心不会移动。

  3. 希望这有帮助!

答案 1 :(得分:0)

这是错误的:

for each in objects:
    Xcm=Xcm/TotalMass
    ...

这种划分应该只发生一次。然后应该从对象中删除平均值,如

Xcm=Xcm/TotalMass
...
for each in objects:
    each.pos.x -= Xcm
    ...