理解dymola错误消息的问题

时间:2011-11-06 09:58:26

标签: modelica

任何人都可以给我一个暗示“代数循环”的意思 - 以及我应该如何通过添加“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。

1 个答案:

答案 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'限定符。

如果您对此解释有任何疑问,请与我们联系。