Python 使用GEKKO sysid的自适应建模

Python 使用GEKKO sysid的自适应建模,python,loops,regression,autoregressive-models,gekko,Python,Loops,Regression,Autoregressive Models,Gekko,我在GEKKO中尝试使用sysid来描述100个数据点。在某一点(本例中t=50),数据发生显著变化,预测不再准确。我试图包括一个if语句,它评估实际与预测,并生成一个新模型(newyp),如果预测比模型大x倍。这是我的示例代码。循环在每个时间点继续评估yp,但现在应该评估yp\u new 从gekko导入gekko 作为pd进口熊猫 将matplotlib.pyplot作为plt导入 将numpy作为np导入 #加载数据并解析为列 t=np.linspace(0,1101) u=np.lins

我在
GEKKO
中尝试使用
sysid
来描述100个数据点。在某一点(本例中t=50),数据发生显著变化,预测不再准确。我试图包括一个if语句,它评估实际与预测,并生成一个新模型(new
yp
),如果预测比模型大x倍。这是我的示例代码。循环在每个时间点继续评估
yp
,但现在应该评估
yp\u new

从gekko导入gekko
作为pd进口熊猫
将matplotlib.pyplot作为plt导入
将numpy作为np导入
#加载数据并解析为列
t=np.linspace(0,1101)
u=np.linspace(0,1101)
y=np.零(len(t))
y[:50]=np.sin(u[:50])
y[50:]=np.exp(u[50:]/500)
#生成时间序列模型
m=GEKKO(远程=False)
#系统识别
na=2#输出系数
nb=2#输入系数
yp,p,K=m.sysid(t,u,y,na,nb,diaglevel=1)
打印(yp)
对于范围内的i(len(t)):
差值=np.abs((yp[i]-y[i])/max(0.01,y[i]))
如果差值大于等于0.2:#如果差值大于20%
yp_new,p_new,K=m.sysid(t,u,y,na,nb,diaglevel=0)
打印('i='+str(i))时重新计算)
打印(yp_新)
plt.图()
plt.子地块(2,1,1)
plt.绘图(t,u)
plt.legend([r'$u_0$',r'$u_1$'))
plt.ylabel('MVs')
plt.子地块(2,1,2)
plt.绘图(t,y)
plt.绘图(t,yp)
plt.绘图(t,y)
plt.绘图(t,yp_新)
plt.show()

您需要将
yp
更新为新的yp值
yp=yp\u new
或者在执行下一个系统标识时返回
yp
。但是,您用于重做
sysid
计算的数据与之前使用的数据相同,因此模型预测没有变化。您是否仅尝试使用最新数据更新时间序列模型,例如
yp_new,p_new,K=m.sysid(t[i:],u[i:],y[i:],na,nb)

该模型当前更新的周期与原始时间序列模型预测不一致

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
如果只包含最新的数据,则仅在周期10、42、46和48重新计算

从gekko导入gekko
作为pd进口熊猫
将matplotlib.pyplot作为plt导入
将numpy作为np导入
#加载数据并解析为列
t=np.linspace(0,1101)
u=np.linspace(0,1101)
y=np.零(len(t))
y[:50]=np.sin(u[:50])
y[50:]=np.exp(u[50:]/500)
#生成时间序列模型
m=GEKKO(远程=False)
#系统识别
na=2#输出系数
nb=2#输入系数
yp,p,K=m.sysid(t,u,y,na,nb)
yp_init=yp.copy()
打印(yp)
j=0
对于范围内的i(len(t)):
差值=np.abs((yp[i-j]-y[i])/max(0.01,y[i]))
如果差值大于等于0.2:#如果差值大于20%
j=i#获取上次更新发生的周期
yp,p,K=m.sysid(t[i:],u[i:],y[i:],na,nb)
打印('i='+str(i))时重新计算)
plt.图()
plt.子地块(2,1,1)
plt.绘图(t,u)
plt.legend([r'$u_0$',r'$u_1$'))
plt.ylabel('MVs')
plt.子地块(2,1,2)
plt.绘图(t,y)
plt.plot(t,yp_init)
plt.绘图(t,y)
plt.plot(t[j:],yp)
plt.show()

我使用ARX模型
m.ARX(p)
sysid
完成后给出更新的预测。系统标识通常不在每个周期使用,仅在需要更新模型时使用。