Pyomo: оценка параметров DAE и пошаговое моделирование модели

Я начал с Pyomo, и у меня есть несколько конкретных вопросов о пакете. Я работаю с DAE-Toolbox и хочу использовать этот набор инструментов для моделирования и оценки параметров. Вот мой код:

DAE-Model-скрипт (из пьомо-примеров):

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 пошаговый метод, который можно использовать для пошаговой
    интеграции dae-системы в цикл. Я хочу изменить входные данные (измерения, управляющие сигналы) между этапами без повторной установки моей модели
    . Я знаю, что у cvodes есть такой метод.

  3. Как можно использовать pyomo для прогнозирующего контроля модели. Есть какие-нибудь
    примеры? Что является хорошей отправной точкой?

Спасибо и пока

Hendrixon


person Hendrixon    schedule 12.06.2018    source источник


Ответы (2)


1) В симуляторе есть ошибка, которая не позволяет применять его к дискретным моделям, поэтому подход, который вы используете с двумя моделями, является способом сделать это в настоящее время (обратите внимание, вы должны использовать model.clone() для копирования модели вместо deepcopy) . Эта ошибка в Симуляторе будет исправлена ​​в следующем выпуске Pyomo.

2) См. этот раздел из документацию по симулятору, которая, я думаю, именно то, что вы просите.

3) См. этот документ о структуре для прогнозирующего управления нелинейной моделью, построенной на Pyomo. .

person Bethany Nicholson    schedule 13.06.2018

Спасибо за ваш ответ!

1) Я решил эту проблему с помощью абстрактной модели.

2) Я прочитал раздел документации по симулятору и провел несколько тестов. Но я хочу реализовать Simulator pyomo.dae в приложении «реального времени». Мой рабочий процесс:

  1. Считывание данных измерений с завода

  2. установить входы модели

  3. сделать шаг моделирования

  4. подождите, пока не появятся следующие данные

  5. установить входы .....

  6. выполните шаг симуляции (начните с состояний последнего шага симуляции, инициализация не требуется)

  7. ...и так далее

Я знаю, что в пакете pyfmi (от Jmodelica) есть такой пошаговый метод для Simulator / Integration, они используют cvode. В настоящее время я использую IDAS-Solver, потому что у меня есть DAE-System. Имеет ли интерфейс pyomos IDAS такой пошаговый метод интеграции?

3) очень интересно!

Спасибо!

person Hendrixon    schedule 14.06.2018