Когда я моделирую следующую модель, время процессора неожиданно увеличивается:
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. Для моделирования я использовал настройки по умолчанию. Результат таков. Время процессора увеличивается





Использование noEvent для уменьшения вибрации — не лучшая идея. В зависимости от решателя это может еще больше замедлить симуляцию (или не оказать никакого влияния).
Причина в том, что решатели предполагают, что модель достаточно непрерывна. Нарушать это время от времени, например, если x>=0 then sqrt(x) else 0, это нормально, но нарушать каждую наносекунду (или даже чаще) с помощью x>=0 then -1 else 1 — нет.
Единственное хорошее решение — переписать модель, поэтому модели трения имеют три состояния: скольжение вперед, скольжение назад и застревание.
Точное влияние на производительность будет зависеть от решателя (включая его систему оценки ошибок).
Чтобы внести ясность: высокое время процессора вызвано отсутствием непрерывности из-за добавления noEvent.
В некоторых случаях, когда генерация события состояния может привести к чрезвычайно медленной работе модели, стоит ли учитывать сглаживание вывода с помощью такой функции, как Modelica.Fluid.Utilities.regStep()? Очевидно, пользователю необходимо будет учитывать, какое значение это сглаживание повлияет на характеристики/точность модели.
Да, сглаживание функции с использованием чего-то вроде regStep позволяет избежать как накладных расходов на событие, так и замедления решателя из-за разрыва - при условии, что часть регуляризации "достаточно широка".
Если я правильно понял, никакие события не ответственны за большое время процессора в данном случае. Оператор noEvent работает правильно. Для меня важен этот момент,