В этом примере показано, как смоделировать начало бильярдной игры при помощи матричных переменных непрерывного времени. В модели график 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, которые выполняют матричные вычисления.
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 бильярдными шарами, расположенными в одном конце таблицы. Чтобы задать исходное положение бильярдного шара, щелкните где угодно на бильярдном столе.
Чтобы задать начальную скорость бильярдного шара, кликните по различному месту на бильярдном столе.
Модель симулирует динамику системы и анимирует движение бильярдных шаров.
Чтобы остановить симуляцию, закройте пользовательский интерфейс.