Две массы, соединенные пружиной ... пытающиеся симулировать полет, но испытывающие трудности - PullRequest
2 голосов
/ 02 марта 2012

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

3 голосов
/ 02 марта 2012

У меня есть серьезные сомнения по поводу этой строки:

dt += 1

Я думаю, dt - шаг по времени.Вы увеличиваете временной шаг на секунду каждый раз вокруг цикла.Обычно вы увеличиваете время:

t += dt

, но у вас еще нет переменной времени.Как только ваш временной шаг станет большим, весь ад вырвется на свободу.Сейчас я просто удалил бы строку dt += 1.

Что касается остальной части кода, я не рассматривал его подробно и не могу догадаться, что означает ваша запись.В коде могут быть и другие проблемы.

2 голосов
/ 02 марта 2012

У вас нет времени ожидания, когда вы задерживаете анимацию.Поскольку сферы со временем исчезают с экрана (я на самом деле не смотрел на его физику, поэтому не знаю, хотите ли вы этого) и поскольку у вас нет задержки между временными шагами - они, кажется, исчезают мгновенно.

Если вы

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...