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

时间:2019-01-10 09:04:50

标签: modelica dymola

是否可以将时间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 :(得分:5)

您必须在建模和仿真过程之间有所不同:

  • 使用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;