首页 > 解决方案 > 如何使用 PyFMI 定义依赖于模拟 FMU 输出的输入函数?

问题描述

我有一个 FMU 可以使用 PyFMI 进行模拟。如何创建依赖于模拟 FMU 输出的输入函数?该文档仅提供了依赖于外部变量的输入函数的示例,例如:

# Generate input
t = N.linspace(0.,10.,100) 
u = N.cos(t)
u_traj = N.transpose(N.vstack((t,u)))

# Create input object
input_object = ('u', u_traj)

# Simulate
res = model.simulate(final_time=30, input=input_object, options={'ncp':3000})

如果我希望我的输入函数 u_traj 依赖于模型的输出 'y' 而不是 t,我该怎么办?

标签: pythonfmi

解决方案


有可能的。在 PyFMI 中,允许将输入指定为函数而不是数据矩阵。

model = load_fmu(...)

def input_function(t):
    global model
    #Get values from the model using e.g. "model.get("my_parameter")"
    p = model.get("my_paramater")
    return t*p

input_object = ("u", input_function)

res = model.simulate(final_time=30, input=input_object, options={'ncp':3000})

但正如我在评论中所说,这必须小心完成,因为可能会创建循环并使问题无法解决。也可能是因为模型可能尚未初始化,因此您可能需要保护(在 input_function 中)第一次调用它,因此您需要检索的值可能不可用。


推荐阅读