Modelica: уравнение баланса в иерархической модели

У меня есть следующая простая иерархическая модель, включающая реакцию внутри камеры. Модель реакции просто устанавливает массовую скорость для массы, и она связана с камерой, которая ее окружает.

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.mass, а также 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

и так как массе дано начальное значение, Боб твой дядя. mass должно увеличиваться со временем. Но моя среда моделирования (Wolfram|One) говорит

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

Может кто-нибудь объяснить, пожалуйста, что происходит? Обратите внимание, что если я возьму реактор за пределами камеры (поменять знак в реакции, чтобы дать conn.massRate = -conn.mass), работает как задумано.

1 ответ

Решение

Это описано в разделе "4.7 Сбалансированные модели" в спецификации Modelica.

Проблема в том, что в камере есть разъем верхнего уровня 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 и реакция сами по себе имеют одинаковое количество уравнений и переменных, когда вы добавляете одно уравнение для переменной потока соединителя.

Другие вопросы по тегам