Когда использовать оператор noEvent на языке Modelica? - PullRequest
2 голосов
/ 22 февраля 2020

Оператор noEvent в Modelica не использует итерацию для нахождения точного момента времени, когда было инициировано событие.

enter image description here

Кажется, это может привести к ошибке вычисления, вот пример, который я нахожу на следующем веб-сайте https://mbe.modelica.university/behavior/discrete/decay/ Так что я должен убедиться, что функция работает плавно при использовании оператора noEvent? Какова цель использования оператора noEvent, если он не может обеспечить точность?

enter image description here

Ответы [ 3 ]

3 голосов
/ 01 апреля 2020

Несмотря на то, что на вопрос уже дан ответ, я хотел бы добавить несколько моментов, поскольку я думаю, что это может быть полезно для многих.

Есть несколько распространенных причин для использования выражения noEvent():

  1. Защитные выражения : используется для предотвращения оценки функции за пределами их диапазона действия. Типичным примером является 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; Используется для подавления итерации для поиска времени пересечения, оставляя обработку разрыва решающему устройству (часто называемому «выражения берут буквально вместо генерации функций пересечения»). В случае использования решателя с переменным размером шага это позволяет решателю уменьшить размер шага, чтобы обеспечить его относительную погрешность, что, вероятно, приведет к снижению производительности. Кроме того, это может быть критично, если описанная функция не является достаточно гладкой, что приводит к неточному или даже нестабильному моделированию.

  2. Непрерывные выражения : когда функция непрерывна на самом деле нет необходимости события. Это сводится к тому, что события используются для описания разрывов. Поэтому, если их нет, обычно событие просто излишне и поэтому может быть подавлено. На самом деле это покрыто оператором smooth() в Modelica, но в спецификации говорится, что инструмент может генерировать события. По моему опыту, инструменты генерируют события, если изменение функции относительно велико. Поэтому может иметь смысл иметь noEvent() в пределах smooth().

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

Если ничего из вышеперечисленного не соответствует действительности, следует тщательно рассмотреть использование noEvent.

2 голосов
/ 24 февраля 2020

Я думаю, что Modelica Language Specification Version 3.4 Раздел 3.7.3.2. и раздел 8.5. поможет вам здесь (если вы еще не проверили это).

Из того, что я знаю, его следует использовать только из соображений эффективности, и в большинстве случаев следует использовать smooth() вместо или в сочетании.

0 голосов
/ 03 марта 2020

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

enter image description here

...