Этот пример показывает, как смоделировать начало пула с помощью непрерывной семантики времени Stateflow®. Существует 15 шаров, расположенных в треугольной сетке около одного конца таблицы, и бильярдный шар выпущен к ним от другого конца таблицы. Этот пример предназначается как упражнение в объяснении, как непрерывные функции времени Stateflow могут быть использованы к очень просто специальным системам, которые имеют большое количество прерывистых событий, которые быстро (и непредсказуемо) изменяют эволюцию системы.
Мы делаем несколько предположений упрощения в симуляции системы. Возможно, самое важное упрощение состоит в том, что мы полностью игнорируем "вращение" шаров. Другими словами, полное состояние системы описано полностью положениями и скоростями отдельных шаров.
Модель трения
Мы используем упрощенную модель трения, где мы принимаем, что на шар, который перемещается, реагирует сила трения постоянного значения, которое действует напротив направления движения. Другими словами:
где
Обратите внимание однако, что сила трения действует только, пока шар на самом деле перемещается, не, когда это является стационарным. Таким образом мы должны более точно говорить:
Это подразумевает, что движущие силы трения шаров пула имеют свойственное модальное описание, которое мы должны объяснить, когда мы моделируем систему.
Динамика столкновения
Столкновение между шарами моделируется с помощью простой модели силы восстановления. Другими словами, мы моделируем шары, как являющиеся очень немного эластичным. Когда шары находятся в контакте, силой реакции между ними дают:
где
Обратите внимание еще раз, что любые два шара имеют силу восстановления, действующую между ними только пока
в противном случае сила восстановления является нулем. Обратите внимание также, что, поскольку шары свободны перемещаться в двух измерениях, мы должны объяснить столкновения потенциала N^2/2
.
Модель состоит из двух диаграмм Stateflow и одного блока MATLAB function. График Init ответственен за начальную настройку шаров пула на таблице и в интерактивном режиме разрешении пользователю выбрать исходное положение и скорость бильярдного шара. Обратите внимание на то, что этот график является очень тонкой оберткой вокруг функции MATLAB® sf_pool_plotter.m
, который делает фактическую работу графического вывода.
Средний Пул графика является графиком, который на самом деле содержит описание динамики шара пула. Мы исследуем этот график более подробно позже.
Итоговый блок MATLAB function Plot
ответственен за анимацию шаров во время симуляции. Еще раз это - очень тонкая обертка вокруг sf_pool_plotter.m
График: Пул Этот график ответственен за большинство работы во время симуляции.
В порядке представлять динамику бильярдного стола, мы используем следующие переменные
Непрерывные переменные времени
p
матрица Nx2
, строка i^th
которой представляет положение шара i^th
.
v
матрица Nx2
, строка i^th
которой представляет скорость шара i^th
.
Переменные дискретного времени
ball_interaction
булева матрица NxN
, которая представляет взаимодействия между шарами. Если ball_interaction(i,j)
верен, это означает, что шар i^th
и шар j^th
находятся в настоящее время в контакте. Обратите внимание на то, что из-за симметричной природы системы, мы только используем верхний треугольный фрагмент этой матрицы.
stopped
вектор булевской переменной Nx1
, который представляет, перемещается ли шар в настоящее время или останавливается ли это.
last_vel
вектор Nx2
, который представляет скорость шаров. Мы обновляем этот вектор после каждого инцидента, который мог изменить скорость шара. last_vel
и stopped
и используются в функциональном frictionForce
, который моделирует трение между шарами и таблицей.
Модель силы трения
function f = frictionForce % This function calculates the forces on the balls due to friction from the % table. We use a simple constant friction force model between the ball % and the table. f = zeros(N,2); for i=1:N if stopped(i) continue else % Note that we are using last_vel to calculate the direction of % the friction force because we are guaranteed that % |last_vel(i,:)| is large when stopped(i) is false. We cannot % use v(i,:) directly because this function gets called in minor % time steps and v(i,:) can become very small at some minor time % step even if it was large at the previous major time-step. f(i,:) = -kfriction*last_vel(i,:)/norm(last_vel(i,:)); %#ok end end
После симуляции очень базовый пользовательский интерфейс бильярдного стола показывают с 15 шарами, расположенными в треугольной сетке в одном конце таблицы. Пользователя просят поместить бильярдный шар и выбрать его начальную скорость. Система затем моделирует эволюцию шаров пула при анимации их движения.