【问题标题】:Start values as results of previous simulation作为先前模拟结果的起始值
【发布时间】:2019-01-10 09:04:49
【问题描述】:

是否可以在时间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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的澄清和回答。除了一组变量,我如何使用这个函数?即我需要将时间 t 的 a1、a2、a3 的值作为模型 2 中 b1、b2、b3 的初始值。谢谢
    • 我已经更新了答案。请注意,simulateExtendedModel 的第二个返回值和许多参数是向量,它们是在 Modelica 中使用 { } 创建的。 [:] 指定一个具有未知数量元素的向量(在分配时确定)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多