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