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

Сведения о сбросе состояния

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

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

A -> B -> C : t

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

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

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

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

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

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

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

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

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

См. также

| | | |

Похожие темы