modelica: calcula o mínimo / máximo da variável contínua ao longo do tempo

Como afirmado acima: desejo calcular o mínimo (e / ou máximo) de uma variável contínua ao longo do tempo. Aqui está um exemplo mínimo para demonstrar:

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 é a variável contínua arbitrária (para fins de demonstração, uma simples onda sinusal).u_min/u_max é o mínimo / máximo ao longo do tempo.

Obviamente, o resultado esperado éu_min=-1 eu_max=1. Infelizmente, a simulação trava com um "Matrix singular!" erro. Alguém pode me indicar como evitar isso?

EDIT 1

Estou usando o OpenModelica 1.15 (era 1.9.2)

EDIT 2

Como sou bastante novo no Modelica, estou lutando para entender as diferenças entre as seguintes abordagens:

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 e 2 são equivalentes e resultam no comportamento esperado.

3 produz o resultado desejado, mas fornece uma "notificação de tradução" sobre um "loop algébrico", por que?

4 falha até agora, que o resultadou_min curva é idêntica au?! porque?

5 combina 3 e 4.

6 falha ao compilar comSorry - Support for Discrete Equation Systems is not yet implemented

7 Não estou claro qual é a ideia por trás disso, mas funciona seT é do tamanho sugerido.

Se estou entendendo a documentação do Modelica corretamente, de 1 a 5 têm em comum que exatamente uma equação está ativa o tempo todo.noEvent suprime a geração de eventos no cruzamento zero especificado. Tive a impressão de que isso é principalmente uma melhoria de eficiência. Por que deixar de fora faz com que 4 falhem?pre refere-se ao valor anterior da variável, então acho que faz sentido se queremos manter uma variável constante, mas por que o 7 funciona sem ela? Meu entendimento dewhen foi, que sua equação é apenas ativa nesse evento preciso e, caso contráriomantém o valor anterior, e foi por isso que tentei usá-lo em 6. Parece funcionar se comparar com valores constantes (que não servem para esse problema em particular).

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

Curiosamente, isso funciona também.

questionAnswers(3)

yourAnswerToTheQuestion