【问题标题】:Maximum number of event iterations in ModelicaModelica 中的最大事件迭代次数
【发布时间】:2016-04-08 08:10:16
【问题描述】:

有没有办法改变“最大事件迭代次数”eviter 的值,在 dymola 中设置为 20?

【问题讨论】:

  • P.S.我确实更改了dymosim.ini 中的eviter,但更改未反映在dsin.txt 中,我不得不通过执行:dymosim dsin.txt 再次运行模拟。我想知道如何使eviter 直接更改为dsin.txt,这样我就可以在Dymola 中进行模拟,而不是再次执行dymosim
  • 改变最大迭代次数真的有帮助吗?如果是这样,您可以发布模型吗?

标签: events iteration modelica dymola


【解决方案1】:

似乎 dymosim.ini 不用于常规模拟(请注意第 4 行中的版本:dymosim.ini 状态为 1.1,而 dsin.txt 有 1.4 用 Dymola 2019 编写)。我在 Dymola 中也找不到函数或变量来更改 eviter,所以我能想到的唯一解决方案是在模拟之前编辑 dsin.txt。

下面的代码显示了更新 dsin.txt 然后执行模拟的函数的外观。请注意,应扩展该功能以进行错误处理。

function MySim
  import Modelica.Utilities.Strings;
  import Modelica.Utilities.Streams;
  import Modelica.Utilities.Files.removeFile;
  import SimAPI = DymolaCommands.SimulatorAPI;

  input String m = "Modelica.Blocks.Examples.PID_Controller"
    annotation (Dialog(__Dymola_translatedModel(translate=false)));
  input Integer iterations = 40;
protected 
  String[:] dsin;
algorithm 
  // initialize
  removeFile("dsin_custom.txt");
  removeFile("dsin_export.txt");
  SimAPI.translateModel(m);
  SimAPI.exportInitialDsin("dsin_export.txt");  // exports simulation setup of active model

  // write custom dsin file
  dsin :=Streams.readFile("dsin_export.txt");
  for i in 1:size(dsin, 1) loop
    if Strings.find(dsin[i], " # eviter ") > 0 then
      dsin[i] :=Strings.replace(dsin[i], "20", String(iterations));
      break;
    end if;
  end for;
  for i in 1:size(dsin, 1) loop
    Streams.print(dsin[i], "dsin_custom.txt");
  end for;

  // simulate and open file
  // using simulateModel would generate a new dsin file, so dymosim.exe must be called
  SimAPI.system("dymosim.exe -s dsin_custom.txt "+m+".mat");
  // workaround: create empty plot to open result, as there is no load-result command
  DymolaCommands.Plot.createPlot(y={""}, grid=true, filename=m+".mat");
end MySim;

该函数翻译选定的模型,导出模拟设置,根据需要进行编辑,执行模拟并打开结果文件 - 所以它基本上是一个自定义的模拟模型命令。

使用 Dymola 用户手册第 2 卷中的7.2 可扩展用户界面 - 菜单、工具栏和收藏夹 中描述的功能,可以在 Dymola GUI 中创建该功能的快捷方式,它允许执行模拟所选模型。这将使该功能与常规模拟按钮一样方便使用。

【讨论】:

    【解决方案2】:

    自 Dymola 2020x 以来,有一个高级变量可以做到这一点。

    来自 2020x 更新日志:

    Advanced.Simulation.MaxEventIterationsevnet的最大数量 迭代,eviter。小心使用,因为太小的值会导致模拟失败。 默认值为Advanced.Simulation.MaxEventIterations=20

    此外,可以更改迭代的精度:

    Advanced.Simulation.EventEpsilon 事件的时间分辨率,eveps。这 默认值为Advanced.Simulation.EventEpsilon=1e-10

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 2019-07-04
      相关资源
      最近更新 更多