3

谁能给我一个提示“代数循环”的含义 - 以及我应该如何通过添加“预”运算符来应对这种情况?我真的没看懂...

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.

在此先感谢,最好的问候

蒂莫。

4

1 回答 1

4

一般来说,这个问题是因为 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 的默认行为,因此您并不总是想添加无偿的“预”限定符。

如果您对此解释有任何疑问,请告诉我。

于 2011-11-06T16:16:52.823 回答