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

Я просмотрел библиографию и структуру программирования 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() инструкцию, используемую в коде.

Спасибо.

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


person SANDRA RODRIGUEZ    schedule 24.09.2020    source источник
comment
Вот еще один полезный пост о горизонтах управления и прогнозирования: stackoverflow.com/questions/63991323/   -  person John Hedengren    schedule 24.09.2020
comment
Функция linspace дает вам n линейные значения промежутка между начальной и конечной точкой как numpy.linspace(start,end,n). Это удобный способ компактно определить последовательность значений. numpy.org/doc/stable/reference/generated/numpy.linspace. html   -  person TexasEngineer    schedule 24.09.2020


Ответы (1)


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

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

Параметры CTRL_HOR, CTRL_TIME, PRED_HOR и PRED_TIME являются параметрами APMonitor, но не изменяют решение Gekko, если вы не установите _ 5_. Отключение чтения файла 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()
person John Hedengren    schedule 24.09.2020