Inelasti c столкновение в Python - PullRequest
2 голосов
/ 07 апреля 2020

Это мой первый пост здесь. Я пытаюсь выучить python код. Я создал программу, использующую модуль черепахи, который имитирует прыгающий шар, испытывающий столкновение inelasti c, чтобы каждый раз уменьшать максимальную высоту отскока. Он работает хорошо до тех пор, пока мяч не подпрыгивает на очень короткой высоте, и перестает подпрыгивать, заставляя шар просто двигаться вниз с постоянной (малой) скоростью - что, очевидно, не является ожидаемым.

«Этаж» - это линия с координатой y = -100.

Мой код итерации такой:

while t < 5000:
    vy += g
    h += vy
    corpo.goto(0, h)

    if h <= -100 and g == 0:
        vy = 0
        h = -100
        g = 0
    if abs(vy) <= 0.000000000000000000001 and h <= -100:
        vy = 0
        g = 0
        h = -100
    elif h <= -100 and vy < 0:
        vy = -vy * 0.75

    print(vy)

    t += dt 

1 Ответ

2 голосов
/ 07 апреля 2020

Проблема в том, что ваше условие завершения никогда не выполняется, возможно, потому, что вы добавляете ускорение к скорости (при условии, что g относится к гравитации, если это не так, вам действительно следует подумать о присвоении ей другого имени). Другая проблема заключается в том, что даже с этим исправлением ваше условие завершения abs(vy) <= 0.000000000000000000001 будет выполнено только в том случае, если g * dt меньше 0.000000000000000000001 / 0.75, в противном случае vy не будет достаточно маленьким.

Существует два способа решения последней проблемы: вы можете изменить свое условие завершения до g * dt, то есть

if abs(vy) <= abs(g * dt) and h <= -100:
    # ...

или отключить гравитацию при h <= -100 и поднять незначительный порог, то есть

t = 0
dt = 0.0001
vy = 0
h = 0
g = -5
while t < 500:
    if h <= -100 and g == 0:
        vy = 0
        h = -100
        g = 0
        break
    if abs(vy) <= 0.0001 and h <= -100:
        vy = 0
        g = 0
        h = -100
    elif h <= -100 and vy < 0:
        vy = -vy * 0.75
    elif h > -100:
        vy += g * dt

    h += vy
    print(h, vy)

    t += dt 

В первом случае конвергенция гарантирована (шар остановится остановится), во втором - нет (он может колебаться до бесконечности *) 1019 *). Поскольку первое гарантирует конвергенцию, это, как правило, предпочтительнее - но не полностью реализуем c.

Наиболее реалистичное решение c состоит в том, чтобы объединить оба, т. Е.

t = 0
dt = 0.001
vy = 0
h = 0
g = -9.81
while t < 500:
    if h <= -100 and g == 0:
        vy = 0
        h = -100
        g = 0
        break
    if abs(vy) <= abs(g * dt)*2 and h <= -100:
        vy = 0
        g = 0
        h = -100
    elif h <= -100 and vy < 0:
        vy = -vy * 0.75
    elif h > -100:
        vy += g * dt

    h += vy
    print(h, vy)

    t += dt 

Обратите внимание, что существуют определенные значения временного шага dt, для которых сходимость не будет происходит - если встречается такой случай, необходимо скорректировать масштаб условия завершения или шаг по времени.

...