0

我正在尝试使这个 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
4

2 回答 2

1

关于你的问题,我想说两点:

  1. 您正在使用欧拉的积分方法。那就是代码的“i.velocity = i.velocity + i.acceleration*dt”部分。这种方法不是很准确,尤其是像这样的振荡问题。这就是您注意到系统漂移的部分原因。我建议使用RK4 集成方法。它有点复杂,但结果非常好,尽管Verlet 集成在这里可能对您更有用。

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

希望这可以帮助!

于 2014-01-21T09:31:51.830 回答
0

这是错误的:

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

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

Xcm=Xcm/TotalMass
...
for each in objects:
    each.pos.x -= Xcm
    ...
于 2014-03-09T00:14:31.360 回答