【问题标题】:How to estimate theta value in FOPDT equation using gekko?如何使用 gekko 估计 FOPDT 方程中的 theta 值?
【发布时间】:2020-10-20 14:35:46
【问题描述】:

我正在尝试使用 GEKKO 来拟合某个数据集,使用 FOPDT 优化方法来估计 k、tau 和 theta。

我在https://apmonitor.com/pdc/index.php/Main/FirstOrderOptimization 上看到了使用 odeint 的示例,并尝试使用 GEKKO 做同样的事情,但我不能在等式中使用 theta 的值。

我看到了这个问题where should the delay call be placed inside a gekko code? 和文档https://apmonitor.com/wiki/index.php/Apps/TimeDelay,但在这种情况下,我想估计 theta 的值而不是使用初始猜测值。我尝试使用 gekko 的延迟,但我得到一个错误,它仅在延迟是 int 值(而不是 gekko FV)时才有效。 我也尝试在方程式中直接使用时间,但我不知道如何将 x(t-theta) 放入其中,因为我无法使用 gekko 变量执行该语法。

import pandas as pd
import numpy as np
from gekko import GEKKO
import plotly.express as px 

data = pd.read_csv('data.csv',sep=',',header=0,index_col=0)

xm1 = data['x']
ym1 = data['y']
xm = xm1.to_numpy()
ym = ym1.to_numpy()

xm_r = len(xm)
tm = np.linspace(0,xm_r-1,xm_r)

m = GEKKO()
m.options.IMODE=5
m.time = tm

k = m.FV()
k.STATUS=1
tau = m.FV()
tau.STATUS=1
theta = m.FV()
theta.STATUS=1

x = m.Param(value=xm)
y = m.CV()
y.FSTATUS = 1
yObj = m.Param(value=ym)

xtheta = m.Var()
m.delay(x,xtheta,theta)

m.Equation(y.dt()==(-y + k * xtheta)/tau)
m.Minimize((y-yObj)**2)
m.options.EV_TYPE=2

m.solve(disp=True)

【问题讨论】:

    标签: python gekko


    【解决方案1】:

    以下是在模型中实现可变时间延迟的一些策略,例如当优化器调整一阶加死区 (FOPDT) 模型中的时间延迟时。

    • 创建时间t 和输入u 之间关系的三次样条(连续近似)。这允许不限于采样间隔的整数倍的分数时间延迟。
    • 创建 time 作为导数等于 1 的变量。
    • 使用等式tc==time-theta 定义tc 以获得时移值。这将查找与此 tc 值对应的样条线 uc 值。

    您也可以fit the FOPDT model使用Excel或其他工具来获取数据。

    from gekko import GEKKO
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    # load data
    url = 'http://apmonitor.com/do/uploads/Main/tclab_siso_data.txt'
    data = pd.read_csv(url)
    t = data['time'].values
    u = data['voltage'].values
    y = data['temperature'].values
    
    m = GEKKO(remote=False)
    m.time = t; time = m.Var(0); m.Equation(time.dt()==1)
    
    K = m.FV(lb=0,ub=1);      K.STATUS=1
    tau = m.FV(lb=1,ub=300);  tau.STATUS=1
    theta = m.FV(lb=2,ub=30); theta.STATUS=1
    
    # create cubic spline with t versus u
    uc = m.Var(u); tc = m.Var(t); m.Equation(tc==time-theta)
    m.cspline(tc,uc,t,u,bound_x=False)
    
    ym = m.Param(y)
    yp = m.Var(y); m.Equation(tau*yp.dt()+(yp-y[0])==K*(uc-u[0]))
    
    m.Minimize((yp-ym)**2)
    
    m.options.IMODE=5
    m.solve()
    
    print('K: ', K.value[0])
    print('tau: ',  tau.value[0])
    print('theta: ', theta.value[0])
    
    plt.figure()
    plt.subplot(2,1,1)
    plt.plot(t,u)
    plt.legend([r'$V_1$ (mV)'])
    plt.ylabel('MV Voltage (mV)')
    plt.subplot(2,1,2)
    plt.plot(t,y)
    plt.plot(t,yp)
    plt.legend([r'$T_{1meas}$',r'$T_{1pred}$'])
    plt.ylabel('CV Temp (degF)')
    plt.xlabel('Time')
    plt.savefig('sysid.png')
    plt.show()
    
    K:  0.25489655932
    tau:  229.06377617
    theta:  2.0
    

    解决此问题的另一种方法是估计higher-order ARX model,然后确定beta 项的统计显着性。这是使用 Gekko sysid 函数的示例。

    from gekko import GEKKO
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    # load data and parse into columns
    url = 'http://apmonitor.com/do/uploads/Main/tclab_siso_data.txt'
    data = pd.read_csv(url)
    t = data['time']
    u = data['voltage']
    y = data['temperature']
    
    # generate time-series model
    m = GEKKO()
    
    # system identification
    na = 5 # output coefficients
    nb = 5 # input coefficients
    yp,p,K = m.sysid(t,u,y,na,nb,pred='meas')
    
    print('alpha: ', p['a'])
    print('beta: ',  p['b'])
    print('gamma: ', p['c'])
    
    plt.figure()
    plt.subplot(2,1,1)
    plt.plot(t,u)
    plt.legend([r'$V_1$ (mV)'])
    plt.ylabel('MV Voltage (mV)')
    plt.subplot(2,1,2)
    plt.plot(t,y)
    plt.plot(t,yp)
    plt.legend([r'$T_{1meas}$',r'$T_{1pred}$'])
    plt.ylabel('CV Temp (degF)')
    plt.xlabel('Time')
    plt.savefig('sysid.png')
    plt.show()
    

    有结果:

    alpha:  [[0.525143  ]
     [0.19284469]
     [0.08177381]
     [0.06152181]
     [0.12918898]]
    beta:  [[[-8.51804876e-05]
      [ 5.88425202e-04]
      [ 1.99205676e-03]
      [-2.81456773e-03]
      [ 2.38110003e-03]]]
    gamma:  [0.75189199]
    

    前两个beta 项几乎为零,但它们也可以保留在模型中,用于系统的高阶表示。

    【讨论】:

    • 在答案的 theta 部分的 Gekko 参数估计中,为什么方程中有 (yp-y[0]) 和 (uc-u[0]) 而只有 yp 和 uc?
    • 需要偏差变量来避免yp = up在稳态时的解。它是一个非零截距,例如 yp = up + c,但采用偏差变量形式,其中 u[0] 和 y[0] 是稳态条件或另一个“起点”。
    • 明白。为什么方程有 d(yp)/dt 而不是 d(yp-y[0])/dt?我知道如果 y[0] 实际上处于稳态,则 d(yp-y[0])/dt 将等于 d(yp)/dt,但是如果系统在时间 0 处不处于稳态,那么如何被纳入? tau*(yp.dt-y0.dt) 可以工作吗(使用 y0=m.Var(y[0])?如果我应该问一个新问题,请告诉我。
    • y[0] 是一个常数,所以 dy[0]/dt=0 并且该术语取消了。这里有更多信息:apmonitor.com/pdc/index.php/Main/ModelLinearization
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2018-11-13
    • 2021-09-14
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多