Modelica неожиданное поведение утверждения - PullRequest
1 голос
/ 08 ноября 2019

Мне нужно утверждать, что переменная (a в MWE ниже) больше другой (b).

Я заметил, что утверждение a>b внутри импортированной модели ведет себя как a>=b. Я попытался обойти эту проблему, чтобы утверждать вместо a>(b+Constants.small). Изменение утверждения, даже когда утверждение для a>(b+someBiggerNumber) все еще не работает, как ожидалось для a=b. Если a!=b утверждение работает, как ожидалось.

Это ошибка или я что-то не так делаю? Если это ошибка, есть ли обходной путь?

MWE:

model MWE

  model SomeModel
    parameter Real a(start=1);
    parameter Real b(start=1);
  protected
    Real c=5/(a-b);
  equation
    assert(a > b, "a has to be bigger than b. However, a (=" + String(a) +") < b (=" + String(b) + ")");
    //assert(a > (b + 1), "a has to be bigger than b+1. However, a (=" + String(a) +") < b (=" + String(b) + ")");
  end SomeModel;

  SomeModel sm(a = 5, b = 5);
  Real var;

equation
  var = sm.c;

end MWE;

// assert a > b
// a=5, b=4 no fail, as expected, same for b<4
// a=5, b=5 no fail
// a=5, b=6 fail, as expected, same for b>3

// assert a > (b + 1)
// a=5, b=3 no fail, as expected, same for b<3
// a=5, b=4 fail, as expected
// a=5, b=5 no fail
// a=5, b=6 fail, as expected, same for b>3

Ответы [ 3 ]

4 голосов
/ 08 ноября 2019

Если вы хотите получить предсказуемый порядок, используйте алгоритм one :

  protected
    Real c;
algorithm
    assert(a > b, "a has to be bigger than b. However, a (=" + String(a) +") <= b (=" + String(b) + ")");
    c:=5/(a-b);

В качестве альтернативы превратите его в функцию и получите утверждение внутри функции.

0 голосов
/ 08 ноября 2019

Как обычно, проблема заключается в том, чтобы сидеть перед клавиатурой: /

Я не мог обернуть голову вокруг проблемы, переступив через нее в своей голове. Утверждение работает нормально, но Modelica не выполняет последовательные шаги по уравнениям, как это делает большинство языков программирования, и поэтому перед утверждением чего-либо сталкивается с делением на ноль ошибок.

Изменение последовательности следующим образом

  protected
    Real c;
  initial equation
    assert(a > b, "a has to be bigger than b. However, a (=" + String(a) +") < b (=" + String(b) + ")");
  algorithm
    assert(a > b, "a has to be bigger than b. However, a (=" + String(a) +") < b (=" + String(b) + ")");
  equation
    assert(a > b, "a has to be bigger than b. However, a (=" + String(a) +") < b (=" + String(b) + ")");
    c=5/(a-b);

это не меняет.

Если кто-то знает, как сначала запустить утверждение, чтобы получить более понятные сообщения об ошибках, ваш ввод приветствуется:)

0 голосов
/ 08 ноября 2019

Вы можете проверить вещественные переменные на равенство с Modelica.Math.isEqual(a,b) и скомбинировать их следующим образом: (a > b) or Modelica.Math.isEqual(a,b)

...