Почему время процессора значительно увеличивается, хотя я использую оператор noEvent в OpenModelica?

Когда я моделирую следующую модель, время процессора неожиданно увеличивается:

model WithoutChatter
  Real x;
initial equation
  x = 2;
equation
  der(x) = if noEvent(x>=1) then -1 else 1;
end WithoutChatter;

При использовании оператора noEvent время процессора не должно заметно увеличиваться, как описано здесь, откуда я скопировал код примера: Modelica на примере

Я новичок в OpenModelica и только что установил Windows. Для моделирования я использовал настройки по умолчанию. Результат таков. Время процессора увеличивается

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
108
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использование noEvent для уменьшения вибрации — не лучшая идея. В зависимости от решателя это может еще больше замедлить симуляцию (или не оказать никакого влияния).

Причина в том, что решатели предполагают, что модель достаточно непрерывна. Нарушать это время от времени, например, если x>=0 then sqrt(x) else 0, это нормально, но нарушать каждую наносекунду (или даже чаще) с помощью x>=0 then -1 else 1 — нет.

Единственное хорошее решение — переписать модель, поэтому модели трения имеют три состояния: скольжение вперед, скольжение назад и застревание.

Точное влияние на производительность будет зависеть от решателя (включая его систему оценки ошибок).

Если я правильно понял, никакие события не ответственны за большое время процессора в данном случае. Оператор noEvent работает правильно. Для меня важен этот момент,

manuel 13.05.2024 21:09

Чтобы внести ясность: высокое время процессора вызвано отсутствием непрерывности из-за добавления noEvent.

Hans Olsson 14.05.2024 08:41

В некоторых случаях, когда генерация события состояния может привести к чрезвычайно медленной работе модели, стоит ли учитывать сглаживание вывода с помощью такой функции, как Modelica.Fluid.Utilities.regStep()? Очевидно, пользователю необходимо будет учитывать, какое значение это сглаживание повлияет на характеристики/точность модели.

user2024223 16.05.2024 08:18

Да, сглаживание функции с использованием чего-то вроде regStep позволяет избежать как накладных расходов на событие, так и замедления решателя из-за разрыва - при условии, что часть регуляризации "достаточно широка".

Hans Olsson 16.05.2024 08:28

Другие вопросы по теме