Modelica: уравнение баланса в иерархической модели - PullRequest
0 голосов
/ 05 мая 2018

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

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 Ответ

0 голосов
/ 07 мая 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...