OpenModelica 和 Dymola 中的 DASSL 求解器

DASSL solver in OpenModelica and Dymola

我对 OpenModelica 和 Dymola 中的事件处理有疑问。以下模型将输入信号限制在某个阈值。这是避免 log() 的负参数所必需的。因此,一个事件被创建,参数 'l' 的变量随着事件变为真而改变。

据我了解,DASSL 求解器应该能够识别事件并自动调整其步长以正确解决事件。给定的间隔数仅用于定义保存到输出的点数。

在 Dymola 中使用 DASSL 求解模型“CompleteModel”10 秒,间隔数为 100,效果很好,变量“l”限制为 0.05。求解只有 10 个间隔的模型失败。奇怪的是,OpenModelica 中的 DASSL 解决了正确的模型,独立于给定的间隔数。

可以预料到这种行为吗? Dymola 和 OpenModelica 的 DASSL 求解器之间有很大区别吗?在我看来,使用 DASSL 的模型的正确解应该独立于(保存的)间隔的数量(就像在 OpenModelica 中一样)。

package EventHandling

 model LimitSignal
  Real l;
  Real lmin(start = 1, fixed = true);
  Real x;
  Boolean Event(start = false, fixed = true);
  input Real InputSignal;
 algorithm 
  when InputSignal <= 0.05 then
   Event := true;
   lmin := pre(InputSignal);
  end when;
 equation 
  l = if Event then lmin else InputSignal;
  x = log(l);
 end LimitSignal;

 model RampSignal
  parameter Real start = 1;
  parameter Real height = 2;
  parameter Real Time = 10;
  output Real y;
 equation 
  y = 1 - (height/Time)*time;
 end RampSignal;

 model CompleteModel
  LimitSignal EventHandling(InputSignal = Signal.y);
  RampSignal Signal;
 end CompleteModel;

end EventHandling;

DASSL 求解器不同。 OpenModelica 有多种不同的 DASSL 求解器,所以即使是 OpenModelica 也不同于它自己。 OpenModelica dassl 代码基于daskr(以前是ddasl)。 选项包括:

dasslJacobian=[coloredNumerical (default)|numerical|internalNumerical|coloredSymbolical|symbolical]
dasslnoRootFinding
dasslnoRestart
maxStepSize
maxIntegrationOrder

事件处理是独立于数值积分器完成的,因此在不同的工具中也有不同的处理方式。如果您更改输出间隔,OpenModelica 的行为也会有所不同,因为它被用作启发式来确定一些标称步骤 size/epsilon values/etc.

但是,是的,您应该能够使用可变步长求解器获得正确的解决方案。

注意:我在 OpenModelica 中尝试过,stopTime=10、numberOfIntervals=10 也因 dassl 而失败。它只是绘制断言之前的值。 所以它到达 time=4.5,尝试步进到 time=5.0(断言触发器),尝试 time=6.0(断言触发器),尝试 time=5.25(断言触发器),放弃。 OpenModelica 提前放弃的原因是它触发断言而不是收敛错误或事件。大概是一个bug.