如何将模拟结果的多个变量导出到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,它们都可以用来读取结果文件
我正在尝试通过 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,它们都可以用来读取结果文件