Ошибка «изменчивость» в модели с вызовом функции

Следующий код

model FunctionCall
  Boolean result;

  function F
    input Real p1;
    output Boolean result;
  algorithm 
    result :=p1 < 0.5;
  end F;

algorithm 
  result :=F(time);
end FunctionCall;

(также описано в http://www.modelica-forum.com/forums/index.php?showtopic=2) по-прежнему выдает ошибку в Dymola 2018FD01, а в OpenModelica это допускается. Это неправильный код Modelica или ошибка Dymola? Заранее спасибо.


person Christian Bertsch    schedule 18.01.2018    source источник


Ответы (2)


Ответ Ганса - правильный ответ на ваш вопрос.

Ваш незаданный вопрос может заключаться в том, как можно добиться такого же поведения в рамках языковых спецификаций. Ниже я предложил одно из возможных решений.

model FunctionCall
  Boolean result;

  function F
    input Real p1;
    output Integer result;
  algorithm 
    result := if p1 < 0.5 then 1 else 0;
  end F;

algorithm 

  result := if F(time) < 0.5 then false else true;

end FunctionCall;
person Scott G    schedule 18.01.2018
comment
Хороший обходной путь, но я бы использовал if F (time) ‹0.5, затем false, else true вместо этого, поскольку каждое сравнение сопоставляется с функцией пересечения для числовых решателей, и вы хотите, чтобы функции пересечения пересекали ноль, а не просто касались его. Другими словами, решатели обрабатывают ‹и‹ = одинаково. (В качестве альтернативы используйте 0, 1,2 вместо 0,0.5,1) - person Hans Olsson; 18.01.2018
comment
not F(time) < 0.5 также должен выполнять свою работу. - person tbeu; 19.01.2018

Модель неверная.

3.8 «Для присваивания v: = expr или уравнения привязки v = expr, v должно быть объявлено, чтобы быть как минимум такой же переменной, как expr»

Логические переменные - это выражения с дискретным временем в соответствии с 3.8.3 «Переменные с дискретным временем, т. Е. Целочисленные, логические, строковые переменные и переменные перечисления, а также вещественные переменные, назначенные в предложениях when»

F (время) не является выражением с дискретным временем, поскольку 3.8.3 включает только «вызовы функций, в которых все входные аргументы функции являются выражениями с дискретным временем»

Все по Modelica 3.4.

Причина в том, что логические переменные в моделях должны изменяться только при событиях, а результат такой функции, как F (время), не может ни гарантировать этого, ни надежно генерировать события.

person Hans Olsson    schedule 18.01.2018
comment
Так же как информация: цифры, о которых говорит Ханс, являются главами спецификации языка Modelica 3.4 (поставляется с Dymola и доступен на modelica.org) - person marco; 18.01.2018
comment
Спасибо за объяснение. Но тогда я не понимаю, почему обходной путь, описанный на modelica-forum.com /forums/index.php?showtopic=2) работает (добавление дополнительного фиктивного реального вывода). - person Christian Bertsch; 18.01.2018
comment
Этот обходной путь тоже неверен, но в настоящее время отсутствует проверка для функций с множественным возвратом. - person Hans Olsson; 18.01.2018