简体   繁体   English

使用 GEKKO sysid 进行自适应建模

[英]Adaptive modelling using GEKKO sysid

I have 100 points of data that I'm trying to describe using sysid in GEKKO .我有 100 个数据点,我试图在GEKKO中使用sysid来描述它们。 At some point ( t = 50 in this case) the data changes significantly and the prediction is no longer accurate.在某个时间点(在这种情况下为 t = 50),数据发生了显着变化,预测不再准确。 I'm trying to include an if statement that evaluates actual vs predicted and generates a new model (new yp ) if the prediction is x times bigger than the model.如果预测是 model 的 x 倍,我正在尝试包含一个 if 语句,该语句评估实际与预测并生成新的 model (新yp )。 Here's my sample code.这是我的示例代码。 The loop continues evaluating yp at each point in time but it should be evaluating yp_new now.循环在每个时间点继续评估yp ,但现在应该评估yp_new

from gekko import GEKKO
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# load data and parse into columns
t = np.linspace(0,1,101)
u = np.linspace(0,1,101)
y = np.zeros(len(t))
y[:50] = np.sin(u[:50])
y[50:] = np.exp(u[50:]/500)
# generate time-series model
m = GEKKO(remote=False)
# system identification
na = 2 # output coefficients
nb = 2 # input coefficients
yp,p,K = m.sysid(t,u,y,na,nb,diaglevel=1)
print(yp)
for i in range(len(t)):
    difference = np.abs((yp[i]-y[i])/max(0.01,y[i]))
    if difference>=0.2:   #If the difference is >20%
        yp_new,p_new,K = m.sysid(t,u,y,na,nb,diaglevel=0)
        print('Recalculating at i  = ' + str(i))
print(yp_new)
plt.figure()
plt.subplot(2,1,1)
plt.plot(t,u)
plt.legend([r'$u_0$',r'$u_1$'])
plt.ylabel('MVs')
plt.subplot(2,1,2)
plt.plot(t,y)
plt.plot(t,yp)
plt.plot(t,y)
plt.plot(t,yp_new)
plt.show()

You would need to update yp to be the new yp value yp = yp_new or else just return yp when doing the next system identification.您需要将yp更新为新的 yp 值yp = yp_new ,否则在进行下一次系统识别时只需返回yp However, the data that you are using to redo the sysid calculation is the same as the data that you used previously so there is no change in the model prediction.但是,您用于重做sysid计算的数据与您之前使用的数据相同,因此 model 预测没有变化。 Are you trying to update the time-series model only with the most recent data such as yp_new,p_new,K = m.sysid(t[i:],u[i:],y[i:],na,nb) ?您是否尝试仅使用最新数据更新时间序列 model,例如yp_new,p_new,K = m.sysid(t[i:],u[i:],y[i:],na,nb) ?

系统识别

The model currently updates on cycles that do not agree with the original time-series model prediction. model 当前更新与原始时间序列 model 预测不一致的周期。

Recalculating at i  = 10
Recalculating at i  = 11
Recalculating at i  = 12
Recalculating at i  = 13
Recalculating at i  = 14
Recalculating at i  = 15
Recalculating at i  = 16
Recalculating at i  = 17
Recalculating at i  = 18
Recalculating at i  = 19
Recalculating at i  = 20
Recalculating at i  = 21
Recalculating at i  = 22
Recalculating at i  = 23
Recalculating at i  = 24
Recalculating at i  = 25
Recalculating at i  = 40
Recalculating at i  = 41
Recalculating at i  = 42
Recalculating at i  = 43
Recalculating at i  = 44
Recalculating at i  = 45
Recalculating at i  = 46
Recalculating at i  = 47
Recalculating at i  = 48
Recalculating at i  = 49
Recalculating at i  = 50
Recalculating at i  = 51
Recalculating at i  = 52

If you include just the most recent data then it only recalculates at cycles 10, 42, 46, and 48.如果您仅包含最新数据,则它只会在第 10、42、46 和 48 周期重新计算。

from gekko import GEKKO
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# load data and parse into columns
t = np.linspace(0,1,101)
u = np.linspace(0,1,101)
y = np.zeros(len(t))
y[:50] = np.sin(u[:50])
y[50:] = np.exp(u[50:]/500)
# generate time-series model
m = GEKKO(remote=False)
# system identification
na = 2 # output coefficients
nb = 2 # input coefficients
yp,p,K = m.sysid(t,u,y,na,nb)
yp_init = yp.copy()
print(yp)
j = 0
for i in range(len(t)):
    difference = np.abs((yp[i-j]-y[i])/max(0.01,y[i]))
    if difference>=0.2:   #If the difference is >20%
        j = i # get cycle where the last update occurred
        yp,p,K = m.sysid(t[i:],u[i:],y[i:],na,nb)
        print('Recalculating at i  = ' + str(i))
plt.figure()
plt.subplot(2,1,1)
plt.plot(t,u)
plt.legend([r'$u_0$',r'$u_1$'])
plt.ylabel('MVs')
plt.subplot(2,1,2)
plt.plot(t,y)
plt.plot(t,yp_init)
plt.plot(t,y)
plt.plot(t[j:],yp)
plt.show()

更新了 sysid

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM