忽略函数的Modelica注释逆

时间:2019-03-06 09:42:34

标签: annotations modelica inverse dymola openmodelica

问题:函数的inverse注释将被忽略,并且其倒数是通过数值计算的。

根据Modelica Specifications,可以指定给定函数的逆。

为了测试此功能,我尝试了一个非常简单的模型,该模型具有两个功能:

  • direct 函数 y(x)= sin(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 个答案:

答案 0 :(得分:4)

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。

相关问题