函数的Modelica注释反函数被忽略

问题描述 投票:3回答:1

问题:忽略函数的inverse注释,并以数字方式计算逆。

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

为了测试这个功能,我尝试了一个非常简单的模型,它有两个函数:

  • 直接函数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;
  • 几个相关的方程式 qazxsw poi

如您所见,为了检索变量x的值,应该反转函数y_from_x;因此,由于y = time; y = y_from_x(x); 注释明确告诉如何反转函数,我希望调用x_from_y。

不,那不是发生了什么。即使只是在展平步骤中,也会丢弃反函数,并且使用迭代循环以数字方式计算y_from_x的解。 OpenModelica v1.14和Dymola 2018都会发生这种情况。

这是预期的行为吗?如何使用这个inverse注释?有没有办法避免这种低效的迭代解决方案?

完整代码

inverse
annotations modelica inverse dymola openmodelica
1个回答
4
投票

Dymola(也可能在OpenModelica中)的问题是在使用反转之前函数是内联的,但是你的语法是正确的。

使用以下方法可以避免内联:

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不会在数字上反转正弦函数 - 而是使用内置逆函数进行正弦函数;这与asin类似。

© www.soinside.com 2019 - 2024. All rights reserved.