我想知道是否有人在处理Modelica中的跳跃/不连续方面有任何提示或技巧。我正在使用OpenModelica,我的问题的简化示例代码如下所示。
model PowerGenerator
Modelica.SIunits.Power P(start=0);
output Modelica.SIunits.Energy E;
equation
if (5 < time) and (time < 15) then P = 3;
else P = 0;
end if;
der(E) = P;
end PowerGenerator;
如何将5和15秒的跳跃变为连续过渡,其中斜率的导数是有限的?我尝试过noEvent
和smooth
函数,但是我无法让它们做我需要的。
编辑: 我的主要模型中的问题是这些事件引发了喋喋不休,因此我也需要它来实时工作。同样在我的完整模型中,事件是状态事件,因此时间未知。
答案 0 :(得分:2)
也许下面代码的行为就像你在寻找的那样?
model PowerGenerator
Modelica.SIunits.Power Plow;
Modelica.SIunits.Power Phigh;
Modelica.SIunits.Power P(start=0);
output Modelica.SIunits.Energy E;
Modelica.SIunits.Power Pold(start=0);
output Modelica.SIunits.Energy Eold;
equation
if (5 < time) and (time < 15) then
Pold = 3;
else
Pold = 0;
end if;
der(Eold) = Pold;
Plow = Modelica.Media.Air.MoistAir.Utilities.spliceFunction(3,0,time-5,1);
Phigh = Modelica.Media.Air.MoistAir.Utilities.spliceFunction(0,3,time-15,1);
P = Modelica.Media.Air.MoistAir.Utilities.spliceFunction(Phigh,Plow,time-10,1);
der(E) = P;
end Power Generator;
答案 1 :(得分:2)
斯科特G的答案很好,但只有在变化取决于时间的情况下,它才有效。更通用的解决方案是使用低通滤波器:
model PowerGenerator
Modelica.SIunits.Power P(start=0);
output Modelica.SIunits.Energy E;
Modelica.Blocks.Continuous.LowpassButterworth lowpassButterworth(f=1)
annotation (Placement(transformation(extent={{-40,20},{-20,40}})));
equation
if (5 < time) and (time < 15) then
P = 3;
else
P = 0;
end if;
lowpassButterworth.u=P;
der(E) = lowpassButterworth.y;
end PowerGenerator;
(我建议使用连接语句 - 但上面也应该是合法的Modelica。)