如何使用 Modelica 确定经过时间的混合时间连续和时间离散信号 x(t) 的最大值存在问题,即
y(t) = max{ x(s) with s in [startTime,t] }。
这是 Modelica 错误跟踪器中的一个未解决问题(请参阅 https://trac.modelica.org/Modelica/ticket/109)。
我将给出一个 SimultionX 特定的解决方案。
如何使用 Modelica 确定经过时间的混合时间连续和时间离散信号 x(t) 的最大值存在问题,即
y(t) = max{ x(s) with s in [startTime,t] }。
这是 Modelica 错误跟踪器中的一个未解决问题(请参阅 https://trac.modelica.org/Modelica/ticket/109)。
我将给出一个 SimultionX 特定的解决方案。
SimulationX 通过 - 运算符扩展了 Modelica,该last
运算符返回参数的最后一个接受值。在事件时间点,它返回事件迭代之前积分停止的值。-last
运算符可用于计算当前x
值的最大值和上一个最大值。请参阅以下工作示例。
model test "test.ism"
extends SimModel;
Real x=2*sin(2*pi*time)+sin(20*pi*time)+(if time < 0.5 then 0 else 3) "some input signal with jump";
Real y=if noEvent( time > time.start ) then max(x,last(y)) else x "Calculate the maximum with the help of the last-operator";
Real z(start=0,fixed=true)=-der(z)+y "Just any dymanics.";
end test;
输入信号x
和相应的输出信号y
如下图所示。
我不确定 last() 到底是做什么的。但是,根据您的描述,它似乎与标准模型中的 pre() 做同样的事情。这在 OpenModelica 中给出了相同的结果:
model minTest
Real x;
Real y;
equation
x = 2. * sin(2.0 * Modelica.Constants.pi * time) + sin(20.0 * Modelica.Constants.pi * time)+ (if time < 0.5 then 0. else 3.);
y=max(x,pre(y)) ;
end minTest;