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?
Ich verwende OpenModelica 1.15 (war 1.9.2)
EDIT 2Da 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).
u_min = smooth(0, if u < u_min then u else pre(u_min));
Interessanterweise funktioniert das auch.