Dymola 事件附近的欧拉求解器时间步长
Euler solver time step near events in Dymola
在接近状态事件时,求解器将采取缩短的时间步长以便使步长与事件对齐。这有利于保持事件附近的准确性;然而,时间变量似乎没有根据步长更新,导致 Dymola 的结果不正确:
这是重现问题的 Modelica 代码:
model Unnamed
Modelica.Blocks.Sources.Trapezoid ramp(
period=1,
rising=0.1,
falling=0.1)
annotation (Placement(transformation(extent={{-52,20},{-32,40}})));
Modelica.Blocks.Continuous.FirstOrder firstOrder(T=0.001)
annotation (Placement(transformation(extent={{-20,20},{0,40}})));
Modelica.Blocks.Sources.Pulse pulse(period=0.1222)
annotation (Placement(transformation(extent={{-40,-20},{-20,0}})));
equation
connect(firstOrder.u, ramp.y)
annotation (Line(points={{-22,30},{-31,30}}, color={0,0,127}));
annotation (uses(Modelica(version="3.2.2")), experiment(
Interval=0.001,
__Dymola_fixedstepsize=0.001,
__Dymola_Algorithm="Euler"));
end Unnamed;
有没有办法在 Dymola 中禁用事件处理并保持 Euler 时间步固定?或者更好的是,使时间变量正确更新。谢谢
分为两部分:
- 关闭对事件(不仅是时间事件)的这种特殊处理。对此没有理想的方法,但您可以设置一个编译器标志(在 Dymola 2020x 中,它位于模拟>设置>编译器>自定义选项>编译器中)并为 Visual Studio 设置
/DFindEvent_=0
- 我相信对于 gcc 应该是-DFindEvent_=0
。
- 不幸的是,似乎无法根据需要针对时间轴调整时间值。
但是,在许多情况下,这会导致事件处理不准确,从而导致问题,例如,机械系统中的离合器未完全锁定。
在接近状态事件时,求解器将采取缩短的时间步长以便使步长与事件对齐。这有利于保持事件附近的准确性;然而,时间变量似乎没有根据步长更新,导致 Dymola 的结果不正确:
这是重现问题的 Modelica 代码:
model Unnamed
Modelica.Blocks.Sources.Trapezoid ramp(
period=1,
rising=0.1,
falling=0.1)
annotation (Placement(transformation(extent={{-52,20},{-32,40}})));
Modelica.Blocks.Continuous.FirstOrder firstOrder(T=0.001)
annotation (Placement(transformation(extent={{-20,20},{0,40}})));
Modelica.Blocks.Sources.Pulse pulse(period=0.1222)
annotation (Placement(transformation(extent={{-40,-20},{-20,0}})));
equation
connect(firstOrder.u, ramp.y)
annotation (Line(points={{-22,30},{-31,30}}, color={0,0,127}));
annotation (uses(Modelica(version="3.2.2")), experiment(
Interval=0.001,
__Dymola_fixedstepsize=0.001,
__Dymola_Algorithm="Euler"));
end Unnamed;
有没有办法在 Dymola 中禁用事件处理并保持 Euler 时间步固定?或者更好的是,使时间变量正确更新。谢谢
分为两部分:
- 关闭对事件(不仅是时间事件)的这种特殊处理。对此没有理想的方法,但您可以设置一个编译器标志(在 Dymola 2020x 中,它位于模拟>设置>编译器>自定义选项>编译器中)并为 Visual Studio 设置
/DFindEvent_=0
- 我相信对于 gcc 应该是-DFindEvent_=0
。 - 不幸的是,似乎无法根据需要针对时间轴调整时间值。
但是,在许多情况下,这会导致事件处理不准确,从而导致问题,例如,机械系统中的离合器未完全锁定。