В SimBiology событие является дискретным переходом в значении количества или выражения в модели. Этот дискретный переход происходит, когда индивидуально настраиваемое условие становится верным. Условием может быть определенное время и/или независимое от времени условие. Такие условия заданы в Event object
.
Объект-событие имеет a Trigger
свойство, которое задает условие, которое должно быть верно, чтобы инициировать событие, чтобы выполниться.
Типичные триггеры события:
Определенное время симуляции — Указывает, что событие должно изменить суммы или значения разновидностей или параметров. Например, во время = 5 с, увеличьте сумму разновидности ингибитора выше порога, чтобы запретить данную реакцию.
В ответ на состояние или изменения в системе — суммы/значения Изменения определенных разновидностей/параметров в ответ на события, которые не связываются ни к какому определенному времени. Например, когда разновидности A
достигает суммы 30
молекулы, дважды значение скорости реакции постоянный k
. Или когда температура достигает 42
°C
, подавите конкретную реакцию путем обнуления ее скорости реакции.
Примечание
В настоящее время события не могут быть инициированы во время = 0. Однако можно заставить событие происходить сразу после времени = 0 при помощи time > timeSmall
как триггер события, где timeSmall
может быть крошечная часть секунды, такой как 1,0 пикосекунды.
Событие имеет EventFcns
свойство, которое задает то, что происходит, когда событие инициировано. Функции события могут расположиться от простого, чтобы объединить. Например, событие функциональная сила:
Измените значения отсеков, разновидностей или параметров.
Удвойте значение постоянной скорости реакции.
Trigger
свойство события задает условие, которое должно стать верным для события, чтобы выполниться. Как правило, условие использует комбинацию операторов отношения и логических операторов, чтобы создать триггерное выражение.
Триггер может содержать ключевое слово time
и операторы отношения, чтобы инициировать событие, которое происходит в определенное время во время симуляции. Например, time >= x
. Для получения дополнительной информации смотрите Trigger
свойство.
Используйте синтаксис MATLAB®, чтобы записать выражения для триггеров события. Обратите внимание на то, что выражение должно быть одним выражением MATLAB, которое возвращает логическое. Никакая точка с запятой или запятая не необходимы в конце выражения. MATLAB использует определенный приоритет оператора, чтобы выполнить триггерные выражения. Уровни приоритета определяют порядок, в котором MATLAB выполняет выражение. В каждом уровне приоритета операторы имеют одинаковый приоритет и оценены слева направо. Чтобы найти больше информации о том, как операторы отношения и логические операторы оценены, смотрите Реляционные операции и Логические операции.
Некоторые примеры триггеров:
Триггер | Объяснение |
---|---|
(time >= 5) && (speciesA < 1000) | Выполните событие, когда следующее условие станет верным: Время больше или равно
Совет Используя
|
(time >= 5) || (speciesA < 1000) | Выполните событие, когда следующее условие станет верным: Время больше или равно |
(s1 >= 10.0) || (time >= 250) && (s2 < 5.0E17) | Выполните событие, когда следующее условие станет верным: Разновидности, Из-за приоритета оператора обработано выражение, как будто это был Таким образом это всегда - хорошая идея использовать круглую скобку, чтобы явным образом задать намеченный приоритет операторов. |
((s1 >= 10.0) || (time >= 250)) && (s2 < 5.0E17) | Выполните событие, когда следующее условие станет верным: Разновидности |
((s1 >= 5000.0) && (time >= 250)) || (s2 < 5.0E17) | Выполните событие, когда следующее условие станет верным: Разновидности |
Совет
Если UnitConversion
включен и ваша модель имеет любое событие, следуйте рекомендации ниже.
Не определите размерность любые параметры, используемые в конечном счете Trigger
если они не являются уже безразмерными. Например, предположите, что у вас есть триггер x > 1
, где x является концентрацией разновидностей при родинке/литр. Не определите размерность x путем масштабирования (деление) его с константой, такой как x/x0 > 1
, где x0 является параметром, заданным как 1,0 родинки/литр. Обратите внимание на то, что x не должен иметь того же модуля как постоянный x0, но должен быть размерностно сопоставим с ним. Например, модуль x может быть picomole/liter вместо родинки/литр.
EventFcns
свойство события задает то, что происходит, когда событие инициировано. Можно использовать функцию события, чтобы изменить значение отсека, разновидностей или параметра, или можно задать комплексные задачи путем вызывания пользовательской функции или скрипта.
Используйте синтаксис MATLAB, чтобы задать выражения для функций события. Выражение должно быть одним оператором присваивания MATLAB, который включает =
, или массив ячеек таких операторов. Никакая точка с запятой или запятая не необходимы в конце выражения.
Следующее является правилами для записи выражений для функций события:
EventFcn | Объяснение |
---|---|
speciesA = speciesB | Когда событие будет выполняться, установите сумму speciesA равняйтесь тому из speciesB . |
k = k/2 | Когда событие будет выполняться, разделите на два значение константы скорости k . |
{'speciesA = speciesB','k = k/2'} | Когда событие будет выполняться, установите сумму speciesA равняйтесь тому из speciesB , и разделите на два значение константы скорости k . |
kC = my_func(A,B,kC) | Когда событие будет выполняться, вызовите пользовательский функциональный my_func() . Эта функция берет три аргумента: первые два аргумента являются текущими суммами двух разновидностей (A и B ) в процессе моделирования и третий аргумент является текущим значением параметра, kC . Функция возвращает модифицированное значение kC как его выход. |
Чтобы симулировать модели, содержащие события, используйте детерминированное (ОДУ или SUNDIALS) решатель или стохастический ssa
решатель. Другие стохастические решатели не поддерживают события. Для получения дополнительной информации смотрите Выбор Simulation Solver.
Рассмотрите пример простого события, где вы задаете в 4s
, вы хотите присвоить значение 10
к разновидностям A
.
В time = 4 s
триггер становится верным, и событие выполняется. На предыдущем рисунке, принимающем тот 0
является ложным и 1
верно, когда триггер становится верным, сумма разновидностей A
установлен в 10
. В теории, с совершенным решателем, событие было бы выполнено точно в time = 4.00 s
. На практике существует очень мелкая задержка (например, вы можете заметить, что событие выполняется в time = 4.00001 s
). Таким образом необходимо указать, что триггер может стать верным в или после 4s
, который является time >= 4 s
.
Триггер | EventFcn |
---|---|
time >= 4 | A = 10 |
Точка, в которой триггер становится верным, называется rising edge. События SimBiology® выполняют EventFcn
только в возрастающих ребрах.
Триггер оценен на каждом временном шаге, чтобы проверять, задало ли условие в триггерных переходах от лжи до истины. Решатель обнаруживает и отслеживает falling edges, который является, когда триггер становится ложным, поэтому если с другим возрастающим ребром сталкиваются, событие повторно выполняется. Если триггер уже верен, прежде чем симуляция запустится, то событие не выполняется в начале симуляции. Событие не выполняется, пока решатель не сталкивается с возрастающим ребром. Очень редко решатель может пропустить возрастающее ребро. Пример этого - когда возрастающее ребро следует очень быстро после падающего ребра и результатов размера шага в решателе, пропускающем точку перехода.
Если триггер становится верным точно во времени остановки симуляции, событие может или не может выполниться. Если вы хотите, чтобы событие выполнило, увеличило время остановки.
Примечание
Поскольку возрастающее ребро мгновенно и изменяет системное состояние, существует два значения для состояния одновременно. Данные моделирования таким образом содержат состояние до и после события, но обе точки являются одновременно значением. Это приводит к нескольким значениям системного состояния в один момент вовремя.
Когда два или больше триггерных условия одновременно становятся верными, решатель выполняет события последовательно в порядке, в котором они перечислены в модели. Можно переупорядочить события с помощью reorder
метод. Например, рассмотрите этот случай.
Номер события | Trigger | EventFcn |
---|---|---|
1 | SpeciesA >= 4 | SpeciesB = 10 |
2 | SpeciesC >= 15 | SpeciesB = 25 |
Решатель пытается найти возрастающее ребро для этих событий в определенном уровне допуска. Если это приводит к обоим событиям, происходящим одновременно, то значение SpeciesB
после того, как временным шагом, в котором эти два события имеют место, будет 25
. Если вы переупорядочиваете события, чтобы инвертировать порядок события, то значение SpeciesB
после того, как временным шагом, в котором эти два события имеют место, будет 10
.
Рассмотрите пример, в который вы включаете функции события, которые изменяют компоненты модели зависимым способом. Например, функция события в Событии 2, предусматривает тот SpeciesB
принимает значение SpeciesC
.
Номер события | Trigger | EventFcn |
---|---|---|
1 | SpeciesA >= 4 | SpeciesC = 10 |
2 | time >= 15 | SpeciesB = SpeciesC |
Событие 1 и Событие 2 могут или не могут произойти одновременно.
Если Событие 1 и Событие 2 не происходят одновременно, когда Событие 2 инициировано, SpeciesB
присвоен значение что SpeciesC
имеет во время триггера события.
Если Событие 1 и Событие 2 происходят одновременно, решатель выполняет Событие 1 сначала, то выполняет Событие 2. В этом примере, если SpeciesC = 15
когда события инициированы, после того, как события выполняются, SpeciesC = 10
и SpeciesB = 10
.
Рассмотрите функцию события, в которой вы указываете что значение компонента модели (SpeciesB
) зависит от значения компонента модели (SpeciesA
), но SpeciesA
также изменяется функцией события.
Trigger | EventFcn |
---|---|
time >= 4 | {'SpeciesA = 10, SpeciesB = SpeciesA'} |
Решатель хранит значение SpeciesA
в возрастающем ребре и прежде чем выполняются любые функции события, и использует эту хранимую сумму, чтобы присвоить SpeciesB
его значение. Таким образом в этом примере, если SpeciesA = 15
в то время, когда событие инициировано, после того, как событие выполняется, SpeciesA = 10
и SpeciesB = 15
.
В следующем примере Событие 1 включает выражение, в конечном счете функционируют, который заставляет Событие 2 быть инициированным (принимающий тот SpeciesA
имеет сумму меньше, чем 5
когда Событие 1 выполняется).
Номер события | Trigger | EventFcn |
---|---|---|
1 | time >= 5 | {'SpeciesA = 10, SpeciesB = 5'} |
2 | SpeciesA >= 5 | SpeciesC = SpeciesB |
Когда Событие 1 инициировано, решатель оценивает и выполняет Событие 1 так что в итоге SpeciesA = 10
и SpeciesB = 5
. Теперь триггер для События 2 становится верным, и решатель выполняет функцию события для События 2. Таким образом, SpeciesC = 5
в конце этого выполнения события.
У вас могут таким образом быть каскады события произвольной длины, например, Событие 1 инициировало Событие 2, которое в свою очередь инициировало Событие 3 и так далее.
В некоторых ситуациях серия событий может инициировать каскад, который становится цикличным. Если вы инициировали циклический набор событий, единственный способ остановить симуляцию путем нажатия Ctrl+C. Вы теряете любые данные, полученные в текущей симуляции. Вот пример циклических событий. Этот пример принимает тот Species B <= 4
в начале цикла.
Номер события | Trigger | EventFcn |
---|---|---|
1 | SpeciesA > 10 | {'SpeciesB = 5', 'SpeciesC = 1'} |
2 | SpeciesB > 4 | {'SpeciesC = 10', 'SpeciesA = 1'} |
3 | SpeciesC > 9 | {'SpeciesA = 15', 'SpeciesB = 1'} |
Решатели, которым предоставляют SimBiology, дают неточные результаты, когда следующие выражения не непрерывны и дифференцируемы:
Повторное правило присвоения
Алгебраическое правило
Правило скорости
Скорость реакции
Или гарантируйте, что предыдущие выражения непрерывны и дифференцируемы или используют события, чтобы сбросить решатель в разрыве, как описано в Детерминированной Симуляции Модели, Содержащей Разрыв.