OpenModelica和Dymola中的DASSL求解器

时间:2015-02-20 15:15:14

标签: modelica dymola openmodelica

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

1 个答案:

答案 0 :(得分: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。它只是绘制值直到断言的时间。 所以它得到时间= 4.5,尝试步进时间= 5.0(断言触发器),尝试时间= 6.0(断言触发器),尝试时间= 5.25(断言触发器),放弃。 OpenModelica早期放弃的原因是它触发断言而不是收敛错误或事件。可能是bug