gpt4 book ai didi

python - FMU 变量值与输入不匹配

转载 作者:太空宇宙 更新时间:2023-11-04 04:28:21 24 4
gpt4 key购买 nike

我在尝试配置的简单协同仿真中遇到了一些奇怪的行为。我在 EnergyPlus 中设置了一个建筑能源模型来测试从 JModelica 生成的 FMU。但是,建筑能量模型会在 union 仿真步骤中挂起。然后我在 JModelica 中运行 FMU,得到了一些非常奇怪的结果。

Modelica 代码是:

model CallAdd
input Real FirstInput(start=0);
input Real SecondInput(start=0);
output Real FMUOutput(start=0);
function CAdd
input Real x(start=0);
input Real y(start=0);
output Real z(start=0);
external "C" annotation(Library = "CAdd", LibraryDirectory = "modelica://CallAdd");
end CAdd;
equation
FMUOutput = CAdd(FirstInput,SecondInput);
annotation(uses(Modelica(version = "3.2.1")));
end CallAdd;

上面的代码引用了“CAdd”,它是c代码“CAdd.c”的库文件:

double CAdd(double x, double y){
double answer;
answer = x + y;
return answer;
}

在CMD中使用以下两条命令编译成库文件:

gcc -c CAdd.c -o CAdd.o
ar rcs libCAdd.a CAdd.o

我可以使用包装器在 OpenModelica 中运行上面的示例,效果很好。

然后我使用 JModelica 将上述内容编译为 FMU 以进行 union 仿真。 JModelica 编译代码为:

# Import the compiler function
from pymodelica import compile_fmu

# Specify Modelica model and model file (.mo or .mop)
model_name = "CallAdd"
mo_file = "CallAdd.mo"

# Compile the model and save the return argument, for use later if wanted
my_fmu = compile_fmu(model_name, mo_file, target="cs")

然后我用 JModelica Python 代码模拟了 FMU 并得到了奇怪的结果:

from pyfmi import load_fmu
import numpy as np
import matplotlib.pyplot as plt

modelName = 'CallAdd'
numSteps = 100
timeStop = 20

# Load FMU created with the last script
myModel = load_fmu(modelName+'.fmu')

# Load options
opts = myModel.simulate_options()

# Set number of timesteps
opts['ncp'] = numSteps

# Set up input, needs more than one value to interpolate the input over time.
t = np.linspace(0.0,timeStop,numSteps)
u1 = np.sin(t)
u2 = np.empty(len(t)); u2.fill(5.0)
u_traj = np.transpose(np.vstack((t,u1,u2)))
input_object = (['FirstInput','SecondInput'],u_traj)

# Internalize results
res = myModel.simulate(final_time=timeStop, input = input_object, options=opts)
# print 'res: ', res

# Internalize individual results
FMUTime = res['time']
FMUIn1 = res['FirstInput']
FMUIn2 = res['SecondInput']
FMUOut = res['FMUOutput']

plt.figure(2)
FMUIn1Plot = plt.plot(t,FMUTime[1:],label='FMUTime')
# FMUIn1Plot = plt.plot(t,FMUIn1[1:],label='FMUIn1')
# FMUIn2Plot = plt.plot(t,FMUIn2[1:],label='FMUIn2')
# FMUOutPlot = plt.plot(t,FMUOut[1:],label='FMUOut')
plt.grid(True)
plt.legend()
plt.ylabel('FMU time [s]')
plt.xlabel('time [s]')
plt.show()

这导致结果“FMUTime”与 python“t”的关系图: FMU Time does not match simulation time

除了看到这种奇怪的行为外,FMU 结果中的输入“FirstInput”和“SecondInput”与 python 代码中指定的 u1 和 u2 不匹配。我希望有人能帮助我更好地理解发生了什么。

最好的,

贾斯汀

最佳答案

按照@ChristianAndersson 的建议更新我的 JModelica 安装,我上面的问题中描述的问题已解决。

JModelica 1.17.0 于 2015 年 12 月发布。

JModelica-SDK-1.12.0 于 2016 年 2 月发布,是从源代码构建的,它解决了问题并为我提供了预期的结果。

关于python - FMU 变量值与输入不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39005445/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com