Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ARX模型是Gekko_Python_Gekko - Fatal编程技术网

Python ARX模型是Gekko

Python ARX模型是Gekko,python,gekko,Python,Gekko,这是这个问题的后续问题: 我想我没有给出足够的细节,我的问题也不是很清楚。 首先,我正在寻找我的系统模型,以便在MPC中使用它,因此识别需要良好,以便从我的MPC中获得良好的结果 这是我用来识别GEKKO系统的代码。我使用了大约5小时的数据,冰箱只由恒温器控制。每隔5秒就有数据从我的传感器传来 用Sysid()标识 打印结果 我用sysid()得到的结果并不好。尽管有这些结果, 我用以下代码模拟了ARX模型。使用我从sysid()获得的p字典 模拟 from gekko import GEKKO

这是这个问题的后续问题:

我想我没有给出足够的细节,我的问题也不是很清楚。 首先,我正在寻找我的系统模型,以便在MPC中使用它,因此识别需要良好,以便从我的MPC中获得良好的结果

这是我用来识别GEKKO系统的代码。我使用了大约5小时的数据,冰箱只由恒温器控制。每隔5秒就有数据从我的传感器传来

用Sysid()标识

打印结果

我用sysid()得到的结果并不好。尽管有这些结果,

我用以下代码模拟了ARX模型。使用我从sysid()获得的p字典

模拟

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的温度下工作。 我的问题是:

  • 我在这里可能做错了什么?我是否使用了足够的数据进行身份验证
  • 为什么在使用线性回归而不是sysid()时,我会得到p的其他系数?(我上一篇文章的代码)
  • sysid()是否像线性回归那样进行
  • 为什么使用线性回归可以获得更好的拟合结果,但绘制模拟时温度变化不大?(参见我上一篇文章中的线性回归模拟图)

  • 提前感谢:)

    您可以发布一个指向您的数据文件的链接吗?快速尝试的两件事是使用比
    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()