Почему я не могу вывести эту систему из двух N-тел без смещения (код части масс-центра не работает?)
Я пытаюсь заставить эту диаграмму из 2 n тел работать в vpython, кажется, что она работает, но что-то не так с моим центром или массой, или что-то, я действительно не знаю. Система 2 n body смещается и не стоит на месте.
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 ответа
Два замечания, которые я хотел бы сделать по поводу вашей проблемы:
Вы используете метод интеграции Эйлера. Это часть вашего кода "i.velocity = i.velocity + i.acceleration * dt". Этот метод не очень точен, особенно с такими колебательными проблемами, как этот. Это одна из причин, по которой вы замечаете дрейф в вашей системе. Я бы рекомендовал использовать метод интеграции RK4. Это немного сложнее, но дает очень хорошие результаты, хотя интеграция с Verlet может быть более полезной для вас.
Ваша система может иметь чистый импульс в каком-то направлении. Они начинаются с одинаковой скорости, но имеют разные массы, поэтому суммарный импульс не равен нулю. Чтобы исправить это, преобразуйте систему в систему отсчета с нулевым импульсом. Для этого сложите импульс (вектор скорости и массы) всех звезд, а затем разделите их на общую массу системы. Это даст вам вектор скорости, который нужно вычесть из всех ваших начальных векторов скорости звезд, и ваш центр масс не будет двигаться.
Надеюсь это поможет!
Это не верно:
for each in objects:
Xcm=Xcm/TotalMass
...
Это разделение должно произойти только один раз. И тогда средние должны быть удалены из объектов, как в
Xcm=Xcm/TotalMass
...
for each in objects:
each.pos.x -= Xcm
...