【问题标题】:Numerical issues integrating a pulse signal that is delayed (fixedDelay)集成延迟脉冲信号的数值问题 (fixedDelay)
【发布时间】:2018-12-10 16:41:36
【问题描述】:

我注意到在 Modelica 中集成延迟固定时间的脉冲输入的数值问题(使用 Wolfram System Modeler 4.3):

model PulseTest "Test FixedDelay with Pulse Input";
    Modelica.Blocks.Sources.Pulse pulse(
        startTime = 1, 
        width = 100, 
        period = 1/32, 
        amplitude = 32, 
        nperiod = 1
    );
    Modelica.Blocks.Nonlinear.FixedDelay fixedDelay( delayTime = 5 );
    Modelica.Blocks.Continuous.Integrator x; // integrator for the undelayed pulse
    Modelica.Blocks.Continuous.Integrator y; // integrator for the delayed pulse
equation
    connect( pulse.y, fixedDelay.u );
    connect( fixedDelay.y, y.u );
    connect( pulse.y, x.u );
end PulseTest;

对周期 = 1/a、幅度 = a、宽度 = 100 % 的脉冲进行积分应该得到 1.0。但从图中可以看出,这不是我得到的延迟脉冲:

只有未延迟的信号才能使用 DASSL 给出正确的值。 period = 1/a = 1/8 已经出现数值积分误差,并且(自然)随着 a 的增长而增长。

什么是最好的补救措施?

【问题讨论】:

  • 在 Dymola 中抛出这个会产生相同的结果。所以不是系统建模器问题。更改求解器中的“步数”会更改解决方案,n->infinity 提供正确答案。仅供参考,本身并没有太大用处
  • 我对 Dymola 中的问题进行了快速审查,并且可以确认它也存在。似乎原始脉冲用事件描述得很好,但从延迟中出来的脉冲不再是正确的脉冲。它与脉冲的接近程度取决于求解器的步长,而正如 Scott 所描述的,这反过来似乎又受到步数的影响。
  • @MarkusA。这一切都取决于:固定步长 Euler(步长 0.001)将获得正确的脉冲和积分,但 Runge Kutta 和我相信 Heun 的方法不会 - 这里脉冲确实会消失。不幸的是,这远非“轻松”。
  • @gwr:再次确认,Fixed step Euler 在 Dymola 中使用 1ms 步长。我尝试了 5e-5 的步长来覆盖 1/32 的时间段。这会使延迟的脉冲消失。
  • 我在 OpenModelica 中尝试过,也看到了类似的结果(虽然值太小而不是太大(0.8 而不是你显示的 1.1)

标签: precision modelica dymola openmodelica systemmodeler


【解决方案1】:

问题是,正如 Markus A 所写,该延迟不会将不连续性从输入传播到输出,因此模拟不会以与正常阶跃变化相同的方式处理延迟阶跃变化,即使用事件-检测和事件处理。

从工具的角度来看,平滑插值延迟信号不仅是最简单的解决方案,而且如果延迟信号被反馈,还可以避免级联事件。

在使用任何可变步长求解器时,我看不到任何简单可靠的解决方法。

【讨论】:

  • 谢谢 (+1),不幸的是,这是一个非常发人深省的消息。上面 tbeu 的评论表明 SimulationX 中的求解器更智能地解决了问题?显然,应该有更好的方法来在固定延迟中传播不连续性? (至少,例如使用欧拉和固定步骤给我的模型带来了很多其他问题......)
  • 我会说这是一个不同的权衡;传播不连续性的问题在于,您可能会得到一连串传播的不连续性,从而导致其他问题。
【解决方案2】:

正如 Ankit 在 Wolfram Forum 上发布的那样,问题在于信号是离散的,但延迟块没有意识到这一点。它可以用不同的延迟块来修复:

model DiscreteFixedDelay
  discrete input Modelica.Blocks.Interfaces.RealInput u ;
  discrete output Modelica.Blocks.Interfaces.RealOutput y ;
  parameter Modelica.SIunits.Time delayTime(start = 5) = 5 "Delay time of output with respect to input signal";
equation
  y = delay(u, delayTime);
end DiscreteFixedDelay;

问候

【讨论】:

  • 不幸的是,该解决方案导致了更特殊的模型,这些模型将离散与连续组件分开,失去了一般性。请注意,即使是“离散”脉冲输出也没有建模为discrete。太糟糕了,没有更好的方法来处理这个问题。
猜你喜欢
  • 1970-01-01
  • 2020-02-23
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
相关资源
最近更新 更多