Modelica:层次模型中的方程平衡

Modelica:层次模型中的方程平衡,modelica,systemmodeler,Modelica,Systemmodeler,我有下面这个简单的层次模型,它包含了一个反应室内的反应。反应模型简单地将质量速率设置为质量,并连接到包围它的腔室 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 re

我有下面这个简单的层次模型,它包含了一个反应室内的反应。反应模型简单地将质量速率设置为质量,并连接到包围它的腔室

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;
现在在我看来,总共有五个变量:
mass
reaction.conn.mass
reaction.conn.massRate
conn.massRate
,以及
conn.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
因为质量有一个起始值,鲍勃是你叔叔。
质量应随时间增加。但是我的模拟环境(Wolfram | One)说


有人能解释一下发生了什么事吗?请注意,如果我将反应器带出反应室(将反应中的符号颠倒,以给出
conn.massRate=-conn.mass
),它将按预期工作。

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

问题是腔室有一个顶级连接器
conn
,还有一个与之相关的等式;e、 g.
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;
(假设我的标志部分正确)。在这里,当你为连接器的流量变量添加一个方程时,你可以看到质量部分和反应本身都有相同数量的方程和变量。

非常感谢,这很有意义。事实上,你的建议正是我所做的,将反应移出会议厅。
  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;