FMU FMI仿真,初始化后部分方程没有求值
FMU FMI simulation, no evaluation of some equations after initialization
我相信我的问题在某种程度上与 this previous question 有关,但我无法根据他们的建议解决我的问题。
这是一个最小的非工作示例。我有一个简单的电路,里面有一个换向开关(在 openModelica 中开发)。我想根据输入参数的值修改 switch.control 的值。为此,我有以下内容:
model MinimalNonWorkingExemple
parameter Modelica.Blocks.Interfaces.RealInput openclose;
Modelica.Electrical.Analog.Ideal.IdealCommutingSwitch switch;
Modelica.Electrical.Analog.Basic.Ground G;
equation
connect(switch.p, G.p);
connect(switch.n2, G.p);
connect(switch.n1, G.p);
switch.control = if openclose > 0.5 then true else false;
end MinimalNonWorkingExemple;
注意:我尝试了参数、输入等之间的多种组合...
我想进行一次迭代模拟(例如模拟系统的 60 秒,但连续模拟 60 次,每次 1 秒)。这是为了能够根据另一个FMU模拟改变输入值(openclose)。
因此,我可以修改 pyFMI 的输入值。 (当我阅读它时,已考虑更改)。但是,"new value" 在我的方程式中都没有被考虑在内。
这是我的 pyfmi 脚本:
# Import the load function (load_fmu)
from pyfmi import load_fmu
import numpy as np
from pylab import *
def simulate(model, res, startTime,finalTime, initialState):
if res == None:
opts=model.simulate_options()
opts['initialize']=True
else:
opts=model.simulate_options()
opts['initialize']=False
for s in initialState:
model.set(s[0],s[1])
res = model.simulate(start_time = startTime, final_time=finalTime, options=opts)
return res
#main part
model = load_fmu('MinimalNonWorkingExemple.fmu')
switchClose = ['openclose', [0.0]]
switchOpen = ['openclose', [1.0]]
#Simulate an FMU
res = simulate(model, None, 0, 50, [switchOpen])
v = res["openclose"]
v2 = res["switch.control"]
res = simulate(model, res, 50, 100, [switchClose])
v = np.concatenate((v,res["openclose"]))
v2 = np.concatenate((v2,res["switch.control"]))
res = simulate(model, res, 100, 200, [switchOpen])
v = np.concatenate((v,res["openclose"]))
v2 = np.concatenate((v2,res["switch.control"]))
print v
print v2
基本上我在 50 个时间单位内进行模拟,然后更改 openclose
变量的值,然后再次模拟,再次切换并重新模拟。结果我得到:
openclose: [ 1. 1. 1. 1. 0. 0. 0. 0. 1. 1. 1. 1.]
switch.control: [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
实际上,只有在第一次调用 model.simulate(...)
之前创建的集合才会在系统中传播它的值。
我试图理解annotation(Evaluate = false)
提议的here,但没有成功。我不确定它是否相关,因为我实际上可以改变我的价值。问题是基于这个参数的方程似乎只在初始化期间被评估:-/
欢迎任何 idea/help...
据我所知,FMI 标准规定在初始化模型后,您对参数的更改将不再影响模型。因此,必须使用重置并重新初始化模型,以便再次获取更改。
这段代码似乎工作正常:
# Import the load function (load_fmu)
from pyfmi import load_fmu
import numpy as np
from pylab import *
def simulate(model, res, startTime,finalTime, initialState):
if res == None:
opts=model.simulate_options()
opts['initialize']=True
else:
model.reset()
opts=model.simulate_options()
opts['initialize']=True
for s in initialState:
model.set(s[0],s[1])
res = model.simulate(start_time = startTime, final_time=finalTime, options=opts)
return res
#main part
model = load_fmu('MinimalNonWorkingExemple.fmu')
print model.get_description()
model.set_log_level(7)
switchClose = ['openclose', [0.0]]
switchOpen = ['openclose', [1.0]]
#Simulate an FMU
res = simulate(model, None, 0, 50, [switchOpen])
v = res["openclose"]
v2 = res["switch.control"]
res = simulate(model, res, 50, 100, [switchClose])
v = np.concatenate((v,res["openclose"]))
v2 = np.concatenate((v2,res["switch.control"]))
res = simulate(model, res, 100, 200, [switchOpen])
v = np.concatenate((v,res["openclose"]))
v2 = np.concatenate((v2,res["switch.control"]))
print v
print v2
结果是:
[ 1. 1. 1. 1. 0. 0. 0. 0. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 0. 0. 0. 0. 1. 1. 1. 1.]
你也可以在这里看到讨论:
http://ext5.modelon.ideon.se/5858
如果您将 openclose 作为输入(无参数),然后将输入对象提供给模拟(openclose、时间、值),如此处示例所示,它也可能会起作用:
http://www.jmodelica.org/assimulo_home/pyfmi_1.0/pyfmi.examples.html#module-pyfmi.examples.fmu_with_input
但是,我没有尝试过,所以它可能不起作用。
我相信我的问题在某种程度上与 this previous question 有关,但我无法根据他们的建议解决我的问题。
这是一个最小的非工作示例。我有一个简单的电路,里面有一个换向开关(在 openModelica 中开发)。我想根据输入参数的值修改 switch.control 的值。为此,我有以下内容:
model MinimalNonWorkingExemple
parameter Modelica.Blocks.Interfaces.RealInput openclose;
Modelica.Electrical.Analog.Ideal.IdealCommutingSwitch switch;
Modelica.Electrical.Analog.Basic.Ground G;
equation
connect(switch.p, G.p);
connect(switch.n2, G.p);
connect(switch.n1, G.p);
switch.control = if openclose > 0.5 then true else false;
end MinimalNonWorkingExemple;
注意:我尝试了参数、输入等之间的多种组合...
我想进行一次迭代模拟(例如模拟系统的 60 秒,但连续模拟 60 次,每次 1 秒)。这是为了能够根据另一个FMU模拟改变输入值(openclose)。
因此,我可以修改 pyFMI 的输入值。 (当我阅读它时,已考虑更改)。但是,"new value" 在我的方程式中都没有被考虑在内。
这是我的 pyfmi 脚本:
# Import the load function (load_fmu)
from pyfmi import load_fmu
import numpy as np
from pylab import *
def simulate(model, res, startTime,finalTime, initialState):
if res == None:
opts=model.simulate_options()
opts['initialize']=True
else:
opts=model.simulate_options()
opts['initialize']=False
for s in initialState:
model.set(s[0],s[1])
res = model.simulate(start_time = startTime, final_time=finalTime, options=opts)
return res
#main part
model = load_fmu('MinimalNonWorkingExemple.fmu')
switchClose = ['openclose', [0.0]]
switchOpen = ['openclose', [1.0]]
#Simulate an FMU
res = simulate(model, None, 0, 50, [switchOpen])
v = res["openclose"]
v2 = res["switch.control"]
res = simulate(model, res, 50, 100, [switchClose])
v = np.concatenate((v,res["openclose"]))
v2 = np.concatenate((v2,res["switch.control"]))
res = simulate(model, res, 100, 200, [switchOpen])
v = np.concatenate((v,res["openclose"]))
v2 = np.concatenate((v2,res["switch.control"]))
print v
print v2
基本上我在 50 个时间单位内进行模拟,然后更改 openclose
变量的值,然后再次模拟,再次切换并重新模拟。结果我得到:
openclose: [ 1. 1. 1. 1. 0. 0. 0. 0. 1. 1. 1. 1.]
switch.control: [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
实际上,只有在第一次调用 model.simulate(...)
之前创建的集合才会在系统中传播它的值。
我试图理解annotation(Evaluate = false)
提议的here,但没有成功。我不确定它是否相关,因为我实际上可以改变我的价值。问题是基于这个参数的方程似乎只在初始化期间被评估:-/
欢迎任何 idea/help...
据我所知,FMI 标准规定在初始化模型后,您对参数的更改将不再影响模型。因此,必须使用重置并重新初始化模型,以便再次获取更改。 这段代码似乎工作正常:
# Import the load function (load_fmu)
from pyfmi import load_fmu
import numpy as np
from pylab import *
def simulate(model, res, startTime,finalTime, initialState):
if res == None:
opts=model.simulate_options()
opts['initialize']=True
else:
model.reset()
opts=model.simulate_options()
opts['initialize']=True
for s in initialState:
model.set(s[0],s[1])
res = model.simulate(start_time = startTime, final_time=finalTime, options=opts)
return res
#main part
model = load_fmu('MinimalNonWorkingExemple.fmu')
print model.get_description()
model.set_log_level(7)
switchClose = ['openclose', [0.0]]
switchOpen = ['openclose', [1.0]]
#Simulate an FMU
res = simulate(model, None, 0, 50, [switchOpen])
v = res["openclose"]
v2 = res["switch.control"]
res = simulate(model, res, 50, 100, [switchClose])
v = np.concatenate((v,res["openclose"]))
v2 = np.concatenate((v2,res["switch.control"]))
res = simulate(model, res, 100, 200, [switchOpen])
v = np.concatenate((v,res["openclose"]))
v2 = np.concatenate((v2,res["switch.control"]))
print v
print v2
结果是:
[ 1. 1. 1. 1. 0. 0. 0. 0. 1. 1. 1. 1.]
[ 1. 1. 1. 1. 0. 0. 0. 0. 1. 1. 1. 1.]
你也可以在这里看到讨论: http://ext5.modelon.ideon.se/5858
如果您将 openclose 作为输入(无参数),然后将输入对象提供给模拟(openclose、时间、值),如此处示例所示,它也可能会起作用: http://www.jmodelica.org/assimulo_home/pyfmi_1.0/pyfmi.examples.html#module-pyfmi.examples.fmu_with_input 但是,我没有尝试过,所以它可能不起作用。