ModelICA注释函数倒数被忽略



问题:函数的inverse注释被忽略,并且逆计算数值。

根据Modelica规范,可以指定给定函数的倒数。

为了测试此功能,我尝试使用具有两个功能的非常琐碎的模型尝试:

  • 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;

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。

最新更新