Смоделируйте динамику движущихся бильярдных шаров

В этом примере показано, как смоделировать начало бильярдной игры при помощи матричных переменных непрерывного времени. В модели график Stateflow® симулирует динамику гибридной системы, которая имеет большое количество разрывов. Для получения дополнительной информации смотрите, что Непрерывное время Моделирует в Stateflow.

Когда симуляция запускается, пользовательский интерфейс (UI) MATLAB® показывает бильярдный стол с 15 бильярдными шарами, расположенными в треугольной стойке. Пользовательский интерфейс затем предлагает вам выбирать исходное положение и скорость бильярдного шара. Когда бильярдный шар выпущен, пользовательский интерфейс анимирует движение бильярдных шаров, когда они подвергаются последовательности быстрых столкновений.

Модель состоит из:

  • Init диаграммы Stateflow, который вызывает функциональный sf_pool_plotter.m инициализировать положение и скорость бильярдного шара на основе входа от пользовательского интерфейса.

  • Пул диаграммы Stateflow, который вычисляет двумерную динамику каждого бильярдного шара.

  • График блока MATLAB function, который вызывает функциональный sf_pool_plotter.m анимировать движение бильярдных шаров во время симуляции.

  • Vel блока Scope, который отображает скорость каждого бильярдного шара во время начала.

Вычислите динамику непрерывного времени

Чтобы представлять динамику бильярдных шаров, график Пула делает несколько предположений.

Переменные непрерывного времени

График игнорирует вращение шаров, таким образом, состояние системы описано полностью положениями и скоростями шаров. Каждый шар принят, чтобы иметь модульную массу, таким образом, ее положение и скорость описаны системой дифференциальных уравнений

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

Чтобы отследить положения и скорости шаров, график хранит пару 16 2 матриц в переменных p непрерывного времени и v. В каждой матрице строка представляет двумерное положение или скорость шара.

Модель трения

Чтобы вычислить силу трения, действующего на каждый шар, график вызывает функцию MATLAB frictionForce. Эта функция реализует упрощенную модель трения. Трение действует на каждый движущийся шар с постоянной силой напротив направления движения. Поскольку трение не действует на стационарные шары, сила трения на каждом шаре по сути модальна:

то, где коэффициент трения и действительно ли ускорения, происходит из-за силы тяжести.

Динамика столкновения

Чтобы определить взаимодействия, вызванные столкновениями между шарами, график вызывает функцию MATLAB interactionForce. Эта функция реализует простую модель силы восстановления, когда два шара вступают в контакт друг с другом. Сила взаимодействия между и шары модальна:

где:

  • радиус каждого шара.

  • и константы эластичности.

  • относительное разделение центров этих двух шаров.

  • относительная разница в скорости между этими двумя шарами.

Поскольку шары свободны перемещаться в двух измерениях, график использует 16 16 Булеву матрицу ball_interaction составлять все потенциальные столкновения. Например, когда и шары затрагивают, значение ball_interaction(i,j) true. В противном случае этим значением является false. Поскольку столкновения симметричны по своей природе, график использует только верхний треугольный фрагмент матрицы.

Выполните матричные вычисления в функциях MATLAB

Чтобы вычислить двумерную динамику бильярдных шаров, график Пула вызывает несколько функций MATLAB, которые выполняют матричные вычисления.

  • initBalls инициализирует положение и скорость каждого шара на бильярдном столе.

  • frictionForce вычисляет силу трения, действующую на каждый шар.

  • interactionForce вычисляет силу взаимодействия, действующую на каждый шар.

  • isAnyBallGoingToStop возвращает значение 1 если какой-либо шар прекращает перемещаться. В противном случае функция возвращает значение 0.

  • hasBallInteractionChanged возвращает значение 1 если какие-либо взаимодействия шара изменяются. В противном случае функция возвращает значение 0.

  • isAnyBallNewlyPocketed возвращает значение 1 если какой-либо шар падает в кармане. В противном случае функция возвращает значение 0.

  • isAnyBallOutOfBounds возвращает значение true если какой-либо шар находится вне контура бильярдного стола. В противном случае функция возвращает значение false.

  • nearHole возвращает значение true если шар около кармана на бильярдном столе. В противном случае функция возвращает значение false.

  • getBallInteraction возвращает Булеву матрицу, которая задает, являются ли какие-либо шары в контакте друг с другом.

  • updateStopFlags отслеживает, которых шары прекратили перемещаться, и хранит результат в векторном stopped.

  • pocketNewBalls устанавливает скорость каждого присвоенного шара к 0.

  • resetBallsPosAndVel сбрасывает положение и скорость любого шара, который находится вне контура бильярдного стола.

Просмотрите результаты симуляции

Когда вы запускаете симуляцию, пользовательский интерфейс показывает бильярдный стол с 15 бильярдными шарами, расположенными в одном конце таблицы. Чтобы задать исходное положение бильярдного шара, щелкните где угодно на бильярдном столе.

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

Модель симулирует динамику системы и анимирует движение бильярдных шаров.

Чтобы остановить симуляцию, закройте пользовательский интерфейс.

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте