如上所述:我希望计算连续变量随时间变化的最小值(和/或最大值)。这是一个演示的最小示例:
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
and u_max=1
。不幸的是,模拟因“矩阵单数!”而崩溃。错误。谁能指导我如何避免这种情况?
EDIT 1
我正在使用 OpenModelica 1.15(以前是 1.9.2)
EDIT 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
?! why?
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 中使用它的原因。如果我与常量值进行比较,它似乎可以工作(这对于这个特定问题没有用)。
EDIT3
u_min = smooth(0, if u < u_min then u else pre(u_min));
有趣的是,这也有效。