Modelica 开始值作为上一次模拟的结果

Modelica 开始值作为上一次模拟的结果,modelica,dymola,Modelica,Dymola,是否可以在时间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)执行模拟 关键字扩展是Modelica语言的一部分。因此,它在这个上下文中没

是否可以在时间
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)执行模拟
关键字
扩展
是Modelica语言的一部分。因此,它在这个上下文中没有任何用处,因为您使用它来定义模型,而不是描述应该如何执行模拟

必须在simulation tool中搜索问题的解决方案,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;

您必须区分建模和仿真过程:

  • 使用Modelica语言定义模型
  • 使用模拟工具(如Dymola)执行模拟
关键字
扩展
是Modelica语言的一部分。因此,它在这个上下文中没有任何用处,因为您使用它来定义模型,而不是描述应该如何执行模拟

必须在simulation tool中搜索问题的解决方案,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;

感谢您的澄清和回答。除了一组变量,我如何使用此函数??i、 e.我需要将时间t的a1、a2、a3的值作为模型2中b1、b2、b3的初始值。谢谢,我已经更新了答案。请注意,
simulateExtendedModel
的第二个返回值和许多参数都是向量,它们是在Modelica中使用
{}
创建的<代码>[:]指定一个元素数未知的向量(取决于作业)。感谢您的澄清和回答。除了一组变量,我如何使用此函数??i、 e.我需要将时间t的a1、a2、a3的值作为模型2中b1、b2、b3的初始值。谢谢,我已经更新了答案。请注意,
simulateExtendedModel
的第二个返回值和许多参数都是向量,它们是在Modelica中使用
{}
创建的<代码>[:]指定元素数未知的向量(在赋值时确定)。