0

我从 Pyomo 开始,对这个包有一些具体的问题。我正在使用 DAE-Toolbox 并希望使用此工具箱进行模拟和参数估计。这是我的代码:

DAE 模型脚本(来自 pyomo-examples):

from pyomo.environ import *
from pyomo.dae import *

model = ConcreteModel()

time_vec = [0,1,2,3,4,5,6,7,8,9,10,11,12,13]
model.t = ContinuousSet(initialize= time_vec)

meas_time_vec = [1,2,3,5]
model.MEAS_t = Set(within=model.t,initialize =meas_time_vec)    # Measurement times, must be subset of t

meas_data_vec ={1:0.264,2:0.594,3: 0.801,5: 0.959}
model.x1_meas = Param(model.MEAS_t, initialize=meas_data_vec)

model.x1 = Var(model.t, initialize =0)
model.x2 = Var(model.t, initialize=1)

model.p1 = Var(bounds=(-1.5,1.5))
model.p2 = Var(bounds=(-1.5,1.5))

model.x1dot = DerivativeVar(model.x1,wrt=model.t)
model.x2dot = DerivativeVar(model.x2)

def _init_conditions(model):
    yield model.x1[0] == model.p1
    yield model.x2[0] == model.p2
model.init_conditions = ConstraintList(rule=_init_conditions)

# Alternate way to declare initial conditions
#def _initx1(model):
#   return model.x1[0] == model.p1      
#model.initx1 = Constraint(rule=_initx1)

#def _initx2(model):
#   return model.x2[0] == model.p2
#model.initx2 = Constraint(rule=_initx2)

def _x1dot(model,i):
    return model.x1dot[i] == model.x2[i]
model.x1dotcon = Constraint(model.t, rule=_x1dot)

def _x2dot(model,i):
    return model.x2dot[i] == 1-2*model.x2[i]-model.x1[i]
model.x2dotcon = Constraint(model.t, rule=_x2dot)

def obj(model):
    return sum((model.x1[i]-model.x1_meas[i])**2 for i in model.MEAS_t)
model.obj = Objective(rule=obj)

运行脚本:

rom pyomo.environ import *
from pyomo.dae import *
from Parameter_Estimation2 import model
import copy


#model copy
model_sim_window = copy.deepcopy(model)
model_sim_loop = copy.deepcopy(model)



#(1) Parameter Estimation
discretizer = TransformationFactory('dae.collocation')
discretizer.apply_to(model,nfe=8,ncp=5)
solver=SolverFactory('ipopt')
results = solver.solve(model,tee= True)
p_1 = value(model.p1)
p_2 = value(model.p2)
print('p_1',p_1)
print('p_2',p_2)


#(2) Simulation-window
model_sim_window.obj.deactivate()
model_sim_window.t.value = (0,20)
model_sim_window.p1.value = p_1
model_sim_window.p2.value = p_2
sim = Simulator(model_sim_window, package='casadi')
tsim, profiles = sim.simulate(numpoints=100, integrator='cvodes')


#(3)Simulation-loop
model_sim_loop.obj.deactivate()
model_sim_loop.p1.value = p_1
model_sim_loop.p2.value = p_2
sim = Simulator(model_sim_loop, package='casadi')
x0=[0,0]
result =[x0]
t_vec =[0]

for t in range(0,20):

    model_sim_loop.t.value = (t,t+1)
    tsim, profiles = sim.simulate(numpoints=10, integrator='cvodes',initcon=x0)
    result.append(profiles[-1])
    t_vec.append(tsim[-1])
    x0= profiles[-1]


print('result',result)
print('time',t_vec)

现在,问题:

  1. 有没有办法重用模型实例进行参数估计
    (评论 1)和模拟(评论 2)?我用
    “丑陋”的深拷贝解决了这个问题。

  2. pyomo.dae 模拟器有一个 step 方法,可用于
    在循环中逐步集成 dae 系统。我想在不重新初始化模型的情况下更改步骤之间的输入(测量值、控制信号)。我
    知道,cvodes 有这样的方法。

  3. pyomo如何用于模型预测控制。有没有
    例子?什么是好的起点?

谢谢再见

亨德里克森

4

2 回答 2

0

感谢您的答复!

1)我使用抽象模型解决了这个问题。

2)我已阅读模拟器文档中的部分,并进行了一些测试。但我想在“实时”应用程序中实现 pyomo.dae 模拟器。我的工作流程:

  1. 从工厂读取测量数据

  2. 设置模型的输入

  3. 做一个模拟步骤

  4. 等到下一个数据进来

  5. 设置输入......

  6. 做一个模拟步骤(从最后一个模拟步骤的状态开始,不需要初始化)

  7. ...等等

我知道 pyfmi 包(来自 Jmodelica)有这样一个模拟器/集成的步骤方法,他们使用 cvode。目前我正在使用 IDAS-Solver,因为我有 DAE 系统。pyomos IDAS接口有这种分步集成的方法吗?

3)非常有趣!

谢谢!

于 2018-06-14T08:13:39.283 回答
0

1)模拟器中有一个错误,它阻止它被应用于离散模型,因此您使用两个模型的方法是目前的方法(注意,您应该使用model.clone()复制模型而不是 deepcopy)。模拟器中的这个错误将在下一个 Pyomo 版本中修复。

2)请参阅模拟器文档中的本节,我认为这正是您所要求的。

3)请参阅本文关于基于 Pyomo 构建的非线性模型预测控制框架。

于 2018-06-13T19:08:13.690 回答