任务:
y1,其导数由某些定律驱动,y1 = sin(time)y1 = 3.0 y2y2 = y1 + offsetParameter(因此在模拟过程中恒定)并根据 等的起始/初始值y1进行y2offset = y2.start - y1.start代码
从概念上讲我想实现:
model SetParametersFromInitialValues
Real y1(start = 3.0, fixed = true);
Real y2(start = 3.0, fixed = true);
parameter Real offset(fixed = false);
initial equation
offset = y2.start - y1.start;
equation
der(y1) = sin(time);
y2 = y1 + offset;
end SetParametersFromInitialValues;
Run Code Online (Sandbox Code Playgroud)
我认为它可以工作,因为start应该是内置类型 …
问题: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 …Run Code Online (Sandbox Code Playgroud)