Dar*_*oni 4 annotations inverse modelica openmodelica dymola
问题:inverse函数的注释将被忽略,并且反函数将通过数值计算。
根据Modelica规范,可以指定给定函数的逆函数。
为了测试此功能,我尝试了一个非常简单的模型,该模型具有两个功能:
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;
Run Code Online (Sandbox Code Playgroud)function x_from_y
input Real y;
output Real x;
algorithm
x:=asin(y);
end x_from_y;
Run Code Online (Sandbox Code Playgroud)y = time;
y = y_from_x(x);
Run Code Online (Sandbox Code Playgroud)如您所见,为了检索变量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;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
但是,请注意,Dymola不会在数值上反转正弦函数-而是对正弦函数使用内置的反函数;这与asin类似。
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |