首页 > 解决方案 > 欧拉求解器在 Dymola 事件附近的时间步长

问题描述

接近状态事件,求解器将采取缩短的时间步长,以便将步长与事件对齐。这有利于保持事件附近的准确性;但是,时间变量似乎没有根据步长更新,导致 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 中禁用事件处理并保持欧拉时间步长固定?或者更好的是,使时间变量正确更新。谢谢

标签: modelicadymola

解决方案


有两个部分:

  • 关闭对事件的特殊处理(不仅仅是时间事件)。对此没有理想的方法,但您可以设置编译器标志(在 Dymola 2020x 中,它位于 Simulation>Setup>Compiler>Custom Options>Compiler)并/DFindEvent_=0为 Visual Studio 设置 - 我相信它应该-DFindEvent_=0用于 gcc。
  • 不幸的是,似乎无法根据需要调整时间轴的时间值。

然而,在许多情况下,这将导致对事件的处理不太准确,这将导致问题,例如,离合器没有完全锁定在机械系统中。


推荐阅读