Как указано выше: я хочу вычислить минимум (и / или максимум) непрерывной переменной с течением времени. Вот минимальный пример для демонстрации:
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
- произвольная непрерывная переменная (для демонстрационных целей простая синусовая волна). _3 _ / _ 4_ - это минимум / максимум с течением времени.
Очевидно, что ожидаемый результат - 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. Кажется, это сработает, если я сравниваю с константой values (что бесполезно для этой конкретной проблемы).
РЕДАКТИРОВАТЬ3
u_min = smooth(0, if u < u_min then u else pre(u_min));
Интересно, что это тоже работает.
u_min = min(u,last(u_min))
- person Tobias   schedule 29.06.2015last
не содержится в спецификации Modelica (до последней версии 3.3 rev.1). Это особенность SimulationX (и описана в ее документации). Возможно, вы имеете в видуpre
-оператор. - person Tobias   schedule 29.06.2015pre
. Я понял это сразу после публикации и удалил свой комментарий. Извините за путаницу. - person PeterE   schedule 29.06.2015