Я хочу запрограммировать простой расчет в OMEdit, чтобы лучше понять, как писать больше объектно-ориентированного кода для поиска ответа (вместо использования одной модели). Задача, которую я пытаюсь решить, состоит в том, что, зная мольные доли yi и молярную массу Mi упрощенных компонентов воздуха, определите массовую долю wi для каждого компонента.
Данный: Молярные фракции (yi) и молярные массы (Mi) воздуха:
Mair = Σ(yi*Mi)
wi =yi*Mi/Mair
Ответы, которые я ожидаю,
Для моделирования каждого компонента композиции у меня есть
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;
но это не работает


В вашем подходе есть несколько фундаментальных проблем:
Constituent вам не хватает уравнения для M_total.Composition для constituents должны быть установлены параметры.Кроме того, я не уверен, что лучше всего иметь модели для обоих, 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 (используя правильное уравнение из кода, а не описания).
Я бы тоже не стал использовать модели для каждого компонента, поскольку они смешаны в одном объеме. ИМХО, модель процесса должна представлять собой реальный объект (или его часть) с соответствующими интерфейсами с другими объектами, которые моделируются с использованием портов.