1

我有以下简单的分层模型,其中包括室内的反应。反应模型只是将质量速率设置为质量,并将其连接到包围它的腔室。

connector Conn
  Real mass;
  flow Real massRate;
end Conn;

model Reaction
  Conn conn;
equation
  conn.massRate = conn.mass;
end Reaction;

model Chamber
  Real mass(start = 1);
  Reaction reaction;
  Conn conn;
equation
  conn.mass = mass;
  der(mass) = conn.massRate;
  connect(reaction.conn, conn);
end Chamber;

现在在我看来,总共有五个变量:massreaction.conn.massreaction.conn.massRateconn.massconn.massRate。并且有五个方程:方程部分中的两个,即。

conn.mass = mass
der(mass) = conn.massRate

一个来自反应

reaction.conn.massRate = reaction.conn.mass

和两个来自连接方程:

reaction.conn.mass = conn.mass
reaction.conn.massRate = conn.massRate

所以我们有五个变量的五个方程。求解器逻辑可以像这样简单地组合这些方程

der(mass) = conn.massRate = reaction.conn.massRate = reaction.conn.mass
= conn.mass = mass

并且由于质量被赋予了一个起始值,鲍勃是你的叔叔。mass应该随着时间的推移而增加。但是我的模拟环境(Wolfram|One)说

Error: Simulation model is not globally balanced, having 1 variable and 2 equations.

有人可以解释发生了什么吗?请注意,如果我将反应器放在腔室外(将反应中的符号反转为 give conn.massRate = -conn.mass),它会按预期工作。

4

1 回答 1

3

这在 Modelica 规范中的“4.7 平衡模型”部分进行了描述。

问题是房间有一个顶级连接器conn,还有一个与之相关的方程式;例如conn.massRate=0;,对应于分层模型中的默认连接连接器。它不仅是一个方程太多——它也是错误的。

此外,如果您将腔室用作子模型,并且想要添加外部流进/出腔室,您可以连接到conn- 但方程式没有意义。

当您将反应堆移出腔室时,您会避开那个悬空的连接器。另一种可能更清楚的选择是有两个模型,例如:

  model Chamber
    Reaction reaction;
    MassPart source;
  equation 
    connect(reaction.conn, source.conn);
  end Chamber;

  model MassPart
    Conn conn;
    Real mass(start=1);
  equation 
    conn.mass = mass;
    der(mass) = -conn.massRate;
  end MassPart;

(假设我得到了正确的标志部分)。在这里,当您为连接器的流量变量添加一个方程时,您可以看到 MassPart 和 Reaction 本身具有相同数量的方程和变量。

于 2018-05-07T07:20:10.867 回答