Почему GEKKO не выполняет первоначальное измерение?

При использовании GEKKO для моделирования динамической системы с начальным измерением GEKKO, кажется, полностью игнорирует измерение даже при включенном FSTATUS. Что вызывает это и как я могу заставить GEKKO распознать первоначальное измерение?

Я ожидаю, что решающая программа учтет первоначальное измерение и соответствующим образом скорректирует решение.

adjust

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

# measurement
tm = 0
xm = 25

m = GEKKO()
m.time = np.linspace(0,20,41)
tau = 10
b = m.Param(value=50)
K = m.Param(value=0.8)

# Manipulated Variable
u = m.MV(value=0, lb=0, ub=100)
u.STATUS = 1  # allow optimizer to change
u.DCOST = 0.1
u.DMAX = 30

# Controlled Variable
x = m.CV(value=0,name='x')
x.STATUS = 1  # add the SP to the objective
m.options.CV_TYPE = 2 # squared error
x.SP = 40     # set point
x.TR_INIT = 1 # set point trajectory
x.TAU = 5     # time constant of trajectory
x.FSTATUS = 1
x.MEAS = xm

# Process model
m.Equation(tau*x.dt() == -x + K*u)
m.options.IMODE = 6 # control
m.solve()

# get additional solution information
import json
with open(m.path+'//results.json') as f:
        results = json.load(f)
plt.figure()
plt.subplot(2,1,1)
plt.plot(m.time,u.value,'b-',label='MV Optimized')
plt.legend()
plt.ylabel('Input')
plt.subplot(2,1,2)
plt.plot(tm,xm,'ro', label='Measurement')
plt.plot(m.time,results['x.tr'],'k-',label='Reference Trajectory')
plt.plot(m.time,results['x.bcv'],'r--',label='CV Response')
plt.ylabel('Output')
plt.xlabel('Time')
plt.legend()
plt.show()

person Daniel Hill    schedule 21.11.2019    source источник


Ответы (1)


Gekko игнорирует измерения в первом цикле инициализации MPC. Если вы выполняете другое решение, оно использует измерение.

m.solve() # for MPC initialization

x.MEAS = xm
m.solve() # update initial condition with measurement

Статус обратной связи (FSTATUS) - это фильтр первого порядка для измерений, который находится в диапазоне от 0 (без обновления) до 1 (полное обновление измерения).

MEAS = LSTVAL * (1-FSTATUS) + MEAS * FSTATUS

Новое измерение (MEAS) затем используется в вычислении смещения. Существует несмещенный прогноз (необработанный прогноз, на который не влияют измерения) прогнозирование модели и прогнозирование смещенной модели. Смещение рассчитывается как разница между несмещенным прогнозом модели и измерением.

BIAS = MEAS - UNBIASED_MODEL

Предвзятая и непредвзятая модель

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

# measurement
tm = 0
xm = 25

m = GEKKO()
m.time = np.linspace(0,20,41)
tau = 10
b = m.Param(value=50)
K = m.Param(value=0.8)

# Manipulated Variable
u = m.MV(value=0, lb=0, ub=100)
u.STATUS = 1  # allow optimizer to change
u.DCOST = 0.1
u.DMAX = 30

# Controlled Variable
x = m.CV(value=0,name='x')
x.STATUS = 1  # add the SP to the objective
m.options.CV_TYPE = 2 # squared error
x.SP = 40     # set point
x.TR_INIT = 1 # set point trajectory
x.TAU = 5     # time constant of trajectory
x.FSTATUS = 1

# Process model
m.Equation(tau*x.dt() == -x + K*u)
m.options.IMODE = 6 # control
m.solve(disp=False)

m.options.TIME_SHIFT = 0
x.MEAS = xm
m.solve(disp=False)
# turn off time shift, only for initialization
m.options.TIME_SHIFT = 1

# get additional solution information
import json
with open(m.path+'//results.json') as f:
        results = json.load(f)
plt.figure()
plt.subplot(2,1,1)
plt.plot(m.time,u.value,'b-',label='MV Optimized')
plt.legend()
plt.ylabel('Input')
plt.ylim([-5,105])
plt.subplot(2,1,2)
plt.plot(tm,xm,'ro', label='Measurement')
plt.plot(m.time,results['x.tr'],'k-',label='Reference Trajectory')
plt.plot(m.time,results['x.bcv'],'r--',label='CV Response Biased')
plt.plot(m.time,x.value,'g:',label='CV Response Unbiased')
plt.ylim([-1,41])
plt.ylabel('Output')
plt.xlabel('Time')
plt.legend()
plt.show()

Вот как это работает в настоящее время, потому что для упомянутых выше расчетов не существует LSTVAL или объективных прогнозов модели. Первый цикл вычисляет эти значения и позволяет обновлять их в последующих циклах. Если вам действительно нужны обновленные значения в первом цикле, вы можете решить с опцией m.option.TIME_SHIFT=0 во втором решении, чтобы не обновлять начальные условия вашей модели. Вы захотите изменить TIME_SHIFT=1 для последующих циклов, чтобы иметь ожидаемый ход динамической модели во времени.

person John Hedengren    schedule 22.11.2019