我试图用GEKKO来拟合某个数据集,用FOPDT优化方法来估计k,tau和θ
我在https://apmonitor.com/pdc/index.php/Main/FirstOrderOptimization上看到了使用odeint的例子,并尝试对GEKKO做同样的事情,但我不能在方程中使用θ的值
我看到了这个问题{a2}和文档{a3},但在这个例子中,我想估计θ的值,而不是使用初始猜测值。我尝试使用gekko的延迟,但我得到一个错误,即只有当延迟是int值(而不是gekko FV)时,它才起作用。 我也试着在方程中直接使用时间,但我不知道如何将x(tθ)放在那里,因为我不能用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)
下面是一些在模型中实现可变时延的策略,例如优化器在一阶加死时间(FOPDT)模型中调整时延时
t
和输入u
之间关系的三次样条曲线(连续近似)。这允许不限于采样间隔整数倍的分数延时李>time
创建为导数等于1的变量李>tc==time-theta
定义tc
以获得时移值。这将查找与此tc
值对应的样条曲线uc
值李>您还可以使用Excel或其他工具fit the FOPDT model转换数据
另一种方法是估计higher-order ARX model,然后确定
beta
项的统计显著性。下面是一个使用Gekkosysid
函数的示例结果如下:
前两个
beta
项几乎为零,但它们也可以留在模型中,用于系统的高阶表示相关问题 更多 >
编程相关推荐