【问题标题】:Dealing with jumps/discontinuities in Modelica处理 Modelica 中的跳跃/不连续性
【发布时间】:2017-06-07 09:22:56
【问题描述】:

我想知道是否有人在处理 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 函数,但我无法让它们做我需要的。

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

【问题讨论】:

    标签: modelica


    【解决方案1】:

    也许您正在寻找类似以下代码的行为?

    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;
    

    下面是输出图:

    【讨论】:

    • 看起来很不错!从概念上讲,这确实是我想要它做的。你知道这种方法在模拟过程中是否有效,而不是作为一种处理最终结果的方法吗?我可能应该在我原来的帖子中澄清这一点。
    • @Bart 也许我不太听从你的评论,但这是在模拟过程中发生的。到目前为止,这种方法对我来说适用于更复杂的情况。
    • 抱歉,我不熟悉正确的术语。我的意思是,这是否能有效地在跳跃发生之前平滑跳跃?我的主要模型中的问题是在“流”变量的步进跳转时发生的颤动。这个解决方案能解决这个问题吗?
    • @Bart 我相信它会,但现在你已经到了我认为你只需要尝试并验证的地步。
    • 我已尝试实现此方法,但目前收效甚微。在我的实际模型中,事件是多个连续的状态事件,开始时间和持续时间未知,因此我无法确定 spliceFunction 的第三个参数的一般表达式。
    【解决方案2】:

    Scott 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。)

    【讨论】:

    • 我不确定我发布的解决方案仅适用于时间的断言是否正确。您可以将时间替换为其他变量的函数的任何变量。甚至“低”和“高”值也可以是其他变量的函数。我已经成功地以这种方式使用了这种方法(到目前为止;))。
    • 你说得对,它适用于其他变量。但是,仍然必须明确涉及一些变量,而不仅仅是任意状态事件。
    • 此方法似乎适用于我的模型中的一些修改,但是当发生从值到 0 的等效步骤时,我仍然会遇到一些轻微的抖动。你有什么建议吗?
    • @HansOlsson,我明白你现在的意思。好建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    相关资源
    最近更新 更多