问题:函数的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。