Моделирование сброса состояния

О сбросе состояния

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

Чтобы реализовать сброс состояния, используйте instantaneous modes и compound transitions в графике режима. Мгновенный режим является режимом, который активен только для одной итерации события. Вы указываете, что режим мгновенен при помощи составного перехода:

A -> B -> C : t

Средний режим, B, мгновенно. Когда предикат t становится верным, системные переходы от режима A к режиму B, выполняет одну итерацию события, и затем сразу переходы к режиму C.

Вы объявляете мгновенные режимы тот же путь как регулярные режимы, при помощи mode раздел графика режима. Чтобы указать, что режим мгновенен, перечислите его как средний режим в составном переходе. Только один мгновенный режим позволен на переход, поэтому, составной переход не может содержать больше чем три режима.

В большинстве вариантов использования сброса состояния значение сброса является функцией предыдущего значения переменной. Например, при моделировании прыгающего мяча, новая скорость зависит от скорости перед ударом. entry разделите, который вы объявляете в mode разделите в графике режима, позволяет вам задать действия, которые будут выполняться после перехода к режиму. Эти действия являются обновлениями переменной события на основе значения непрерывного выражения сразу прежде, чем перейти к режиму. При моделировании сброса состояния можно использовать действия входа, чтобы обновить значение переменной события на основе значения соответствующей непрерывной переменной сразу прежде, чем перейти к режиму.

Когда вы соединяете несколько идеальных компонентов, которые используют сброс состояния, решатель автоматически обнаруживает и распространяет импульсы в непрерывных состояниях во время переменной реинициализации. Импульсное распространение может только триггерные события, предикаты которых являются линейными выражениями непрерывных состояний. Кроме того, импульсное обнаружение может добавить вычислительную стоимость во время переходной инициализации. Две опции в блоке Solver Configuration, Compute impulses и Impulse iterations, позволяют вам контролировать вычислительные затраты импульсного обнаружения во время переходной инициализации. Если вы используете симуляцию фиксированных затрат для модели, которая содержит компоненты со сбросом состояния, установите флажок Compute impulses, чтобы получить правильные импульсные результаты распространения.

Пример сброса состояния

Используйте этот простой пример, чтобы изучить, как смоделировать сброс состояния.

Блок Translational Hard Stop в библиотеке Simscape™ Foundation моделирует жесткий упор как пружину и демпфер, которые вступают в контакт с ползунком в границах. В отличие от этого этот пример реализует идеальный поступательный жесткий упор, где скорость ползунка сбрасывает мгновенно после удара верхней или нижней границы.

component ideal_hard_stop

nodes
    R = foundation.mechanical.translational.translational % R:left
    C = foundation.mechanical.translational.translational % C:right
end

parameters
    upper_bnd = { 0.1, 'm'} % Upper bound
    lower_bnd = {-0.1, 'm'} % Lower bound
    e = 0.8                 % Coefficient of restitution
end

variables
    v = {0, 'm/s'}   % Velocity
    f = {0, 'N'}     % Force
    x = {value = {0, 'm'}, priority = priority.high} % Position
end

variables(Event = true, Access = private, ExternalAccess = none)
    v_old = {0, 'm/s'}
end

branches
    f : R.f -> C.f
end

equations
    v == R.v - C.v
    x.der == v

    assert(e > 0);
    assert(e <= 1);
    assert(upper_bnd > 0);
    assert(lower_bnd < 0);
end

modecharts(ExternalAccess = observe)
  m = modechart
    modes
      mode FREE
        equations
          f == 0
        end
      end
      mode IMPACT
        entry
          v_old = v
        end
        equations
          v == -e*v_old
        end
      end
    end
    transitions
      FREE -> IMPACT -> FREE : x <= lower_bnd && v < 0
      FREE -> IMPACT -> FREE : x >= upper_bnd && v > 0
    end
  end
end

end

График режима m задает два режима:

  • FREE, когда ползунок свободно перемещается между границами.

  • IMPACT, когда ползунок поражает одну из границ.

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

transitions раздел задает два составных перехода, один для ползунка, поражающего нижнюю границу и один для верхней границы. В каждом переходе, когда предикат становится верным, переключатели компонента от FREE режим к IMPACT, и затем обратно к FREE. IMPACT мгновенный режим.

Когда компонент вводит IMPACT режим, переменная v_old события обновляется со значением скорости перед ударом. Это действие обновления задано в entry разделите для того режима. Затем в equations разделите для этого режима, скорости, v, сбрасывается к значению, которое является функцией этого предыдущего скоростного значения и коэффициента восстановления, e.

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

transitions
    FREE -> IMPACT -> FREE : x <= lower_bnd || x >= upper_bnd
end

предикат мог все еще быть верным после завершения перехода, система введет бесконечный цикл и в конечном счете сгенерирует ошибку. Чтобы избежать этой ситуации, это - хорошая практика, чтобы попытаться смоделировать составные переходы таким способом, которым мгновенный режим делает недействительным предикат:

transitions
    FREE -> IMPACT -> FREE : x <= lower_bnd && v < 0
    FREE -> IMPACT -> FREE : x >= upper_bnd && v > 0
end

В этом случае, в то время как в мгновенном режиме, скоростном знаке щелчков и предикате больше не действительно.

Для более подробного примера смотрите Массу на Тележке с помощью Идеального Жесткого упора, который использует пользовательский блок Ideal Hard Stop с дополнительными опциями, которые покрывают более широкое множество вариантов использования. Тот блок имеет более комплексный график режима, но принципы моделирования и поведение блока подобны.

Смотрите также

| | | |

Похожие темы