утверждать срабатывает слишком поздно - PullRequest
1 голос
/ 18 октября 2019

Пожалуйста, рассмотрите следующую примерную модель 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 Ответ

3 голосов
/ 18 октября 2019

Это две части:

  1. Почему это не сработало до конца? Причина в том, что по численным причинам решатели создают события для таких отношений и не хотят слишком много событий, и, таким образом, считают y>x_min истинным, пока оно «почти истинно», то есть y>x_min-eps, для небольшого эпсилона. ,Это объясняется в разделе 8.5 События и синхронизация спецификации. https://specification.modelica.org/v3.4/Ch8.html#events-and-synchronization
  2. Почему это сработало в конце? Причина в том, что в конце симуляции происходит событие, потому что модель может содержать оператор terminal. При событии сравнения обрабатываются более буквально.

Если бы вы использовали x>x_min и x<=x_min, вместо этого это сработало бы так, как вы ожидали.

В противном случае, если бы вы использовалиy = if x>=x_min then x else x_min тогда y может быть немного ниже x_min, но сообщения сработают.

...