Несмотря на то, что на вопрос уже дан ответ, я хотел бы добавить несколько моментов, поскольку я думаю, что это может быть полезно для многих.
Есть несколько распространенных причин для использования выражения noEvent()
:
Защитные выражения : используется для предотвращения оценки функции за пределами их диапазона действия. Типичным примером является der(x) = if x>=0 then sqrt(x) else 0;
, который отлично работает в большинстве распространенных языков программирования. Это не всегда работает в Modelica по следующей причине: при поиске времени, когда условие x>=0
становится ложным, возможно, что обе ветви оцениваются со значениями x
, варьирующимися около 0. Упоминается тот же факт на скриншоте, опубликованном marvel Это приводит к cra sh, если вычисляется квадрат root отрицательного x
. Поэтому der(x) = if noEvent(x>=0) then -sqrt(x) else 0;
Используется для подавления итерации для поиска времени пересечения, оставляя обработку разрыва решающему устройству (часто называемому «выражения берут буквально вместо генерации функций пересечения»). В случае использования решателя с переменным размером шага это позволяет решателю уменьшить размер шага, чтобы обеспечить его относительную погрешность, что, вероятно, приведет к снижению производительности. Кроме того, это может быть критично, если описанная функция не является достаточно гладкой, что приводит к неточному или даже нестабильному моделированию.
Непрерывные выражения : когда функция непрерывна на самом деле нет необходимости события. Это сводится к тому, что события используются для описания разрывов. Поэтому, если их нет, обычно событие просто излишне и поэтому может быть подавлено. На самом деле это покрыто оператором smooth()
в Modelica, но в спецификации говорится, что инструмент может генерировать события. По моему опыту, инструменты генерируют события, если изменение функции относительно велико. Поэтому может иметь смысл иметь noEvent()
в пределах smooth()
.
Избегайте болтовни : noEvent
может помочь здесь, но на самом деле болтовня более общая проблема. Поэтому я бы порекомендовал решить проблемы, связанные с дребезжанием, перестроив модель.
Если ничего из вышеперечисленного не соответствует действительности, следует тщательно рассмотреть использование noEvent
.