Две массы, соединенные пружиной... пытающиеся симулировать полет, но испытывающие трудности

У нас есть две массы одинаковой массы 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

Это, по крайней мере, позволяет увидеть, что делают эти три сферы, чтобы вы могли проверить, ведут ли они себя так, как вы ожидаете.

Другие вопросы по тегам