积分延迟脉冲信号的数值问题 (fixedDelay)
Numerical issues integrating a pulse signal that is delayed (fixedDelay)
我注意到在 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 的增长而增长。
最好的治疗方法是什么?
问题是,正如 Markus A 所写,延迟不会将不连续性从输入传播到输出,因此模拟不会以与正常阶跃变化相同的方式处理延迟阶跃变化,即具有事件检测和事件处理功能。
从工具的角度来看,平滑插值延迟信号不仅是最简单的解决方案 - 而且如果延迟信号被反馈,还可以避免级联事件。
在使用任何可变步长求解器时,我看不到任何简单可靠的解决方法。
正如 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;
此致
我注意到在 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 的增长而增长。
最好的治疗方法是什么?
问题是,正如 Markus A 所写,延迟不会将不连续性从输入传播到输出,因此模拟不会以与正常阶跃变化相同的方式处理延迟阶跃变化,即具有事件检测和事件处理功能。
从工具的角度来看,平滑插值延迟信号不仅是最简单的解决方案 - 而且如果延迟信号被反馈,还可以避免级联事件。
在使用任何可变步长求解器时,我看不到任何简单可靠的解决方法。
正如 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;
此致