Modelica 成功模拟后,如何根据结果更新Dymola中的迭代变量?

Modelica 成功模拟后,如何根据结果更新Dymola中的迭代变量?,modelica,dymola,Modelica,Dymola,成功模拟后,我想使用稳态结果提供初始猜测值并将其保存在模型中,但我在Dymola中没有找到这样的选项,它只提供了一个选项,允许我进行初始化,然后将迭代变量保存在模型中,但无法保证Dymola会将模型初始化为预期的稳态。 我的想法如下: 我的问题是: 如果我想在成功模拟后使用Modelica脚本文件(.mos文件)来更新迭代变量,我应该使用哪个函数来提取模型中使用的所有迭代变量并更新它们的值?我曾经编写了一个python脚本来实现这一点(请参见注释部分中的链接问题),它包括三个步骤: 获取迭代

成功模拟后,我想使用稳态结果提供初始猜测值并将其保存在模型中,但我在Dymola中没有找到这样的选项,它只提供了一个选项,允许我进行初始化,然后将迭代变量保存在模型中,但无法保证Dymola会将模型初始化为预期的稳态。


我的想法如下:

我的问题是:

如果我想在成功模拟后使用Modelica脚本文件(.mos文件)来更新迭代变量,我应该使用哪个函数来提取模型中使用的所有迭代变量并更新它们的值?

我曾经编写了一个python脚本来实现这一点(请参见注释部分中的链接问题),它包括三个步骤:

  • 获取迭代变量(或其他感兴趣的变量)的列表
  • 对于这些变量,请从results.mat文件中读取值
  • 写出一个.mos文件
  • 步骤1被证明是最困难的一步,主要是因为Dymola将统计数据和日志打印到需要解析的txt文件中!如果日志/统计文件采用.json这样的结构化格式,这将容易得多

    • 我使用Dymola标志
      Advanced.LogNonLinearIterationVariables=true
      使Dymola将变量打印到文件
      dsmodelitationselect.mof
      。这个文件可以轻松地读入python列表,但我后来发现这个文件中报告的IVs与
      dsmodel.mof
      中报告的IVs之间存在一些差异
    • 因此,我也尝试从
      dsmodel.mof
      读取IVs,但解析txt文件感觉像是浪费时间。不过,这是我最信任的方法
    • 另一种方法是使用标记为Advanced.FMI.GenerateModelDescription Interface2的
      modelDescription.xml
      ,不确定确切可用的信息是什么,但在某处记录了这些信息
    • 您可以使用
      alist.exe-b dsfinal.txt
      将txt文件转换为更易于加载的mat文件
    • 另一种方法是将
      Advanced.translationCommandLog
      translateModel()
      savelog(“translate.txt”)结合使用
      然后解析此日志文件
    步骤2使用python包DyMat很容易。这里有一些关于stackoverflow的例子。很好的python技巧:索引
    0
    给出列表的第一个条目,索引
    -1
    给出列表的最后一个条目。因此,终值具有索引
    -1


    步骤3或多或少是琐碎的,只需编写
    variable=value我看到了一些可能性:

  • 模拟到稳定状态
  • 使用导入最终结果 模拟>继续>导入或使用脚本: 重要的(“dsfinal.txt”);(您可以调整开始时间。)
  • 使用上面的对话框在模型中保存起始值。它可以满足您的需求,但并不总是可靠地生成良好的开始值。(特别是如果存在初始方程、状态以及取决于参数的起始值等)
  • 更好的选择是:

  • 模拟到稳定状态
  • 脚本编辑器>生成脚本 并选择变量和Final或使用脚本 exportInitial(“dsfinal.txt”、“MyScript.mos”、true、true)
  • 最后一个选项(正在改进)是设置

  • Advanced.DefaultSteadyStateInitialization=true; 不要设置不必要的正常启动值。 (这对迭代变量没有帮助,但对状态有帮助。)
  • 相关的:相关的:相关的:也相关的: