是否有可能使用模拟的结果,Sim 1在时间t的模拟的初始值Sim 2?使用extend不适用于起始值.
例:
model Sim 1
Real a;
equation
a=2*time;
end Sim 1;
Run Code Online (Sandbox Code Playgroud)
对于模型Sim 2,我需要
Real b (start=a at time t)
Run Code Online (Sandbox Code Playgroud)
在其他几组方程中使用.
您必须在建模和模拟过程之间有所不同:
该关键字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;
Run Code Online (Sandbox Code Playgroud)
如果要设置多个变量,可以使用以下代码:
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;
Run Code Online (Sandbox Code Playgroud)