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

Я пытаюсь объявить таблицу, связанную с другой. Моя цель — объявить таблицу с размерами (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;

Кажется, «простая модель ниже» отсутствует?

Markus A. 27.06.2024 15:13

Я обновил код. Благодарю за ваш ответ

AMINE CHNIOUEL 27.06.2024 15:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

По умолчанию параметры необходимо вычислять при их объявлении (= уравнение привязки). Хотя есть возможность, например. упомянуто в Разделе 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). Я думаю, это должно сделать то, что вам нужно, хотя необходимы небольшие изменения в коде...

Наверное, имеет смысл изменить название вопроса на что-то вроде: «Как использовать исходное уравнение для определения значений параметров?»

Markus A. 27.06.2024 16:20

Приятно слышать, спасибо за отзыв. Пожалуйста, рассмотрите (1) изменение названия уравнения и (2) принятие ответа, чтобы пометить его как ответивший...

Markus A. 27.06.2024 16:37

Нельзя ли перенести вычисления в исходном уравнении в функцию?

Dag B 04.07.2024 18:49

Это тоже возможно и потенциально может быть более приятным решением. Оставлю это создателю модели...

Markus A. 08.07.2024 09:50

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