Arrays 如何将模拟结果的多个变量导出到csv?
我正在尝试通过csv文件将我的结果从Dymola导出到excel。但我有很多结果。如何将它们写入数组 我试图创建一个for循环,但我缺乏如何键入代码的知识Arrays 如何将模拟结果的多个变量导出到csv?,arrays,for-loop,export-to-csv,dymola,Arrays,For Loop,Export To Csv,Dymola,我正在尝试通过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,"+
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;
if(time)在模拟过程中尝试将结果写入csv文件会在Modelica中遇到一些问题:
- 您希望为哪些时间步写入结果?无法使用解算器步长。
但是我们可以使用
sample()
函数定义周期性输出
- 打电话给印刷公司是相当昂贵的。您不希望在模拟运行时多次这样做
- print函数总是在每次调用后添加换行符。这要求我们一次写每一行(但由于前面提到的性能限制,我们无论如何都应该一次写尽可能多的文本)。
不幸的是,Dymola的默认最大字符串大小非常小,限制在500。
您必须通过设置例如
Advanced.MaxStringLength=50000
,确保当前Dymola实例正在使用适当的大值
考虑到这些因素,我们可以得出如下代码:
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()
函数)
<> P>在模拟过程中,不要编写CSV,在模拟完成后,应考虑下列方法之一来转换结果文件:
- 使用Dymola变量浏览器中的导出结果将所有或仅打印的变量导出到csv中。这必须在每次模拟后手动完成,并且不能涂鸦
- 使用函数
DataFiles.convertMATtoCSV
。以下两行代码将从.mat结果文件中提取1500个变量
- 使用Matlab、Octave或FreeMat打开.mat结果文件,并将其转换为Excel能够理解的文件格式。
Dymola提供了
dymload.m
将.mat结果文件导入Matlab。有关详细信息,请参阅Dymola的用户手册第1卷
- 使用python将结果转换为csv文件,例如,使用包或,两者都可以用于读取结果文件
谢谢您的回答。我在print函数中添加了时间变量。我会试试你的方法,谢谢。实际上,有两种方法可以从Dymola编写CSV导出脚本。其中一个涉及readTraction(或类似)和DataFiles.writeCSVmatrix的组合,另一个是$%Dymola%\bin\alist-e var1 dsres.mat res.csvThanks Hans。我已经包括了DataFiles变量。对于这么多的变量来说,列表可能不是一个好的选择。
vars = {"my_code_tube1["+String(i)+"].delta_fr" for i in 1:1500}
DataFiles.convertMATtoCSV("your-model.mat", vars, "out.csv")