任何人都可以给我一个暗示“代数循环”的意思 - 以及我应该如何通过添加“pre”-operators来应对这种情况?我真的没有得到它......
Error: Failed to generate code for an algebraic loop
involving when equations or algorithms with when parts.
Unknowns:
pump.Hb_flow
pump.medium.d
pump.medium.h
pump.medium.state.melting
pump.medium.state.T
pump.V_flow
pump.V_flow_single
pump.W_single
Equations:
algorithm
when Modelica.SIunits.Conversions.to_degC(pump.medium.state.T) < 13.9 then
pump.medium.state.melting := true;
elsewhen Modelica.SIunits.Conversions.to_degC(pump.medium.state.T) > 32.8 then
pump.medium.state.melting := false;
end when;
// [removed set of equations that contained no "when"]
You may be able to cut the loop
by putting 'pre' around some of the references to
unknown continuous time variables in when parts or when conditions.
提前致谢, 最好的问候
TIMO。
答案 0 :(得分:2)
通常,这个问题是因为when子句中的等式会影响触发它们的条件语句。
使用Modelica需要了解的事情是,求解器将使用“候选解决方案”作为模拟过程的一部分来评估方程式。这些不一定是它最终会选择的解决方案,但它需要在接近最终解决方案时对它们进行评估。
这有什么关系?那么在你的情况下,我看到你正在改变“融化”变量的值。但是,如果该值然后影响介质温度(触发“熔化”值的变化),则该工具将检测方程组中的不一致性。一个工具可能能够迭代以找到一致的候选解决方案,但Dymola只是“踢”并说它不支持这种情况。
现在,要理解的重要一点是,基本上这通常都是无关的。为什么?因为在大多数情况下,用户真的不希望在这种情况下使用when子句的默认语义。大多数用户想要的是将when子句中的条件视为“原因”,将when子句中的公式视为“效果”。在这个意义上,它们是连续的,效果不应该转变并影响原因(尽管白色条纹写了一首关于这种情况的好歌;-))。
这里的一般模式是隔离条件,然后在when子句中围绕它添加“pre”运算符。如果原始模型看起来像这样:
model Test
...
equation
when x>12.5 then
// equations involving y
end when;
// equations coupling x to y
end Test;
你只需要将模型重构为这样的东西:
model Test2
...
Boolean cond;
equation
cond = x>12.5;
when pre(cond) then
// equations involving y
end when;
// equations coupling x to y
end Test;
这里必不可少的是,在条件为真之后,涉及y的方程只会 。在这种情况下,'pre'基本上表示如果在当前时间减去某个epsilon,条件的值为真,那么(作为响应)when子句中的等式启动。
这种情况可能会导致一种称为“喋喋不休”的情况,其中条件的值会在每次经过的“epsilon”时翻转,但这意味着问题没有得到很好的解决。
我希望这有一定道理。我承认在复杂的情况下,很难准确地检测到代数环存在的位置(尽管Dymola试图给你一些诊断)。此外,在某些情况下,您确实需要Modelica的默认行为,因此您并不总是想要添加无偿的'pre'限定符。
如果您对此解释有任何疑问,请与我们联系。