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
, К сожалению симуляция вылетает с "Матрица единственного числа!" ошибка. Кто-нибудь может указать мне, как этого избежать?
Я использую 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. Кажется, это работает, если я сравниваю с постоянными значениями (что бесполезно для этой конкретной проблемы).
u_min = smooth(0, if u < u_min then u else pre(u_min));
Интересно, что это работает также.