如何解决如何在成功模拟后根据结果更新 Dymola 中的迭代变量?
模拟成功后,我想用稳态的结果来提供初始猜测值并将它们保存在模型中,但我在Dymola中没有找到这样的选项,它只提供了一个选项,允许我进行初始化,然后将迭代变量保存在模型中,但不能保证 Dymola 会将模型初始化为预期的稳定状态。
我的问题是:
如果我想在成功模拟后使用 Modelica 脚本文件(.mos 文件)更新迭代变量,我应该使用哪个函数来提取模型中使用的所有迭代变量并更新它们的值?
解决方法
我看到了一些可能性:
- 模拟直到稳定状态
- 导入最终结果使用 模拟>继续>导入或使用脚本: importInitial("dsfinal.txt"); (您可以调整开始时间。)
- 使用上面的对话框在模型中保存起始值。它可以满足您的需求,但并不总是可靠地生成良好的起始值。 (特别是如果有初始方程、具有取决于参数的起始值的状态等)
更好的选择是:
- 模拟直到稳定状态
- 脚本编辑器 > 生成脚本 并选择变量和最终或使用脚本 exportInitial("dsfinal.txt","MyScript.mos",true,true)
最后一个选项(正在改进)是设置
- Advanced.DefaultSteadyStateInitialization=true; 并且不要设置不必要的正常起始值。 (这对迭代变量没有帮助,但对状态有帮助。)
我曾经写过一个 python 脚本来做到这一点(请参阅评论部分中的链接问题),它涉及三个步骤:
- 获取迭代变量列表(或其他感兴趣的变量)
- 对于这些变量,从结果 .mat 文件中读取值
- 写出一个 .mos 文件
第 1 步 原来是最困难的一步,主要是因为 Dymola 将统计信息和日志打印到需要解析的 txt 文件中!如果日志/统计文件采用 .json 这样的结构化格式,这会容易得多。
- 我使用 Dymola 标志
Advanced.LogNonLinearIterationVariables=true
使 Dymola 将变量打印到文件dsmodelIterationSelect.mof
中。可以轻松地将此文件读入 Python 列表,但我后来发现此文件中报告的 IV 与dsmodel.mof
中报告的 IV 之间存在一些差异。 - 所以,我也尝试从
dsmodel.mof
读取 IV,但感觉解析 txt 文件是在浪费时间。不过,这是我最信任的方法。 - 另一种方法可能是使用
modelDescription.xml
,使用标志Advanced.FMI.GenerateModelDescriptionInterface2
生成,不确定确切可用的信息,但已记录在某处。 - 您可以使用
alist.exe -b dsfinal.txt
将 txt 文件转换为 mat 文件,这样更容易加载。 - 另一种方法是将
Advanced.TranslationInCommandLog
与translateModel()
和savelog("translate.txt");
结合使用,然后解析此日志文件。
步骤 2 使用 python 包 DyMat 很容易。这里有一些关于 stackoverflow 的例子。不错的 Python 技巧:索引 0
给出列表的第一个条目,索引 -1
给出列表的最后一个条目。因此,终端值具有索引 -1
。
步骤 3 或多或少是微不足道的,只需将 variable = value;
写入文件,这一步需要不到 10 行 python 代码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。