modelica: Minimum / Maximum der kontinuierlichen Variablen über die Zeit berechnen

Wie oben angegeben: Ich möchte das Minimum (und / oder Maximum) einer kontinuierlichen Variablen über die Zeit berechnen. Hier ist ein minimales Beispiel zur Veranschaulichung:

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 ist die beliebige stetige Variable (für Demozwecke eine einfache Sinuswelle).u_min/u_max ist das Minimum / Maximum im Zeitverlauf.

ffensichtlich ist das erwartete Ergebnisu_min=-1 undu_max=1. Leider stürzt die Simulation mit einem "Matrix Singular!" Error. Kann mir jemand sagen, wie man das vermeidet?

EDIT 1

Ich verwende OpenModelica 1.15 (war 1.9.2)

EDIT 2

Da ich für Modelica noch kein Anfänger bin, habe ich Probleme, die Unterschiede zwischen den folgenden Ansätzen zu verstehen:

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 und 2 sind gleichwertig und führen zum erwarteten Verhalten.

3 erzeugt das gewünschte Ergebnis, gibt aber eine "Übersetzungsbenachrichtigung" über eine "algebraische Schleife" aus. Warum?

4 scheitert soweit, dass das resultierendeu_min Kurve ist identisch mitu ?! Warum

5 kombiniert 3 und 4.

6 kann nicht mit @ kompiliert werdSorry - Support for Discrete Equation Systems is not yet implemented

7 Mir ist nicht klar, was die Idee dahinter ist, aber es funktioniert, wennT hat die vorgeschlagene Größe.

Wenn ich die Modelica-Dokumentation richtig verstehe, haben 1-5 gemeinsam, dass immer genau eine Gleichung aktiv ist.noEvent unterdrückt die Ereigniserzeugung beim angegebenen Nulldurchgang. Ich hatte den Eindruck, dass dies meist eine Effizienzverbesserung ist. Warum scheitert es, wenn 4 weggelassen wird?pre bezieht sich auf den vorherigen Wert der Variablen. Ich denke, das ist sinnvoll, wenn wir eine Variable konstant halten möchten, aber warum funktioniert 7 ohne sie? Mein Verständnis vonwhen war, dass seine Gleichung nur bei genau diesem Ereignis aktiv ist, andernfalls behält den vorherigen Wert bei, weshalb ich es in 6 ausprobiert habe. Es scheint zu funktionieren, wenn ich mit konstanten Werten vergleiche (was für dieses spezielle Problem nicht von Nutzen ist).

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

Interessanterweise funktioniert das auch.