You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用FMPy提取连续时间状态列表?能否同时获取离散时间状态?

在FMPy中获取连续/离散时间状态字典实现断点续仿

FMPy没有提供PyFMI那样直接的get_states_list()函数,但可以通过解析FMU的模型描述筛选变量,构建连续/离散状态字典,甚至可以同时获取两者。

获取连续时间状态字典

通过模型描述筛选本地因果性+连续可变性的变量,即可得到连续状态列表,进而构建状态字典:

代码示例

from fmpy import read_model_description, extract, instantiate_fmu

# 读取FMU的模型描述
model_desc = read_model_description('your_model.fmu')

# 筛选连续状态变量
continuous_vars = [var for var in model_desc.variables 
                   if var.causality == 'local' and var.variability == 'continuous']

# 初始化连续状态字典
continuous_state_dict = {var.name: None for var in continuous_vars}

# 提取并实例化FMU
unzip_dir = extract('your_model.fmu')
fmu = instantiate_fmu(unzip_dir, model_desc)

# 初始化仿真流程
fmu.setupExperiment(startTime=0)
fmu.enterInitializationMode()
fmu.exitInitializationMode()

# 仿真到目标时间点
fmu.doStep(currentCommunicationPoint=0, communicationStepSize=10)

# 更新字典为当前仿真的最终状态值
for var in continuous_vars:
    continuous_state_dict[var.name] = fmu.getReal([var.valueReference])[0]

同时获取离散时间状态字典

离散状态变量满足本地因果性,且可变性为discrete或event,需要根据变量类型(Real/Integer/Boolean)分别读取值:

代码示例

# 筛选离散状态变量
discrete_vars = [var for var in model_desc.variables 
                 if var.causality == 'local' and var.variability in ['discrete', 'event']]

# 初始化离散状态字典
discrete_state_dict = {var.name: None for var in discrete_vars}

# 更新字典为当前仿真的最终状态值
for var in discrete_vars:
    vr = [var.valueReference]
    if var.type == 'Real':
        discrete_state_dict[var.name] = fmu.getReal(vr)[0]
    elif var.type == 'Integer':
        discrete_state_dict[var.name] = fmu.getInteger(vr)[0]
    elif var.type == 'Boolean':
        discrete_state_dict[var.name] = fmu.getBoolean(vr)[0]

基于状态字典实现断点续仿

重置FMU后,将保存的状态值重新设置到模型中,即可从上次结束的时间点继续仿真:

# 重置FMU
fmu.reset()

# 恢复连续状态
for var in continuous_vars:
    fmu.setReal([var.valueReference], [continuous_state_dict[var.name]])

# 恢复离散状态
for var in discrete_vars:
    vr = [var.valueReference]
    val = discrete_state_dict[var.name]
    if var.type == 'Real':
        fmu.setReal(vr, [val])
    elif var.type == 'Integer':
        fmu.setInteger(vr, [val])
    elif var.type == 'Boolean':
        fmu.setBoolean(vr, [val])

# 继续仿真(从上次结束时间点开始)
fmu.doStep(currentCommunicationPoint=10, communicationStepSize=10)

内容的提问来源于stack exchange,提问作者janpeter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 05:03:26