Python ARX模型是Gekko
这是这个问题的后续问题: 我想我没有给出足够的细节,我的问题也不是很清楚。 首先,我正在寻找我的系统模型,以便在MPC中使用它,因此识别需要良好,以便从我的MPC中获得良好的结果 这是我用来识别GEKKO系统的代码。我使用了大约5小时的数据,冰箱只由恒温器控制。每隔5秒就有数据从我的传感器传来 用Sysid()标识 打印结果 我用sysid()得到的结果并不好。尽管有这些结果, 我用以下代码模拟了ARX模型。使用我从sysid()获得的p字典 模拟Python ARX模型是Gekko,python,gekko,Python,Gekko,这是这个问题的后续问题: 我想我没有给出足够的细节,我的问题也不是很清楚。 首先,我正在寻找我的系统模型,以便在MPC中使用它,因此识别需要良好,以便从我的MPC中获得良好的结果 这是我用来识别GEKKO系统的代码。我使用了大约5小时的数据,冰箱只由恒温器控制。每隔5秒就有数据从我的传感器传来 用Sysid()标识 打印结果 我用sysid()得到的结果并不好。尽管有这些结果, 我用以下代码模拟了ARX模型。使用我从sysid()获得的p字典 模拟 from gekko import GEKKO
from gekko import GEKKO
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
na = 1# Number of A coefficients
nb = 1 # Number of B coefficients
ny = 1 # Number of outputs
nu = 1 # Number of inputs
# A (na x ny)
# actual A,B,C values are from 5 h data
A = np.array([[1.00037807]])
# B (ny x (nb x nu))
B= np.array([[[-0.01318095]]])
C = np.array([-0.00162522])
# create parameter dictionary
# parameter dictionary p['a'], p['b'], p['c']
# a (coefficients for a polynomial, na x ny)
# b (coefficients for b polynomial, ny x (nb x nu))
# c (coefficients for output bias, ny)
p = {'a':A,'b':B,'c':C}
m = GEKKO(remote=True)
y,u = m.arx(p)
# load inputs
#tf = 719 # final time
u1 = np.append(np.ones(500),np.zeros(500),0)
u2 = np.append(u1, np.ones(500),0)
u3 = np.append(u2, np.zeros(500),0)
u4 = np.append(u3, np.ones(500),0)
u5 = np.append(u4, np.zeros(936),0)
u[0].value = u5
cv = y[0]
mv= u[0]
cv.value = 14.2
m.time = np.linspace(0,17180,3436)
m.options.imode = 4
m.options.nodes= 2
#m.options.SOLVER = 1
# simulate
m.solve()
模拟结果:
温度的变化是不合逻辑的。最后,冰箱关闭,温度继续下降。我的冰箱也不够强大,不能在零下5°C的温度下工作。
我的问题是:
提前感谢:)您可以发布一个指向您的数据文件的链接吗?快速尝试的两件事是使用比
na=1
和nb=1
(可能是2-5)更高阶的时间序列,并使用shift='mean'
。我想你有足够的资料来证明身份。sysid()使用的输出错误形式不同于线性回归-这是一种非线性回归,因为y[k-1]和回归系数都是计算出来的,从而产生双线性项。线性回归拟合结果似乎很好,因为您正在查看y[k]=a*ymeas[k-1]+b*u[k-1]
,并且y[k]
将始终接近ymeas[k-1]
。可能使用一些生成的锯齿数据?
from gekko import GEKKO
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
na = 1# Number of A coefficients
nb = 1 # Number of B coefficients
ny = 1 # Number of outputs
nu = 1 # Number of inputs
# A (na x ny)
# actual A,B,C values are from 5 h data
A = np.array([[1.00037807]])
# B (ny x (nb x nu))
B= np.array([[[-0.01318095]]])
C = np.array([-0.00162522])
# create parameter dictionary
# parameter dictionary p['a'], p['b'], p['c']
# a (coefficients for a polynomial, na x ny)
# b (coefficients for b polynomial, ny x (nb x nu))
# c (coefficients for output bias, ny)
p = {'a':A,'b':B,'c':C}
m = GEKKO(remote=True)
y,u = m.arx(p)
# load inputs
#tf = 719 # final time
u1 = np.append(np.ones(500),np.zeros(500),0)
u2 = np.append(u1, np.ones(500),0)
u3 = np.append(u2, np.zeros(500),0)
u4 = np.append(u3, np.ones(500),0)
u5 = np.append(u4, np.zeros(936),0)
u[0].value = u5
cv = y[0]
mv= u[0]
cv.value = 14.2
m.time = np.linspace(0,17180,3436)
m.options.imode = 4
m.options.nodes= 2
#m.options.SOLVER = 1
# simulate
m.solve()