我试图了解何时在 Modelica 中生成事件。在函数的上下文中,我注意到了我没想到的行为:函数似乎抑制了事件的生成。
我很惊讶,因为据我所知,Modelica 参考文献中没有明确说明这一点。例如,如果我在 OpenModelica 1.17.0 的 OMEdit 中运行此模型
model timeEventTest
Real z(start=0);
Real dummy(start=0);
equation
der(z) = dummy;
algorithm
if time > 10 then
dummy := 1;
else
dummy := -1.;
end if;
end timeEventTest;
我在 OMEdit 的求解器窗口中得到以下输出
### STATISTICS ###
timer
events
1 state events
0 time events
solver: dassl
46 steps taken
46 calls of functionODE
44 evaluations of jacobian
0 error test failures
0 convergence test failures
0.000122251s time of jacobian evaluation
The simulation finished successfully.
除了求解器(我使用 dassl)将 time=10 处的事件解释为状态事件而不是时间事件这一事实之外,行为与预期一致。但是,如果我改为运行(数学上相同的)模型
model timeEventTest2
Real z(start=0);
equation
der(z) = myfunc(time-10);
end timeEventTest2;
myfunc 定义为
function myfunc
input Real x;
output Real y;
algorithm
if x > 0 then
y := 1;
else
y:= -1;
end if;
end myfunc;
我在 OMEdit 中获得以下输出
### STATISTICS ###
timer
events
0 state events
0 time events
solver: dassl
52 steps taken
79 calls of functionODE
63 evaluations of jacobian
13 error test failures
0 convergence test failures
0.000185296s time of jacobian evaluation
The simulation finished successfully.
不仅没有检测到 time = 10 的事件,求解器甚至遇到了一些问题,如错误测试失败所示。这是一个微不足道的例子,但是,我可以想象,按功能对事件的明显抑制可能会导致较大模型中的主要问题。我在这里错过了什么?我可以强制在函数内严格触发事件吗?一些内置函数也会触发事件,例如 div 和 mod(奇怪的是,sign 和 abs 不会)。
编辑:显然,您需要至少运行示例 > 10 秒。我将模拟运行到 20 秒。