I have 100 points of data that I'm trying to describe using sysid
in GEKKO
. At some point ( t = 50 in this case) the data changes significantly and the prediction is no longer accurate. 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. Here's my sample code. The loop continues evaluating yp
at each point in time but it should be evaluating yp_new
now.
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()