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