从Modelica模型中提取具有开始属性的变量列表

2024-05-16 01:06:36 发布

您现在位置:Python中文网/ 问答频道 /正文

是否有一种简单的方法可以从Modelica模型中提取具有开始属性的所有变量的列表?最终目标是运行一个模拟,直到它达到稳定状态,然后运行一个python脚本,将start属性的值与稳定状态的值进行比较,这样我就可以识别出选择错误的开始值

在Dymola Python接口中,我找不到这样的功能。另一种方法可能是生成modelDescription.xml并对其进行解析,我假设其中的某些信息是可用的,但是对于这种方法,我也觉得需要帮助才能开始


Tags: 方法模型功能脚本信息列表属性状态
3条回答

文件dsin.txt和dsfinal.txt可能会帮助您解决这个问题。它们具有相同的结构,在模拟开始和结束时都有值;通过将dsfinal.txt重命名为dsin.txt,您可以从上次运行中计算的(例如稳态)值开始模拟

  • 如果您已经考虑在运行其他模拟时使用这两个值,那么使用这两个文件可能是值得的
  • 它们为您提供有关解算器/模拟设置的信息,而您在.mat结果文件中找不到这些信息(如果您对它们感兴趣的话)

但是,如果只是比较结果文件中存在的变量的起始值和最终值,那么更好的选择可能是使用python和库来读取result.mat文件(dymat、modelicares等)。然后是比较感兴趣信号的起始值和结束值的问题

this答案类似,您可以使用FMPy从FMU内的modelDescription.xml中轻松提取该信息

下面是一个小的可运行示例:

from fmpy import read_model_description
from fmpy.util import download_test_file
from pprint import pprint

fmu_filename = 'CoupledClutches.fmu'

download_test_file('2.0', 'CoSimulation', 'MapleSim', '2016.2', 'CoupledClutches', fmu_filename)

model_description = read_model_description(fmu_filename)

start_vars = [v for v in model_description.modelVariables if v.start and v.causality == 'local']

pprint(start_vars)

经过一些尝试和错误之后,我提出了这个python代码片段,以从modelDescription.xml获得这些信息:

import xml.etree.ElementTree as ET
root = ET.parse('modelDescription.xml').getroot()

for ScalarVariable in root.findall('ModelVariables/ScalarVariable'):
    varStart = ScalarVariable.find('*[@start]')
    if varStart is not None:
        name = ScalarVariable.get('name')
        value = varStart.get('start')
        print(f"{name} = {value};")

要生成modelDescription.xml文件,请使用标志运行Dymola translation
Advanced.FMI.GenerateModelDescriptionInterface2 = true;

Python标准库有几个用于处理XML的模块:
https://docs.python.org/3/library/xml.html
此代码段使用ElementTree

这只是第一步,不确定我是否错过了一些基本的东西

相关问题 更多 >