如何将模拟结果的多个变量导出到csv?

How to export many variables of a simulation result to csv?

我正在尝试通过 csv 文件将我的结果从 Dymola 导出到 excel。但我有很多结果。我怎样才能把它们写成一个数组??

我尝试创建一个 for 循环,但我不知道如何输入代码。

if (time) <= 0 then
   Modelica.Utilities.Files.removeFile("tube_0.02"+".csv");
   Modelica.Utilities.Streams.print("temps," +
      "delta_fr1,"+
      "delta_fr2,"+
      "delta_fr3,",
    "tube_0.02"+".csv");
 else

 Modelica.Utilities.Streams.print(String(time) +
   "," + String(   my_code_tube1[1].delta_fr)+
   "," + String(   my_code_tube1[2].delta_fr)+
   "," + String(   my_code_tube1[3].delta_fr),
     "tube_0.02"+".csv");

 end if;

而不是必须写 delta_fr1、delta_fr2... 然后 my_code_tube1[1].delta_fr、my_code_tube1[2]。 delta_fr...我需要创建一个 for 循环,因为我将要导出将近 1500 个变量。

在模拟期间尝试将结果写入 csv 文件会在 Modelica 中遇到一些问题:

  • 您要为哪些时间步写出结果?无法使用求解器步长。 但是我们可以使用 sample() 函数

  • 定义周期性输出
  • 调用 print 非常昂贵。在模拟运行时,您不想这样做太多次

  • 打印函数总是在每次调用后添加一个换行符。这要求我们一次写每一行(但由于之前提到的性能限制,我们无论如何应该一次写尽可能多的文本)。 不幸的是,Dymola 的默认最大字符串大小非常小,限制在 500。 您必须确保当前的 Dymola 实例通过设置例如使用适当的大值Advanced.MaxStringLength = 50000.

考虑到这些,我们可以想出如下代码:

model SO_print_for
  My_code_tube my_code_tube1[1500];

protected 
  String line;
  String f="tube_0.02" + ".csv";

  model My_code_tube
    Real delta_fr=1;
  end My_code_tube;

initial algorithm 
  line := "temps";
  for i in 1:size(my_code_tube1,1) loop
    line := line + ", delta_fr" + String(i);
  end for;
  Modelica.Utilities.Files.removeFile(f);
  Modelica.Utilities.Streams.print(line, f);

algorithm 
  when sample(0, 0.1) then
    line := String(time);
    for i in 1:size(my_code_tube1,1) loop
      line := line + ", "+String(my_code_tube1[i].delta_fr);
    end for;
    Modelica.Utilities.Streams.print(line, f);
  end when;

end SO_print_for;

该代码有效,但它会减慢您的模拟速度,因为会生成许多时间事件(来自 sample() 函数)。

与其在模拟期间写入 csv,不如考虑以下方法之一在模拟完成后转换结果文件:

  • 在 Dymola 变量浏览器中使用导出结果将所有或仅绘制的变量导出到 csv 中。这必须在每次模拟后手动完成,不能编写脚本

  • 使用函数DataFiles.convertMATtoCSV。下面两行代码将从.mat结果文件

  • 中提取1500个delta_fr个变量
    vars = {"my_code_tube1["+String(i)+"].delta_fr" for i in 1:1500}
    DataFiles.convertMATtoCSV("your-model.mat", vars, "out.csv")
  • 使用 Matlab、Octave 或 FreeMat 打开 .mat 结果文件并将其转换为 Excel 可以理解的文件格式。 Dymola 提供 dymload.m 将 .mat 结果文件导入 Matlab。详情请参阅 Dymola 用户手册第 1 卷

  • 使用python将结果转换为csv文件,例如通过使用包 DyMat or SDF-Python,它们都可以用来读取结果文件