作为先前模拟结果的起始值
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 函数中使用它。
因此,如果我们将您的模型 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;
是否可以使用时间 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 函数中使用它。
因此,如果我们将您的模型 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;