如何将Dymola仿真结果加载到Python中?

2 投票
2 回答
71 浏览
提问于 2025-04-14 17:27

我想把我的Dymola模拟结果读入Python中,以便绘制一些变量的图表。在模拟结束后,我的数据是一个Matlab的.mat文件。我是否可以把结果导出为SDF格式呢?

我第一次尝试把数据读入Python时,效果不是很好。

import scipy.io

# Pfad zur MAT-Datei definieren
dateipfad = r'C:\Users\Benutzername\Desktop\Python Interface for Dymola_test\HeatPumpCycle_CO2_0.30.mat'

# MAT-Datei einlesen
mat_contents = scipy.io.loadmat(dateipfad)

# Namen und Werte aller Variablen in der MAT-Datei ausgeben
for variable_name in mat_contents.keys():
    variable_value = mat_contents[variable_name]
    print(f"Variable '{variable_name}':")
    print(variable_value)
    print()

enter image description here

2 个回答

1

最简单的方法是打开 Simulation>Setup>Output,然后在后处理命令下,勾选一个选项,这个选项可以把结果文件转换成SDF格式。这样每次你运行模拟的时候,就会得到一个SDF文件。

2

你遇到的这个 .mat 文件问题是因为 Dymola 使用了一种很特别的格式来存储数据,这样可以减小文件的大小。在一个典型的 Modelica 模型中,你会有很多别名变量,比如因为连接了多个组件,这些组件在连接点的电位是相同的。为了减小文件大小,电位的时间序列只存储一次,多个变量都链接到这个时间序列上。因此,你需要把这些数据解开,看看哪个变量链接到哪个时间序列。

你可以使用 SDF python 包 来做到这一点:

import sdf
file = r'C:\tmp\sim_result.mat'
data = sdf.load(file)

# print name and final value of all trajectories in .mat file
for ds in data.datasets:
    print(ds.name)
    print(ds.data[-1])

你也可以先把 mat 文件转换成 sdf 格式(使用 dsres2sdf.exe,这个程序在 Dymola 的安装文件夹里),但如上所述,这并不是必须的。

如果 SDF 不符合你的需求,还有 DyMat 这个工具。

你也可以通过 Dymola 的 Python 接口使用 readTrajectory 来获取数据,但这是最慢的方式,并且需要 Dymola 正在运行。

撰写回答