2

我对 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;
4

1 回答 1

3

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

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

事件处理与数值积分器分开完成,因此在不同的工具中也以不同的方式完成。如果您更改输出间隔,OpenModelica 的行为也会有所不同,因为它被用作确定某些标称步长/epsilon 值/等的启发式方法。

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

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

于 2015-02-20T20:59:47.827 回答