Две массы, соединенные пружиной... пытающиеся симулировать полет, но испытывающие трудности
У нас есть две массы одинаковой массы 0,1 кг, соединенные жесткой пружиной с k = 10^5 Н / м. Длина покоя пружины (и начальное расстояние между двумя массами) составляет d0 = 0,15 м.
Масса 1 имеет начальную скорость (2,77, 1,25, 0) м / с, а масса 2 имеет начальную скорость (1,25, 4, 0) м / с.
Я хочу написать код, который имитирует полет этой системы под действием силы тяжести, игнорируя сопротивление воздуха. Я также хочу разместить третью сферу, расположенную в центре масс системы.
Вот что я написал до сих пор:
from visual import *
mass1 = sphere(radius = 0.01)
mass2 = sphere(pos = (0.15, 0, 0), radius = 0.01)
COM = sphere(pos = (0.15/2, 0, 0), radius = 0.01)
mass1.m = 0.1
mass2.m = 0.1
k = 1*10**5
mass1.v = vector(2.77, 1.25, 0)
mass2.v = vector(1.25, 4, 0)
mass1.p = mass1.v*mass1.m
mass2.p = mass2.v*mass2.m
dt = 0.0001
t = 0
while 1:
g = 9.8
d = (mass1.pos-mass2.pos)/mag(mass1.pos-mass2.pos)
Ft12 = mass1.m*d*k*0.15
Ft21 = mass2.m*d*k*0.15
Fnet = Ft12 + Ft21
mass1.p += Fnet*dt
mass2.p += Fnet*dt
mass1.vA = 0.5*(mass1.v + (mass1.p/mass1.m))
mass2.vA = 0.5*(mass1.v + (mass2.p/mass2.m))
mass1.pos += mass1.vA*dt
mass2.pos += mass2.vA*dt
COM.pos = (mass1.pos-mass2.pos)/2 + mass1.pos
t += dt
Ft12 - сила натяжения от шара 1 к шару 2, а Ft21 - от 2 до 1. Конечно, я бы не стал публиковать это, если бы получал точные результаты, но я даже не получаю результаты, которые я могу с готовностью наблюдать. Экран очень быстро гаснет, и у меня нет шансов увидеть, что происходит. Я в основном хочу, чтобы эту систему "бросили" под действием силы тяжести, в которой вы можете представить, что траектория СОМ будет траекторией параболы. Любая помощь будет оценена. Если я неправильно понял свои силы или мне нужно добавить их в некоторых местах, пожалуйста, дайте мне знать!
Всем спасибо!
2 ответа
У меня есть серьезные сомнения по поводу этой линии:
dt += 1
Похоже dt
это шаг по времени. Вы увеличиваете временной шаг на секунду каждый раз вокруг цикла. Обычно вы увеличиваете время:
t += dt
но у вас еще нет переменной времени. Как только ваш временной шаг станет большим, весь ад вырвется на свободу. Сейчас я просто удалил бы dt += 1
линия.
Что касается остальной части кода, я не рассматривал его в деталях, и я не могу догадаться, что означает ваша запись. Там может быть больше проблем в коде.
У вас нет времени "сна", когда вы задерживаете анимацию. Поскольку сферы со временем исчезают с экрана (я на самом деле не смотрел на его физику, поэтому я не знаю, хотите ли вы этого) и поскольку у вас нет задержки между временными шагами - они, кажется, исчезают мгновенно.
если ты
from time import sleep
тогда вы можете запустить следующий цикл вместо
dt = 0.0001
for step in range(1000):
g = 9.8
d = (mass1.pos-mass2.pos)/mag(mass1.pos-mass2.pos)
Ft12 = mass1.m*d*k*0.15
Ft21 = mass2.m*d*k*0.15
Fnet = Ft12 + Ft21
mass1.p += Fnet*(dt*step)
mass2.p += Fnet*(dt*step)
mass1.vA = 0.5*(mass1.v + (mass1.p/mass1.m))
mass2.vA = 0.5*(mass1.v + (mass2.p/mass2.m))
mass1.pos += mass1.vA*(dt*step)
mass2.pos += mass2.vA*(dt*step)
COM.pos = (mass1.pos-mass2.pos)/2 + mass1.pos
sleep(0.5)
Я только удалил while(1), потому что я не люблю бесконечные циклы =P
Это, по крайней мере, позволяет увидеть, что делают эти три сферы, чтобы вы могли проверить, ведут ли они себя так, как вы ожидаете.