函数的 Modelica 注释逆函数被忽略
Modelica annotation inverse of function is ignored
问题:函数的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;
- 几个相关的方程式
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.
问题:函数的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;
- 几个相关的方程式
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.