【发布时间】: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