作为先前模拟结果的起始值

Start values as results of previous simulation

是否可以使用时间 t 的模拟 Sim 1 的结果作为模拟 Sim 2 的起始值? extend 的使用不适用于起始值。

示例:

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

型号Sim 2,我需要

Real b (start=a at time t)

在其他几组方程中使用。

您必须区分建模和模拟过程:

  • 使用 Modelica 语言定义模型
  • 使用模拟工具(如 Dymola)执行模拟。

关键字extends是Modelica语言的一部分。所以它在这种情况下没有任何用处,因为你用它来定义模型,而不是描述应该如何执行模拟。

您的问题的解决方案必须在模拟工具中搜索,Dymola 提供了模拟器功能,它完全符合您的要求:simulateExtendedModel。它允许读取变量的最终值,您可以用它初始化参数和状态变量。您可以在 .mos 脚本或 Modelica 函数中使用它。

因此,如果我们将您的模型 Sim1Sim2 重命名为 Model1Model2(因为它们实际上是模型,而不是模拟),下面的函数将执行以下操作你想要:

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;