如何将Dymola仿真结果导入Python?含.mat读取及SDF导出疑问
Dymola仿真结果导出与Python读取问题解决
一、Dymola支持导出SDF格式
Dymola完全支持将仿真结果导出为SDF(Simulation Data Format,Modelica标准仿真数据格式),有两种操作方式:
- 仿真后导出:打开仿真结果窗口,点击
File->Save As,在保存类型中选择SDF (*.sdf)即可。 - 预配置输出格式:在仿真设置(Simulation Setup)的
Output选项卡中,将“Result file format”设置为SDF,仿真完成后会自动生成SDF文件。
Python中读取SDF文件可以使用Dymola官方Python接口的readTrajectory函数,相比.mat格式,SDF的结构更贴合Modelica仿真数据,读取更稳定。
二、修复Python读取Dymola .mat文件的问题
你用scipy.io.loadmat读取效果不佳,是因为Dymola生成的.mat文件结构和标准Matlab.mat有差异,变量存储在特定数组中,以下是两种解决方法:
方法1:使用Dymola官方Python接口读取(推荐)
直接通过Dymola的Python接口读取结果,无需手动解析.mat结构,兼容性最好:
from dymola.dymola_interface import DymolaInterface import matplotlib.pyplot as plt # 初始化Dymola接口 dymola = DymolaInterface() # 指定结果文件路径 result_path = r'C:\Users\Benutzername\Desktop\Python Interface for Dymola_test\HeatPumpCycle_CO2_0.30.mat' # 定义需要读取的变量(替换为你需要的变量名) target_vars = ['time', 'HeatPumpCycle.T_evap', 'HeatPumpCycle.Q_dot_cond'] # 读取变量数据 trajectory_data = dymola.readTrajectory(result_path, target_vars) # 提取数据并绘图 time = trajectory_data[0] t_evap = trajectory_data[1] plt.plot(time, t_evap) plt.xlabel('时间 [s]') plt.ylabel('蒸发器温度 [K]') plt.title('蒸发器温度随时间变化') plt.show() # 关闭接口 dymola.close()
方法2:调整scipy读取逻辑适配Dymola .mat结构
如果坚持用scipy,需要解析Dymola.mat的特定结构(变量名存于names数组,数据存于data数组):
import scipy.io import matplotlib.pyplot as plt dateipfad = r'C:\Users\Benutzername\Desktop\Python Interface for Dymola_test\HeatPumpCycle_CO2_0.30.mat' mat_contents = scipy.io.loadmat(dateipfad) # 提取变量名(处理嵌套数组格式) var_names = [name[0][0] for name in mat_contents['names']] # 提取数据数组(每一行对应一个变量的时间序列) data_array = mat_contents['data'] # 获取目标变量的索引 time_idx = var_names.index('time') target_var_idx = var_names.index('HeatPumpCycle.T_evap') # 替换为你的变量名 # 提取数据 time = data_array[time_idx, :] target_data = data_array[target_var_idx, :] # 绘图 plt.plot(time, target_data) plt.xlabel('时间 [s]') plt.ylabel('目标变量值') plt.show()
内容的提问来源于stack exchange,提问作者APZ
相关产品推荐
相关产品推荐

