处理Modelica中的跳跃/不连续

时间:2017-06-07 09:22:56

标签: modelica

我想知道是否有人在处理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秒的跳跃变为连续过渡,其中斜率的导数是有限的?我尝试过noEventsmooth函数,但是我无法让它们做我需要的。

编辑: 我的主要模型中的问题是这些事件引发了喋喋不休,因此我也需要它来实时工作。同样在我的完整模型中,事件是状态事件,因此时间未知。

2 个答案:

答案 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;

以下是输出图: Spine Output

答案 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。)