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