Modelica中的最大事件迭代次数

时间:2016-04-08 08:10:16

标签: events iteration modelica dymola

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

2 个答案:

答案 0 :(得分:1)

似乎dymosim.ini并未用于常规模拟(请注意第4行中的版本:dymosim.ini声明为1.1,而dsin.txt具有用Dymola 2019编写的1.4)。我也无法在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;

该函数可转换所选模型,导出仿真设置,根据需要对其进行编辑,执行仿真并打开结果文件-因此它基本上是一个自定义的SimulationModel命令。

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

答案 1 :(得分:1)

自从Dymola 2020x开始,就有一个高级变量应该可以准确地做到这一点。

从2020x更新日志中:

  

Advanced.Simulation.MaxEventIterations evnet的最大数量   迭代,eviter。请谨慎使用,因为值太小会导致仿真失败。   默认值为Advanced.Simulation.MaxEventIterations=20

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

  

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