Начальные значения как результаты предыдущего моделирования - PullRequest
0 голосов
/ 10 января 2019

Можно ли использовать результат моделирования Sim 1 во время t в качестве начального значения моделирования Sim 2? Использование extend не работает для начальных значений.

Пример:

model Sim 1
  Real a;
equation
  a=2*time;
end Sim 1;

для модели Sim 2, мне нужно

Real b (start=a at time t)

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

1 Ответ

0 голосов
/ 10 января 2019

Вы должны различаться между моделированием и процессом моделирования:

  • С помощью языка Modelica вы определяете свои модели
  • С помощью инструмента моделирования (например, Dymola) вы выполняете моделирование.

Ключевое слово extends является частью языка Modelica. Поэтому он не может быть полезен в этом контексте, так как вы используете его для определения моделей, а не для описания того, как следует выполнять моделирование.

Решение вашей проблемы необходимо искать в инструменте моделирования, и Dymola предлагает функцию симулятора, которая делает именно то, что вы хотите: simulateExtendedModel. Это позволяет прочитать окончательное значение переменной, и вы можете инициализировать параметры и переменные состояния с ним. Вы можете использовать его в скрипте .mos или в функции Modelica.

Поэтому, если мы переименуем ваши модели Sim1 и Sim2 в Model1 и Model2 (потому что это действительно модели, а не симуляции), функция ниже будет делать то, что вы хотите:

function sim
  import DymolaCommands.SimulatorAPI.simulateExtendedModel;
protected 
  Boolean ok;
  Real a;
  Real[1] finalValues;
algorithm 
  (ok, finalValues) :=simulateExtendedModel("Model1", 0, 5, finalNames={"a"});
  a :=finalValues[1];
  simulateExtendedModel("Model2", 5, 10, initialNames={"b"}, initialValues={a});
end sim;

Если вы хотите установить несколько переменных, вы можете использовать этот код:

function sim2
  import DymolaCommands.SimulatorAPI.simulateExtendedModel;
protected 
  Boolean ok;
  Real[:] finalValues_sim1;
  String[:] finalNames_sim1 = {"a1", "a2", "a3"};
  String[:] initialNames_sim2 = {"b1", "b2", "b3"};
algorithm 
  (ok, finalValues_sim1) :=simulateExtendedModel("SO.Model1", 0, 5, finalNames=finalNames_sim1);
  simulateExtendedModel("SO.Model2", 5, 10, initialNames=initialNames_sim2, initialValues=finalValues_sim1);
end sim2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...