Как смоделировать простой расчет массовой доли в Modelica, используя подход ООП?

Я хочу запрограммировать простой расчет в OMEdit, чтобы лучше понять, как писать больше объектно-ориентированного кода для поиска ответа (вместо использования одной модели). Задача, которую я пытаюсь решить, состоит в том, что, зная мольные доли yi и молярную массу Mi упрощенных компонентов воздуха, определите массовую долю wi для каждого компонента.

Данный: Молярные фракции (yi) и молярные массы (Mi) воздуха:

Составляющая даi Мi Н2 0,781 28 О2 0,209 32 Ар 0,01 39,9

Mair = Σ(yi*Mi)

wi =yi*Mi/Mair

Ответы, которые я ожидаю,

Составляющая шi Н2 0,754 О2 0,231 Ар 0,014

Для моделирования каждого компонента композиции у меня есть

model Constituent
  parameter Real y "molar fraction";
  parameter Real M "molar mass";
  Real M_total;
  Real w "mass fraction";
equation
w = y * M/M_total;
end Constituent;

Чтобы смоделировать набор компонентов и выполнить расчет, у меня есть

model Composition

  parameter Integer nc =1;
  Constituent[nc] constituents;
  Real M_total;
equation
  M_total = sum(constituents[i].M*constituents[i].y for i in size(constituents));
end Composition;

а затем выполнить программу, которая у меня есть

model Example_1_1

  Constituent[3] constituents(
  M = {28,32,39.9},
  y = {0.781,0.209,0.01}
  
  );
  
  
  Composition composition(
  nc = 3,
  constituents =constituents);

equation

end Example_1_1;

но это не работает

В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Принцип подстановки Лискова
Принцип подстановки Лискова
Принцип подстановки Лискова (LSP) - это принцип объектно-ориентированного программирования, который гласит, что объекты суперкласса должны иметь...
2
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем подходе есть несколько фундаментальных проблем:

  1. В Constituent вам не хватает уравнения для M_total.
  2. В Composition для constituents должны быть установлены параметры.
  3. Пример уникален по нескольким причинам.

Кроме того, я не уверен, что лучше всего иметь модели для обоих, Constituent и Composition. Я бы сделал композицию одной записью, как показано ниже:

record Composition
  parameter Integer n(min=1) "Number of constituents";
  parameter Modelica.Units.SI.DimensionlessRatio y[n] "molar fraction";
  parameter Modelica.Units.SI.Mass M[n] "molar mass";
  final parameter Modelica.Units.SI.Mass M_total=sum(y.*M);
  final parameter Modelica.Units.SI.DimensionlessRatio w[n]=y.*M/M_total "mass fraction";
  annotation (uses(Modelica(version = "4.0.0")));
end Composition;

Записи имеют ограничение: в них не может быть раздела уравнений, но вычисления final parameters в этом случае достаточно хороши.

Тогда примером будет

model Example_1_1

  Composition comp(
    n = 3,
    M = {28,32,39.9},
    y = {0.781,0.209,0.01});

end Example_1_1;

давая ожидаемый результат для comp.w (используя правильное уравнение из кода, а не описания).

Я бы тоже не стал использовать модели для каждого компонента, поскольку они смешаны в одном объеме. ИМХО, модель процесса должна представлять собой реальный объект (или его часть) с соответствующими интерфейсами с другими объектами, которые моделируются с использованием портов.

Clement44 29.08.2024 08:50

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