modelica: вычислить минимум / максимум непрерывной переменной во времени

Как указано выше: я хочу вычислить минимум (и / или максимум) непрерывной переменной во времени. Вот минимальный пример для демонстрации:

model MinMaxTest
  Real u;
  Real u_min(start = 10);
  Real u_max(start = -10);
equation
  u = sin(time / 180 * Modelica.Constants.pi);
  u_min = min(u, u_min);
  u_max = max(u, u_max);
  annotation(experiment(StartTime = 0, StopTime = 360, Tolerance = 1e-06, Interval = 1));
end MinMaxTest;

u произвольная непрерывная переменная (для демонстрационных целей простая синусоида).u_min/u_max это минимум / максимум с течением времени.

Очевидно, ожидаемый результатu_min=-1 а такжеu_max=1, К сожалению симуляция вылетает с "Матрица единственного числа!" ошибка. Кто-нибудь может указать мне, как этого избежать?

РЕДАКТИРОВАТЬ 1

Я использую OpenModelica 1.15 (был 1.9.2)

РЕДАКТИРОВАТЬ 2

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

u_min = if noEvent(u < u_min) then u else pre(u_min);if noEvent(u < u_min) then u_min = u; else u_min = pre(u_min); end if;u_min = if noEvent(u < u_min) then u else u_min;u_min = if u < u_min then u else pre(u_min);u_min = if u < u_min then u else u_min;when u < u_min then u_min = u; end when;u_min + T*der(u_min) = if u <= u_min then u else u_min;

1 и 2 эквивалентны и приводят к ожидаемому поведению.

3 дает желаемый результат, но выдает «Уведомление о переводе» об «алгебраической петле», почему?

4 терпит неудачу настолько далеко, что в результатеu_min кривая идентичнаu?! Зачем?

5 объединяет 3 и 4.

6 не компилируется сSorry - Support for Discrete Equation Systems is not yet implemented

7 Мне непонятно, в чем суть этой идеи, но она работает, еслиT имеет предложенный размер.

Если я правильно понимаю документацию по Modelica, то у 1-5 есть общее, что ровно одно уравнение всегда активно.noEvent подавляет генерацию события при указанном пересечении нуля. У меня сложилось впечатление, что это в основном повышение эффективности. Почему пропуски 4 приводят к сбою?pre относится к предыдущему значению переменной, так что я думаю, что имеет смысл, если мы хотим сохранить переменную постоянной, но почему 7 работает без нее? Мое пониманиеwhen было то, что его уравнение активно только в этом конкретном случае, а в противном случаесохраняет предыдущее значениеВот почему я попытался использовать его в 6. Кажется, это работает, если я сравниваю с постоянными значениями (что бесполезно для этой конкретной проблемы).

EDIT3u_min = smooth(0, if u < u_min then u else pre(u_min));

Интересно, что это работает также.

Ответы на вопрос(3)

Ваш ответ на вопрос