如何在 JModelica 中读取 .mat 输出文件?

Posted

技术标签:

【中文标题】如何在 JModelica 中读取 .mat 输出文件?【英文标题】:How to read .mat output files in JModelica? 【发布时间】:2020-04-02 19:25:09 【问题描述】:

为了节省时间,我正在尝试读取.mat 文件,而不是再次模拟模型。

我使用了scipy.io.loadmat,但效果不佳:

res = loadmat('ChatteringControl_result.mat')
res.keys()

['Aclass', 'dataInfo', 'name', 'data_2', 'data_1', 'description']

键不是变量名,不知道如何获取变量值。

然后我搜索分辨率,发现DyMat,对其他变量效果很好但是不能得到time

res1 = DyMat.DyMatFile('ChatteringControl_result.mat')
T = res1['T']
t = res1['time']

KeyError: 'time'

那么,如何才能在JModelica中得到所有的结果呢?(当然不用打开Matlab。)比如,JModelica中的一个内置函数?

非常感谢!

【问题讨论】:

不知道,这些.mat文件是标准mat文件吗?我认为打开 OpenModelica 生成的 mat 文件时也遇到了类似的问题,使用 scipy.loadmat。 啊,是的,来自 DyMat 的描述:“常规 mat 文件,但使用特殊的变量结构来有效地存储数据。”可以使用更详细的描述 - 也许数据隐藏在您找到的条目之一中? @Christoph 我认为它们被称为 level-4 mat-files,似乎很多包只支持 level-5 mat-files。 ..(例如,mat4py) @Christoph 我打印出所有的键,但找不到'time'。(悲伤 这对我有用:github.com/thorade/jupyterNotebooks/blob/master/dymat/… 【参考方案1】:

要使用 JModelica 加载 mat 文件,您可以使用以下代码:

from pyfmi.common.io import ResultDymolaBinary

res = ResultDymolaBinary("MyResult.mat")

var = res.get_variable_data("myVar")

var.t #Time trajectory
var.x #Variable trajectory

【讨论】:

谢谢,这正是我所期待的!【参考方案2】:

https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/technical_details.html#the-matv4-result-file-format 描述格式。我认为您还可以查看 Dymola 手册了解更多详细信息。

对于 DyMat,没有理由获取时间轨迹,因为您通常会查找变量在特定时间的值。据我所知,开始和停止时间在 data_1 矩阵中(或者通常从 data_2 矩阵中的第一个轨迹中获取)。 (data_2 矩阵可能会被插值,因此存储在其中的时间值可能无法反映求解器内部采取的实际步骤)

【讨论】:

以上是关于如何在 JModelica 中读取 .mat 输出文件?的主要内容,如果未能解决你的问题,请参考以下文章

matlab中如何读取mat文件的矩阵

matlab如何批量读取mat文件中的矩阵?

JModelica编译器停止开源

JModelica 中的 Python/Pyomo 错误

python如何读取matlab数据 python如何读取.mat数据

用C读取matlab的mat文件