如何正确设置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
相关产品推荐
相关产品推荐

