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