Modelica 如何在SimulationX中确定混合时间连续时间离散信号的最大值?

Modelica 如何在SimulationX中确定混合时间连续时间离散信号的最大值?,modelica,simulationx,Modelica,Simulationx,如何使用Modelica确定随时间推移的混合时间连续和时间离散信号x(t)的最大值,即 y(t)=max{x(s),其中s在[startTime,t]} 这是Modelica bug跟踪器中的一个公开问题(请参阅) 我将给出一个特定于SimulationX的解决方案。SimulationX通过返回参数最后接受值的last-运算符扩展了Modelica。在事件时间点,它返回在事件迭代之前集成停止的值。 last-运算符可用于计算当前x值和最后一个最大值的最大值。请参见下面的工作示例 model t

如何使用Modelica确定随时间推移的混合时间连续和时间离散信号x(t)的最大值,即

y(t)=max{x(s),其中s在[startTime,t]}

这是Modelica bug跟踪器中的一个公开问题(请参阅)


我将给出一个特定于SimulationX的解决方案。

SimulationX通过返回参数最后接受值的
last
-运算符扩展了Modelica。在事件时间点,它返回在事件迭代之前集成停止的值。
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;
模型测试“test.ism”
扩展SimModel;
实x=2*sin(2*pi*时间)+sin(20*pi*时间)+(如果时间<0.5,则为0,否则为3)“带跳跃的某个输入信号”;
实际y=如果无事件(时间>时间开始),则最大值(x,最后一个(y))否则x“在最后一个操作员的帮助下计算最大值”;
实数z(起始值=0,固定值=true)=-der(z)+y“任何动态狂。”;
结束试验;
输入信号
x
和相应的输出信号
y
如下图所示


SimulationX通过
last
-运算符扩展Modelica,该运算符返回参数的最后接受值。在事件时间点,它返回在事件迭代之前集成停止的值。
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;
模型测试“test.ism”
扩展SimModel;
实x=2*sin(2*pi*时间)+sin(20*pi*时间)+(如果时间<0.5,则为0,否则为3)“带跳跃的某个输入信号”;
实际y=如果无事件(时间>时间开始),则最大值(x,最后一个(y))否则x“在最后一个操作员的帮助下计算最大值”;
实数z(起始值=0,固定值=true)=-der(z)+y“任何动态狂。”;
结束试验;
输入信号
x
和相应的输出信号
y
如下图所示


我不确定last()到底做了什么。但是,从您的描述来看,它似乎与标准modelica中的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;
modelmintest
实x;
真实的y;
方程式
x=2。*sin(2.0*Modelica.Constants.pi*时间)+sin(20.0*Modelica.Constants.pi*时间)+(如果时间<0.5,则为0.3);
y=最大值(x,前(y));
末敏试验;

我不确定last()到底做了什么。但是,从您的描述来看,它似乎与标准modelica中的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;
modelmintest
实x;
真实的y;
方程式
x=2。*sin(2.0*Modelica.Constants.pi*时间)+sin(20.0*Modelica.Constants.pi*时间)+(如果时间<0.5,则为0.3);
y=最大值(x,前(y));
末敏试验;

可能的@matth副本这不是的副本,因为它基于
最后一个
-运算符工作,该运算符是SimulationX特定的扩展(如问题中所述)。这就是为什么我没有把它作为答案张贴在那里的原因。另外:这个问题在纯Modelica的框架中没有解决,因为在这个框架中还没有干净的解决方案。@matth如果我把它作为一个答案发布,就会引起关于代码没有在其他Modelica工具中运行的抱怨。重复标志仅指问题。看起来你问相同的问题只是为了给出不同的答案(实际上你甚至什么都没问)。你的回答很好,很有帮助,我对它投了更高的票,但我仍然认为它应该作为现有问题的一个新的备选答案。@matth与PeterE的问题不同的问题出现在标题中。区别在于它要求SimulationX中的解决方案,而不是Modelica解决方案本身。给定的解决方案不能用于其他Modelica环境。正如我已经说过的,PeterE的问题实际上在纯Modelica allone的框架内没有得到解决。@matth的可能重复项这不是的重复项,因为它基于
last
-运算符,这是一个特定于SimulationX的扩展(如问题中所述)。这就是为什么我没有把它作为答案张贴在那里的原因。另外:这个问题在纯Modelica的框架中没有解决,因为在这个框架中还没有干净的解决方案。@matth如果我把它作为一个答案发布,就会引起关于代码没有在其他Modelica工具中运行的抱怨。重复标志仅指问题。看起来你问相同的问题只是为了给出不同的答案(实际上你甚至什么都没问)。你的回答很好,很有帮助,我对它投了更高的票,但我仍然认为它应该作为现有问题的一个新的备选答案。@matth与PeterE的问题不同的问题出现在标题中。区别在于它要求SimulationX中的解决方案,而不是Modelica解决方案本身。给定的解决方案不能用于其他Modelica环境。正如我已经说过的,PeterE问题实际上在纯Modelica allone的框架内没有得到解决。根据Modelica规范3.3 r1第3.7.3节,
pre
-运算符只能应用于离散表达式的变量。变量是离散的,或者
pre
when
-块中应用(所有表达式都是离散的)。这可能在OpenModelica中起作用。如果是这样,它在Modelica规范(版本3.3 r1)之外工作。您应该澄清您的答案。我假设
x
y
属于
Real
类型,并且它们在
时未在
中分配。你的答案可能在OpenModelica中有效,但根据“标准modelica”它是无效的。我没有厕所