我对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;
答案 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。