Обратная пометка от Modelica игнорируется - PullRequest
3 голосов
/ 06 марта 2019

Проблема: аннотация inverse функции игнорируется, а обратное вычисляется численно.

Согласно Спецификации Modelica можно указать обратное для данной функции.

Чтобы проверить эту функцию, я попытался использовать очень тривиальную модель с двумя функциями:

  • direct функция y (x) = грех (x)
    function y_from_x
      input Real x;
      output Real y;
    algorithm
      y:=sin(x);
      annotation(inverse(x = x_from_y(y)));
    end y_from_x;
    
  • его обратная функция x (y) = asin (y)
    function x_from_y
      input Real y;
      output Real x;
    algorithm
      x:=asin(y);
    end x_from_y;
    
  • пара соответствующих уравнений
    y = time;
    y = y_from_x(x);
    

Как видите, для получения значения переменной x , функция y_from_x должно быть инвертировано ;следовательно, поскольку аннотация inverse явно говорит о том, как инвертировать функцию, я ожидаю, что будет вызван x_from_y .

Нет, этого не происходит.Даже на этапе выравнивания обратная функция отбрасывается, и решение y_from_x вычисляется численно с помощью итерационного цикла.Это происходит как с OpenModelica v1.14, так и с Dymola 2018.

Это ожидаемое поведение?Как использовать эту inverse аннотацию?Есть ли способ избежать такого неэффективного итеративного решения?

Полный код

model test_inverse

Real y, x;

function y_from_x
  input Real x;
  output Real y;
algorithm
  y:=sin(x);
  annotation(inverse(x = x_from_y(y)));
end y_from_x;

function x_from_y
  input Real y;
  output Real x;
algorithm
  x:=asin(y);
end x_from_y;


equation
  y = time;
  y = y_from_x(x);
end test_inverse;

1 Ответ

4 голосов
/ 06 марта 2019

Проблема в Dymola (и, вероятно, также в OpenModelica) заключается в том, что перед использованием инверсии функция встроена, но ваш синтаксис правильный.

Встраивания можно избежать, используя:

function y_from_x
  input Real x;
  output Real y;
algorithm
  y:=sin(x);
  annotation(LateInline=true, inverse(x = x_from_y(y)));
end y_from_x;

Однако, обратите внимание, что Dymola не инвертирует численно функцию синуса численно - вместо этого она использует встроенную инверсию для функции синуса; который похож на asin.

...