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