首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将一个仿真结果的多个变量导出到csv?

如何将一个仿真结果的多个变量导出到csv?
EN

Stack Overflow用户
提问于 2019-08-28 15:40:55
回答 1查看 1.3K关注 0票数 2

我正试图通过csv文件将我的结果从Dymola导出到excel。但我有很多结果。我如何将它们写在数组中?

我试图创建一个for循环,但是我缺乏如何键入代码的知识。

代码语言:javascript
运行
复制
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_tube11.delta_fr,my_code_tube12.delta_fr..。我需要创建一个for循环,因为我将有将近1500个变量要导出。

EN

Stack Overflow用户

回答已采纳

发布于 2019-08-29 08:13:48

在模拟过程中,试图将结果写入csv文件会给Modelica带来一些麻烦:

  • 要为哪些时间步骤编写结果?不可能使用求解器步骤大小。但是我们可以使用sample()函数定义一个周期输出。
  • 打电话给印刷品是相当昂贵的。当你的模拟运行时,你不想做太多次
  • 打印函数总是在每次调用之后添加一个换行符。这要求我们一次写每一行(但是由于前面提到的性能限制,我们应该一次写尽可能多的文本)。不幸的是,Dymola的默认最大字符串大小非常小,限制在500。您必须通过设置例如Advanced.MaxStringLength = 50000来确保当前Dymola实例使用适当的大值。

考虑到这些,我们可以编写如下代码:

代码语言:javascript
运行
复制
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变量浏览器中的Export将所有或仅绘制的变量导出到csv中。这必须在每次模拟之后手动完成,不能草草记录。
  • 使用函数DataFiles.convertMATtoCSV。以下两行代码将从delta_fr结果文件中提取1500个.mat变量
代码语言:javascript
运行
复制
    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文件,例如使用包DyMatSDF-Python,它们都可以用于读取结果文件
票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57695967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档