Горизонт управления и горизонт прогноза

Sep 24 2020

Я просмотрел библиографию и структуру программирования Gekko для управления с прогнозированием модели. Хотя я понял, как это запрограммировано и их назначение. Я хотел бы понять, как Gekko управляет различиями между горизонтом управления и горизонтом прогнозирования, например, в соответствии с родственным в Себорге. Я не вижу различий в коде. Ниже для иллюстрации приведен пример приложения MPC.

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt  

m = GEKKO()

# Time Horizon [0,1,2,...,39,40]
m.time = np.linspace(0,40,41)

# MV = Manipulated Variable
u = m.MV(value=0, lb=0, ub=100)
u.STATUS=1; u.DCOST=0.1; u.DMAX=20

# CV = Controlled Variable
x = m.CV(value=0,name='x')
x.STATUS=1; x.SP=45

# Define model
K = m.Param(value=0.8); tau = 15.0
m.Equation(tau*x.dt() == -x + K*u)

# Options and solve
m.options.CV_TYPE = 2
m.options.MV_TYPE = 0
m.options.NODES   = 3
m.options.IMODE   = 6

# Define Control and Prediction Horizon
m.options.CTRL_HOR = 10
m.options.CTRL_TIME = 1
m.options.PRED_HOR = 40
m.options.PRED_TIME = 2

m.solve(disp=False)

# Plot results
plt.figure()
plt.subplot(2,1,1)
plt.step(m.time,u.value,'b-',label='MV Move Plan')
plt.legend()
plt.ylabel('MV')
plt.subplot(2,1,2)
plt.plot([0,40],[45,45],'k-',label='Target Setpoint')
plt.plot(m.time,x.value,'r--',label='CV Response')
plt.ylabel('CV')
plt.xlabel('Time')
plt.legend(loc='best')
plt.show()

Буду признателен за ваш отзыв о том, как мне следует рассматривать np.linspace()инструкцию, используемую в коде.

Спасибо.

Сандра Родригес

Ответы

1 JohnHedengren Sep 24 2020 at 12:54

Горизонт управления - это участок временного горизонта, на котором разрешены движения MV. Горизонт прогнозирования простирается за горизонт контроля, чтобы предсказать окончательные результаты CV, но без движения MV. Это унаследованная от промышленных моделей прогнозирующая концепция контроллеров, которая должна рассчитать краткосрочный план перемещения, но также должна предсказать, где в конечном итоге будут рассчитаны MV и CV контроллера.

Вариант 1. Используйте параметры Gekko для определения временного горизонта (не рекомендуется)

Параметры CTRL_HOR, CTRL_TIME, PRED_HORи PRED_TIMEварианты из APMonitor , но не изменить решение Гекко , если не установлено m.options.CSV_READ=0. Отключение чтения файла CSV не рекомендуется, поскольку Gekko использует файл данных CSV для передачи изменений.

m.options.CSV_READ = 0

# Define Control and Prediction Horizon
m.options.CTRL_HOR = 10
m.options.CTRL_TIME = 1
m.options.PRED_HOR = 40
m.options.PRED_TIME = 1

Вариант 2: использовать m.time()для определения временного горизонта

Использование m.time- предпочтительный метод определения временного горизонта MPC. Он может быть неоднородным с большим, чем просто интервалом управления и прогнозирования.

m.time = [0,1,2,3,4,6,8,10,15,25,35,50,80]

Уменьшение степени свободы горизонта прогнозирования

Целью горизонта прогнозирования является расчет до устойчивого состояния, при котором последнее допустимое отклонение MV от горизонта управления остается постоянным. Если вам нужно запретить движение MV после определенной точки, вы m.Connection()можете связать значения MV вместе, чтобы запретить движение после определенного местоположения временного горизонта.

# Create prediction horizon
for i in range(9,len(m.time)):
    m.Connection(u,u,8,i)     # connect end point node
    m.Connection(u,u,8,i,1,2) # connect internal node

Вот полный код этой примерной проблемы.

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt  

m = GEKKO()

# Time Horizon
m.time = [0,1,2,3,4,6,8,10,15,25,35,50,80]

# MV = Manipulated Variable
u = m.MV(value=0, lb=0, ub=100)
u.STATUS=1; u.DCOST=0.1; u.DMAX=20

# CV = Controlled Variable
x = m.CV(value=0,name='x')
x.STATUS=1; x.SP=45

# Define model
K = m.Param(value=0.8); tau = 15.0
m.Equation(tau*x.dt() == -x + K*u)

# Options and solve
m.options.CV_TYPE = 2
m.options.MV_TYPE = 0
m.options.NODES   = 3
m.options.IMODE   = 6

# Create prediction horizon
for i in range(9,len(m.time)):
    m.Connection(u,u,8,i)     # connect end point node
    m.Connection(u,u,8,i,1,2) # connect internal node

m.solve(disp=True)

# Plot results
plt.figure()
plt.subplot(2,1,1)
plt.step(m.time,u.value,'b-',label='MV Move Plan')
plt.plot(m.time[0:8],u.value[0:8],'o',color='orange',label='Control Horizon')
plt.plot(m.time[8:],u.value[8:],'x',color='purple',label='Prediction Horizon')
plt.legend()
plt.ylabel('MV')
plt.subplot(2,1,2)
plt.plot([0,80],[45,45],'k-',label='Target Setpoint')
plt.plot(m.time,x.value,'r.-',label='CV Response')
plt.ylabel('CV')
plt.xlabel('Time')
plt.legend(loc='best')
plt.show()