如上所述:我希望随时间计算连续变量的最小值(和/或最大值)。这是一个演示的最小示例:
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
和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 中使用它的原因。如果我与常数值进行比较,它似乎有效(这对这个特殊的问题)。
编辑3
u_min = smooth(0, if u < u_min then u else pre(u_min));
有趣的是,这也有效。