Можно ли получить данные предвзятых и непредвзятых прогнозируемых контролируемых переменных при использовании APMonitor для прогнозирующего управления моделью в Python?

Я пытаюсь создать код Python для прогнозирующего управления моделью с помощью APMonitor. Однако я не хочу получать результаты на стороннем онлайн-сервере. Следовательно, я хочу собрать данные предсказанных предвзятых и непредвзятых и построить их на Python самостоятельно.


person Mohamad Ibrahim    schedule 19.09.2019    source источник
comment
Привет и добро пожаловать в Stack Overflow! Чтобы повысить вероятность получения помощи, убедитесь, что у вас есть четкий вопрос и задайте минимальный, рабочий, проверяемый пример.   -  person giusti    schedule 19.09.2019
comment
Вы также можете решить с помощью опции GUI = True, чтобы отображать графики в веб-браузере. m.solve(GUI=True). Это также работает в локальном режиме, когда m=GEKKO(remote=False).   -  person John Hedengren    schedule 19.09.2019
comment
что ты уже испробовал?   -  person easythrees    schedule 20.09.2019


Ответы (1)


Попробуйте это в Python Gekko:

# get additional solution information
import json
with open(m.path+'//results.json') as f:
    results = json.load(f)

Вы можете получить объективный результат модели, получив словарное значение вашей переменной v с помощью v.name. Вы можете получить предвзятый прогноз модели с помощью v.name+'.bcv'. Вот пример, который также показывает, как получить необработанную информацию о траектории.

Построить необработанные результаты

Это дает вам доступ к необработанным данным. Пример показывает, как построить график из данных JSON.

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

m = GEKKO()
m.time = np.linspace(0,20,41)

# Parameters
mass = 500
b = m.Param(value=50)
K = m.Param(value=0.8)

# Manipulated variable
p = m.MV(value=0, lb=0, ub=100)
p.STATUS = 1  # allow optimizer to change
p.DCOST = 0.1 # smooth out gas pedal movement
p.DMAX = 20   # slow down change of gas pedal

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

# Process model
m.Equation(mass*v.dt() == -v*b + K*b*p)

m.options.IMODE = 6 # control
m.solve(disp=False,GUI=True)

# 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,p.value,'b-',label='MV Optimized')
plt.legend()
plt.ylabel('Input')
plt.subplot(2,1,2)
plt.plot(m.time,results['v1.tr'],'k-',label='Reference Trajectory')
plt.plot(m.time,v.value,'r--',label='CV Response')
plt.ylabel('Output')
plt.xlabel('Time')
plt.legend(loc='best')
plt.show()
person John Hedengren    schedule 19.09.2019
comment
Вы также можете назвать свои переменные, например, x = m.Var (name = 'x'), чтобы x.name было 'x' вместо 'v1' (схема именования по умолчанию на сервере - v1, v2, v3, так далее). - person John Hedengren; 19.09.2019