Я пытаюсь объявить таблицу, связанную с другой. Моя цель — объявить таблицу с размерами (nlines, 2), а затем создать другую таблицу, которая начинается с заданного значения и развивается так же, как и первая таблица. Для этого я использую исходные уравнения, поскольку хочу, чтобы коррелированные данные были готовы до начала моделирования.
Однако в приведенной ниже простой модели я столкнулся с проблемой, когда коррелированная таблица содержит только нули.
Есть ли ошибка в моем коде?
Можно ли добиться этого с помощью компонента без добавления дополнительного кода в мою модель?
код:
model CorrelateCoefficients
import Modelica.Blocks.Sources;
import Modelica.Utilities.Streams;
import Modelica.Math.Vectors;
// Original tables with reduced dimensions
parameter Real Flow_A[5, 2] = [0, 0.600; 100, 0.500; 200, 0.400; 300, 0.300; 400, 0.200];
parameter Real Flow_B[5, 2] = [0, 2.000; 100, 1.500; 200, 1.000; 300, 0.500; 400, 0.250];
// Parameters
parameter Real coef_conv_A = 1000;
parameter Real coef_conv_B = 5000;
// Variables for correlated tables
parameter Real correlatedCoef_A[size(Flow_A, 1), 2];
parameter Real correlatedCoef_B[size(Flow_B, 1), 2];
// Use the correlated tables in TimeTable blocks for visualization
Modelica.Blocks.Sources.TimeTable CorrelatedCoef_A(table = correlatedCoef_A, timeScale = 1) annotation(
Placement(transformation(origin = {20,38}, extent = {{-10,-10},{10,10}})));
Modelica.Blocks.Sources.TimeTable CorrelatedCoef_B(table = correlatedCoef_B, timeScale = 1) annotation(
Placement(transformation(origin = {20,2}, extent = {{-10,-10},{10,10}})));
Modelica.Blocks.Sources.TimeTable timeTable(table = Flow_A) annotation(
Placement(transformation(origin = {-60, 42}, extent = {{-10, -10}, {10, 10}})));
Modelica.Blocks.Sources.TimeTable timeTable1(table = Flow_B) annotation(
Placement(transformation(origin = {-56, -2}, extent = {{-10, -10}, {10, 10}})));
initial equation
// Correlate coef_conv_A with Flow_A
for i in 1:size(Flow_A, 1) loop
correlatedCoef_A[i, 1] = Flow_A[i, 1];
correlatedCoef_A[i, 2] = (Flow_A[i, 2] / max(Flow_A[:, 2])) * coef_conv_A;
end for;
// Correlate coef_conv_B with Flow_B
for i in 1:size(Flow_B, 1) loop
correlatedCoef_B[i, 1] = Flow_B[i, 1];
correlatedCoef_B[i, 2] = Flow_B[i, 2] / max(Flow_B[:, 2]) * coef_conv_B;
end for;
// Print the correlated tables for debugging
for i in 1:size(correlatedCoef_A, 1) loop
Streams.print("Time: " + String(correlatedCoef_A[i, 1]) + ", Coefficient A: " + String(correlatedCoef_A[i, 2]));
end for;
for i in 1:size(correlatedCoef_B, 1) loop
Streams.print("Time: " + String(correlatedCoef_B[i, 1]) + ", Coefficient B: " + String(correlatedCoef_B[i, 2]));
end for;
annotation(
uses(Modelica(version = "4.0.0")));
end CorrelateCoefficients;
Я обновил код. Благодарю за ваш ответ





По умолчанию параметры необходимо вычислять при их объявлении (= уравнение привязки). Хотя есть возможность, например. упомянуто в Разделе 4.4.3 спецификации Modelica. Добавив fixed=false к определению параметра, их можно вычислить в начальной части уравнения. Для вашего примера кода это означает, что объявление параметров необходимо изменить на:
parameter Real correlatedCoef_A[size(Flow_A, 1), 2](each fixed=false);
parameter Real correlatedCoef_B[size(Flow_B, 1), 2](each fixed=false);
Благодаря вышеуказанным изменениям код работает в OpenModelica и Dymola (даже «каждый» можно пропустить в Dymola). Я думаю, это должно сделать то, что вам нужно, хотя необходимы небольшие изменения в коде...
Наверное, имеет смысл изменить название вопроса на что-то вроде: «Как использовать исходное уравнение для определения значений параметров?»
Приятно слышать, спасибо за отзыв. Пожалуйста, рассмотрите (1) изменение названия уравнения и (2) принятие ответа, чтобы пометить его как ответивший...
Нельзя ли перенести вычисления в исходном уравнении в функцию?
Это тоже возможно и потенциально может быть более приятным решением. Оставлю это создателю модели...
Кажется, «простая модель ниже» отсутствует?