Проблемы с реализацией уравнения для 2d упругого столкновения

#python #physics #collision

#python #физика #столкновение

Вопрос:

Итак, я пытаюсь создать симулятор физики 2d-шара. Прежде чем я попытаюсь продвинуться вперед и реализовать визуальные эффекты, я проверяю, как будет работать физика, и я застрял на реализации этого уравнения. Это то, до чего я дошел до сих пор:

 import math

b1m = 50  # ball 1 mass
b2m = 40  # ball 2 mass
 
b1vx = 35  # ball 1 velocity x
b1vy = 10  # ball 1 velocity y
b2vx = -15  # ball 2 velocity x
b2vy = -40  # ball 2 velocity y

b1v = math.sqrt(abs(b1vx)   abs(b1vy))  # ball 1 velocity | calculates overall velocity/speed
b2v = math.sqrt(abs(b2vx)   abs(b2vy))  # ball 2 velocity | calculates overall velocity/speed

b1ma = math.degrees(math.atan2(b1vy, b1vx)) % 360  # ball 1 movement angle | calculates the angle at 
which the ball is travelling
b2ma = math.degrees(math.atan2(b2vy, b2vx)) % 360  # ball 2 movement angle | calculates the angle at 
which the ball is travelling

ca = 31.5  # contact angle

b1vx = (b1v * math.cos(b1ma - ca) * (b1m - b2m)   2 * b2m * math.cos(b2ma - ca)) / (b1m   b2m) * 
math.cos(ca)   b1v * math.sin(b1ma - ca) * math.cos(ca   (math.pi/2))
b1vy = (b1v * math.cos(b1ma - ca) * (b1m - b2m)   2 * b2m * math.cos(b2ma - ca)) / (b1m   b2m) * 
math.sin(ca)   b1v * math.sin(b1ma - ca) * math.sin(ca   (math.pi/2))

print(b1vx)  # print to check if correct values | correct value should be -17.11
print(b1vy)  # print to check if correct values | correct value should be 21.94
#  according to http://www.sciencecalculators.org/mechanics/collisions/
 

Я не уверен, что происходит не так, но это приводит к неправильным результатам для переменных, которые я присвоил. Я попытался преобразовать углы в радианы, поскольку я знаю, что это python по умолчанию, я попытался немного отредактировать уравнение, чтобы посмотреть, не был ли нарушен порядок операций. Но результатов все еще нет. Я основываю необходимые значения на этом веб-сайте, на котором показано моделирование 2d-шара на основе заданных пользователем переменных. Любая помощь приветствуется!

Ответ №1:

Спасибо за интересный вопрос, мне понравилось работать над ним. В вашем коде есть 3 проблемы:

  • Общая скорость обоих шаров зависит от квадратного корня из суммы квадратов составляющих (теорема Пифагора). Отдельные компоненты не были возведены в квадрат в вашем коде
  • В вашей формуле для вычисления результирующих скоростей в числителе отсутствует компонент: b2v (in 2* m2 * v2 * cos(θ2−φ) )
  • math.cos и math.sin bith принимают угловые значения в радианах в качестве входных данных.

Исправив все три, я смог воспроизвести ожидаемые значения. Однако, набирая этот ответ, я заметил, что скорость в направлении y имела неправильный знак. То же самое было верно для компонента y второго шара. Я снова проверил уравнения, но не смог обнаружить еще одну ошибку. Однако, если вы посмотрите на анимацию веб-сайта, на который вы ссылались, вы можете увидеть, что шар движется к нижнему левому краю анимации, поэтому x и y кажутся отрицательными. Я играл с разными входными значениями, и направление движения мяча никогда не соответствовало его представленной скорости y. Если нет какой-либо очевидной инверсии знака, которую я пропускаю, это может быть ошибкой на этом веб-сайте.

Вот код:

 import math

b1m = 50  # ball 1 mass
b2m = 40  # ball 2 mass
 
b1vx = 35  # ball 1 velocity x
b1vy = 10  # ball 1 velocity y
b2vx = -15  # ball 2 velocity x
b2vy = -40  # ball 2 velocity y


#1 square root of squared components
b1v = math.sqrt(b1vx**2   b1vy**2)  # ball 1 velocity | calculates overall velocity/speed
b2v = math.sqrt(b2vx**2   b2vy**2)  # ball 2 velocity | calculates overall velocity/speed

# ball 1 movement angle | calculates the angle at which the ball is travelling
b1ma = math.atan2(b1vy, b1vx)                                                
# ball 2 movement angle | calculates the angle at which the ball is travelling
b2ma = math.atan2(b2vy, b2vx)                                                   

ca = math.radians(31.5)  # contact angle

#3 component missing in second component of numerator of fraction (b2v)
b1vx = ((b1v * math.cos(b1ma - ca) * (b1m - b2m)   2 * b2m * b2v * math.cos(b2ma - ca)) / (b1m   b2m)) * math.cos(ca)   b1v * math.sin(b1ma - ca) * math.cos(ca   (math.pi/2))
b1vy = ((b1v * math.cos(b1ma - ca) * (b1m - b2m)   2 * b2m * b2v * math.cos(b2ma - ca)) / (b1m   b2m)) * math.sin(ca)   b1v * math.sin(b1ma - ca) * math.sin(ca   (math.pi/2))

b2vx = ((b2v * math.cos(b2ma - ca) * (b2m - b1m)   2 * b1m * b1v * math.cos(b1ma - ca)) / (b2m   b1m)) * math.cos(ca)   b2v * math.sin(b2ma - ca) * math.cos(ca   (math.pi/2))
b2vy = ((b2v * math.cos(b2ma - ca) * (b2m - b1m)   2 * b1m * b1v * math.cos(b1ma - ca)) / (b2m   b1m)) * math.sin(ca)   b2v * math.sin(b2ma - ca) * math.sin(ca   (math.pi/2))



print(b1vx)  # print to check if correct values | correct value should be -17.11
print(b1vy)  # print to check if correct values | correct value should be 21.94

print(b2vx)
print(b2vy)

#  according to http://www.sciencecalculators.org/mechanics/collisions/
 

Комментарии:

1. Большое спасибо за помощь. Я могу, наконец, реализовать его. Я полагаю, последняя проблема, о которой вы говорили, может заключаться в том, что система координат на веб-сайте, на который я ссылался, начинается (0,0) снизу слева. Но в любом случае я вставил его в свой код, и он отлично работает благодаря вам.