В SimBiology событие является дискретным переходом в значении величины или выражения в модели. Этот дискретный переход происходит, когда настроенное условие становится истинным. Условие может быть определенным временем и/или независимым от времени условием. Такие условия определены в Event object
.
Объект события имеет Trigger
свойство, которое задает условие, которое должно быть true, чтобы инициировать выполнение события.
Типичными триггерами событий являются:
Определенное время симуляции - задайте, что событие должно изменить количества или значения видов или параметров. Для примера в момент времени = 5 с увеличить количество ингибитора выше порога для ингибирования данной реакции.
В ответ на состояние или изменения в системе - Изменяйте количества/значения определенных видов/параметров в ответ на события, которые не привязаны к какому-либо конкретному времени. Для примера, когда виды A
достигает величины 30
молекулы, удвоенное значение константы скорости реакции k
. Или когда температура достигает 42
°C
ингибировать конкретную реакцию путем установки ее скорости реакции равной нулю.
Примечание
В настоящее время события не могут быть инициированы во время = 0. Однако можно добиться того, чтобы событие произошло сразу после времени = 0 при помощи time > timeSmall
как триггер события, где timeSmall
может быть крошечной частью секунды, такой как 1.0 пикосекунда.
Событие имеет EventFcns
свойство, которое задает, что происходит при запуске события. Функции событий могут варьироваться от простых до сложных. Для примера функция события может:
Измените значения отсеков, видов или параметров.
Удвоить значение константы скорости реакции.
Trigger
свойство события задает условие, которое должно стать true для выполнения события. Как правило, условие использует комбинацию реляционных и логических операторов, чтобы создать триггерное выражение.
Триггер может содержать ключевое слово 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 может быть пикомол/литр вместо моля/литр.
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 в качестве его выхода. |
Чтобы симулировать модели, содержащие события, используйте детерминированный (ODE или SUNDIALS) решатель или стохастический ssa
решатель. Другие стохастические решатели не поддерживают события. Для получения дополнительной информации смотрите Выбор решателя симуляции.
Рассмотрим пример простого события, где вы задаете это в 4s
, вы хотите назначить значение 10
к видам A
.
В time = 4 s
триггер становится true, и событие выполняется. На предыдущем рисунке принимая, что 0
является ложным и 1
true, когда триггер становится истинным, количество видов A
установлено в 10
. В теории, с идеальным решателем, событие было бы исполнено точно в time = 4.00 s
. На практике существует очень минутная задержка (для примера вы можете заметить, что событие выполнено в time = 4.00001 s
). Таким образом, вы должны задать, что триггер может стать истинным в или после 4s
, что time >= 4 s
.
Спусковой механизм | EventFcn |
---|---|
time >= 4 | A = 10 |
Точка, в которой триггер становится true, называется rising edge. SimBiology® события выполняют EventFcn
только на восходящих ребрах.
Триггер оценивается на каждом временном шаге, чтобы проверить, переходит ли условие, заданное в триггере, с ложного на true. Решатель обнаруживает и отслеживает falling edges, который является, когда триггер становится ложным, поэтому, если встречается другой восходящее ребро, событие переизбирается. Если триггер уже равен true перед началом симуляции, то событие не выполняется в начале симуляции. Событие не выполняется, пока решатель не встретит восходящее ребро. Очень редко решатель может пропустить восходящее ребро. Примером этого является то, когда поднимающееся ребро следует очень быстро после падающего ребра, и размер шага приводит к тому, что решатель пропускает точку перехода.
Если триггер становится true точно во время остановки симуляции, событие может или не может выполняться. Если необходимо выполнить событие, увеличьте время остановки.
Примечание
Поскольку восходящее ребро мгновенно и изменяет состояние системы, существует два значения для состояния одновременно. Таким образом, данные моделирования содержат состояние до и после события, но обе точки являются одинаковыми значениями. Это приводит к нескольким значениям состояния системы в один момент времени.
Когда два или более триггерных условий одновременно становятся истинными, решатель выполняет события последовательно в том порядке, в котором они перечислены в модели. Вы можете переупорядочить события, используя 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, дают неточные результаты, когда следующие выражения не являются непрерывными и дифференцируемыми:
Повторное правило назначения
Алгебраическое правило
Правило скорости
Скорость реакции
Либо убедитесь, что предыдущие выражения являются непрерывными и дифференцируемыми, либо используйте события, чтобы сбросить решатель с разрывом, как описано в Детерминированном Симуляции Модели, содержащей разрыв.