Модель упругого соударения
Упругое соударение тел
В этом примере мы рассчитаем движение двух тел при соударении, модель учитывает массы и скорости, а также упругость, жесткость и модель их нарастания при соударении.
Описание системы
Модель состоит из двух блоков, моделирующих точечные тела с массой, с возможностью перемещаться по 1D траектории. В этом эксперименте траекторию будем считать прямолинейной.
За соударение отвечает блок "Поступателбные упоры", нижнее ограничение которого выставлено в значение "минус бесконечность" (-Inf), таким образом со стороны R этого блока ничто не ограничивает движение подсоединенного объекта, и если объект удаляется от упора, его ничего не остановит. При встречном движении объект передает синетическую энергию на упор, который передает ее второму объекту.

Положение верхнего ограничения упора задает расстояние, которое должен пройти подвижный объект, прежде чем столкнется с неподвижным.
Для визуализации движения мы используем "Датчики абсолютного движения", один из которых настроен на начальное положение массы равное -1 м.
Запуск расчетов
Запустим модель в режиме программного управления:
engee.open( "$(@__DIR__)/" * "mass_collision_model.engee");
data = engee.run( "mass_collision_model" );
По полученным данным мы можем построить графики:
mass1_P = collect(data["Движение массы 1.p_out"]);
mass1_V = collect(data["Движение массы 1.v_out"]);
mass2_P = collect(data["Движение массы 2.p_out"]);
mass2_V = collect(data["Движение массы 2.v_out"]);
gr()
plot( mass2_P.value, mass2_P.value, c=:red, lw=3, xlabel="Положение тел, м", ylabel="Положение тел, м", label="Масса 2", marker=(:o,8))
plot!( mass1_P.value, mass1_P.value, lw=3, xlabel="Положение тел, м", ylabel="Положение тел, м", label="Масса 1", marker=(:o),
mc = [(v > 0) ? :blue : :lightblue for v in mass1_V.value],
ms = [(v > 0) ? 4 : 3 for v in mass1_V.value])
plot!(guidefont=font(8), legend=:bottomright, title="Положение тел", titlefont=font(11))
Красные маркеры показывают движение первого тела до соударения.
После соударения второе тело пришло в движение (синие маркеры), а первое поменяло направление движения (соударение довольно упругое, а второе тело вдвое массивнее первого).
plot(mass1_V.time, mass1_V.value, lw=3, xlabel="Положение тел, м", ylabel="Положение тел, м", label="Масса 1", marker=(:o,5))
plot!(mass2_V.time, mass2_V.value, lw=3, xlabel="Положение тел, м", ylabel="Положение тел, м", label="Масса 2", marker=(:o,4))
plot!(guidefont=font(8), legend=:bottomright, title="Скорость движения тел", titlefont=font(11))
Если изменить параметры соударения, можно получить другой характер движения.
# Сделаем соударение менее упругим
engee.set_param!("mass_collision_model/Соударение", "k_upper_bound"=>Dict("value" => 1e2, "unit" => "N/m"))
data = engee.run( "mass_collision_model" );
# Вернем старое значение параметра упругости
engee.set_param!("mass_collision_model/Соударение", "k_upper_bound"=>Dict("value" => 1e6, "unit" => "N/m"))
mass1_P = collect(data["Движение массы 1.p_out"]);
mass1_V = collect(data["Движение массы 1.v_out"]);
mass2_P = collect(data["Движение массы 2.p_out"]);
mass2_V = collect(data["Движение массы 2.v_out"]);
plot( mass2_P.value, mass2_P.value, lw=3, xlabel="Положение тел, м", ylabel="Положение тел, м", label="Масса 2", marker=(:o,8))
plot!( mass1_P.value, mass1_P.value, lw=3, xlabel="Положение тел, м", ylabel="Положение тел, м", label="Масса 1", marker=(:o,4))
plot!(guidefont=font(8), legend=:bottomright, title="Положение тел", titlefont=font(11))
При таком параметре упругости соударения первое тело продолжило движение в ту же сторону, но приобрело небольшое отставание.
Заключение
В 1D постановке можно моделировать довольно сложные механические системы, в том числе свободное движение объектов в пространстве с учетом соударений, при этом подбирать наиболее адекватные параметры всех элементом математической модели.


