问题:函数的inverse
注释将被忽略,并且其倒数是通过数值计算的。
根据Modelica Specifications,可以指定给定函数的逆。
为了测试此功能,我尝试了一个非常简单的模型,该模型具有两个功能:
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;
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;
答案 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。