断言触发得太晚

时间:2019-10-18 07:43:02

标签: events printing assert modelica

请考虑以下Modelica示例模型:

model Detection2
  Real x = (1-2*time)*1e5;
  parameter Real x_min=0.1;
  Real y;

equation 
  y = max(x,x_min);
  assert(y>x_min, "(assert) triggered at t = " + String(time), level=AssertionLevel.warning);
  when y <= x_min then
      Modelica.Utilities.Streams.print("(when) triggered at t = " + String(time));
  end when;
  annotation (experiment(StopTime=1));
end Detection2;

当我模拟它(在Dymola 2019FD01中)时,得到以下结果: enter image description here

结果看起来像预期的一样,但是assert消息和print语句都打印了错误的时间,它们总是打印停止时间,而不是我期望的时间!?

1 个答案:

答案 0 :(得分:3)

这有两部分:

  1. 为什么它在结束前没有触发?原因是出于数量上的原因,求解器会为此类关系创建事件,并且不希望事件过多,因此只要y>x_min为“几乎为真”,即认为y>x_min-eps为真,一些小的epsilon。在规范的8.5事件和同步中对此进行了说明。 https://specification.modelica.org/v3.4/Ch8.html#events-and-synchronization
  2. 为什么它最终触发?原因是模拟结束时有一个事件,因为模型可能包含terminal运算符。在某些情况下,比较会从字面上看。

如果您使用x>x_minx<=x_min代替,它将按预期工作。

或者,如果您使用过y = if x>=x_min then x else x_min,则y可能会略低于x_min,但是消息会触发。