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

如何正确设置FMPy simulate_fmu的输入变量数组结构?

解决fmpy中自定义输入的结构问题

错误原因

你当前的输入结构不符合fmpy的要求:input参数必须包含时间轴(命名为t的列),每个输入变量作为独立列存在,而非键值对数组。fmpy需要明确每个输入值对应的时间点,哪怕是全程恒定的输入也需定义时间范围。

正确的输入结构

1. 恒定输入(仿真全程输入值不变)

构造包含时间列t和所有输入变量列的结构化数组/DataFrame,至少包含起始、结束两个时间点,确保输入在整个周期内保持恒定:

import numpy as np
import fmpy

# 定义仿真时间范围
start_time = 0.0
stop_time = 10.0  # 按需调整

# 构造恒定输入的结构化数组
inputv = np.array(
    [(start_time, 28.7, 51.6, 51.6, 37.2, 2920),
     (stop_time, 28.7, 51.6, 51.6, 37.2, 2920)],
    dtype=[('t', 'float64'), ('iVar0', 'float64'), ('iVar1', 'float64'), 
           ('iVar2', 'float64'), ('iVar3', 'float64'), ('iVar4', 'float64')]
)

outputs = ['oVar0', 'oVar1', 'oVar2', 'oVar3']

# 运行仿真
result = fmpy.simulate_fmu(
    filename=filename,
    start_time=start_time,
    stop_time=stop_time,
    input=inputv,
    output=outputs
)

2. 时变输入(输入值随时间变化)

若需在不同时间点调整输入值,只需在数组中添加对应时间点的输入数据:

inputv = np.array(
    [(0.0, 28.7, 51.6, 51.6, 37.2, 2920),
     (2.0, 30.0, 50.0, 50.0, 35.0, 2800),
     (5.0, 32.0, 48.0, 48.0, 33.0, 2700),
     (10.0, 35.0, 45.0, 45.0, 30.0, 2600)],
    dtype=[('t', 'float64'), ('iVar0', 'float64'), ('iVar1', 'float64'), 
           ('iVar2', 'float64'), ('iVar3', 'float64'), ('iVar4', 'float64')]
)

3. 使用Pandas DataFrame(更直观)

若习惯用Pandas,可直接传入DataFrame,fmpy会自动处理:

import pandas as pd

input_df = pd.DataFrame({
    't': [start_time, stop_time],
    'iVar0': [28.7, 28.7],
    'iVar1': [51.6, 51.6],
    'iVar2': [51.6, 51.6],
    'iVar3': [37.2, 37.2],
    'iVar4': [2920, 2920]
})

result = fmpy.simulate_fmu(
    filename=filename,
    start_time=start_time,
    stop_time=stop_time,
    input=input_df,
    output=outputs
)

关键注意事项

  • 时间列必须命名为t,数据类型为float64。
  • 输入变量名称必须与FMU中定义的完全一致(含大小写)。
  • 恒定输入需至少包含两个时间点,否则fmpy无法识别输入时间范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:45:02