如何使用gekko估计FOPDT方程中的theta值?

2023-12-04

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

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

我看到这个问题延迟调用应该放在 gekko 代码中的什么位置?和文档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)

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

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

FOPDT optimization

你也可以拟合 FOPDT 模型使用 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

解决这个问题的另一种方法是估计高阶ARX模型然后确定统计显着性beta条款。这是使用 Gekko 的示例sysid功能。

System Identification

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项几乎为零,但也可以将它们保留在模型中以获得系统的高阶表示。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用gekko估计FOPDT方程中的theta值? 的相关文章

  • 检测骰子的上侧

    是否可以检测骰子的上面 虽然从顶部看这将是一项简单的任务 但从许多角度来看 可以看到多个侧面 Here is an example of a dice feel free to take your own pictures 您通常想知道自己
  • 漂亮的地图打印机会抛出类型错误

    我已经使用配置了漂亮的打印机http wiki eclipse org CDT User FAQ How can I inspect the contents of STL containers 3F http wiki eclipse o
  • Python 函数句柄 ala Matlab

    在 MATLAB 中可以创建function handles http www mathworks co uk help techdoc ref function handle html与类似的东西 myfun arglist body 这
  • 如何仅选择数组中的第一列并对其求和?

    这是我的代码 import numpy as np contrainte1 1080 0 65 minutes tous les jours contrainte2 720 0 55 minutes du lundi au vendredi
  • Pandas 在列级别连接数据帧时添加键

    根据 Pandas 0 19 2 文档 我可以提供keys参数来创建结果多索引 DataFrame 一个例子 来自 pandas 文档 是 result pd concat frames keys x y z 我将如何连接数据框以便我可以在
  • 从 Django 基于类的视图的 form_valid 方法调用特殊(非 HTTP)URL

    如果你这样做的话 有一个 HTML 技巧 a href New SMS Message a 点击新短信打开手机的本机短信应用程序并预 先填写To包含所提供号码的字段 在本例中为 1 408 555 1212 以及body与提供的消息 Hel
  • 如何使用 python http.server 运行 CGI“hello world”

    我使用的是 Windows 7 和 Python 3 4 3 我想在浏览器中运行这个简单的 helloworld py 文件 print Content Type text html print print print print h2 H
  • Django 说“id 可能不为 NULL”,但为什么会这样呢?

    我今天要疯了 我只是尝试插入一条新记录 但它返回了 post blogpost id 可能不为 NULL 错误 这是我的模型 class BlogPost models Model title models CharField max le
  • 从 Spark 数据帧中过滤大量 ID

    我有一个大型数据框 其格式类似于 ID Cat date 12 A 201602 14 B 201601 19 A 201608 12 F 201605 11 G 201603 我需要根据大约 500 万个 Is 的列表来过滤行 最直接的方
  • 如何在每次运行 python 程序时添加新列

    我希望我的表的第一列作为卷号 第二列作为名称 每当我运行 python 程序时 我想在表中添加一列日期 在这个新列中 我想填充从 user list 获得的列表将包含值 P A P P 等 如何处理 我尝试首先通过 alter 命令添加一列
  • Python 在 64 位 vista 上获取 os.environ["ProgramFiles"] 的错误值

    Vista64 计算机上的 Python 2 4 3 环境中有以下2个变量 ProgramFiles C Program Files ProgramFiles x86 C Program Files x86 但是当我运行以下命令时 impo
  • Python Tkinter 网格复选框

    我想知道是否有一种简单的方法可以使用 Tkinter 创建复选框网格 我正在尝试制作一个由 10 行和 10 列 即 100 个复选框 组成的网格 以便每行只能选择两个复选框 编辑 我正在使用带有spyder的python 2 7 到目前为
  • 安塞布尔 + 10.11.6

    我在 非常 干净地安装 10 11 6 时遇到了 Ansible 的奇怪问题 我已经安装了brew zsh oh my zsh Lil snitch 和1password 实际上没有安装其他任何东西 我安装了ansible brew ins
  • 使用 conda 安装额外功能

    With pip我们可以使用方括号安装子包 例如与阿帕奇气流 https pythonhosted org airflow installation html pip install airflow all 有类似的东西吗conda或者我必
  • 在 matplotlib 中将 3D 背景更改为黑色

    我在将 3D 图表的背景更改为黑色时遇到问题 这是我当前的代码 当我将facecolor设置为黑色时 它会将图表内部更改为灰色 这不是我想要的 fig plt figure fig set size inches 10 10 ax plt
  • Django INSTALLED_APPS 的命名约定是如何工作的?

    该网站上的教程创建了一个名为 polls 的应用程序 它使用 django 1 9 所以在 INSTALLED APPS 中它是 polls apps PollsConfig 我正在观看一个教程 他将应用程序命名为新闻通讯 并且在 INST
  • 如何输入可变的默认参数

    Python 中处理可变默认参数的方法是将它们设置为无 https stackoverflow com a 366430 5049813 例如 def foo bar None bar if bar is None else bar ret
  • Matplotlib:检查空图

    我有一个循环加载并绘制一些数据 如下所示 import os import numpy as np import matplotlib pyplot as plt for filename in filenames plt figure i
  • 如何正确将 tflite_graph.pb 转换为 detector.tflite

    我正在使用tensorflow对象检测API使用tensorflow中的ssdlite mobilenet v2 coco 2018 05 09来训练自定义模型模型动物园 https github com tensorflow models
  • 如何从Python枚举类中获取所有值?

    我正在使用 Enum4 库创建一个枚举类 如下所示 class Color Enum RED 1 BLUE 2 我要打印 1 2 作为某处的列表 我怎样才能实现这个目标 您可以执行以下操作 e value for e in Color

随机推荐

  • Snow Leopard 新的“突然终止”机制有缺点吗?

    Snow Leopard 有一项我从未听说过的新技术 突然终止 见突然终止 in 这个苹果文档 显然是一种告诉系统何时可以残酷地杀死您的应用程序的机制 而不是通过标准的退出机制 这应该有助于更快地注销 断电 休眠 首先 我不知道它 没有看到
  • WP7 / Silverlight]在列表框中绑定远程图像,这样UI就不会阻塞

    场景 Windows Phone 7 Silverlight 我有一个 ListBox 我将其简化为以下 XAML
  • Swift:使用 UISearchController/Predicates 过滤结构数组

    想知道是否有人可以帮助我在 Swift 中使用谓词进行过滤 我有一个有点混乱的数据源 我用它来填充 UITableView 数据源是一个结构体数组 该结构体定义如下 struct Exercises let category String
  • Azure 搜索突出显示带双引号的短语

    我们有一个天蓝色的Web应用程序 其中有一个搜索框 当我们输入带双引号的文本 例如 应用程序服务 时 它会正确列出带有 应 用程序服务 的记录 但它不仅突出显示 应用程序服务 而且还突出显示 应用程序服务 以及 服务 如果单独找到它们 可以
  • Docker 容器(不是 Docker 镜像)可以移动吗?

    我在以下网站上找到了此信息Docker 网站 Docker 容器可以运行 启动 停止 移动和删除 据我所知 Docker Images 可以移动 而 Docker Containers 则不能 但上面的信息明显位于 Docker 容器 标题
  • 错误的欧几里得距离 H2O 计算 R

    我使用 H2O 和 R 来计算 2 个 data frames 之间的欧几里德距离 set seed 121 create the data df1 lt data frame matrix rnorm 1000 ncol 10 df2 l
  • before_create 仍然保存

    在一切之前我要感谢你的帮助 我有一个这样的模型 attr protected nil belongs to product belongs to user before create add ammount def carted produ
  • 对于嵌入式应用程序从 std::string 切换到 std::wstring?

    到目前为止 我一直在嵌入式系统 路由器 交换机 电信设备等 的 C 应用程序中使用 std string 对于下一个项目 我正在考虑从 std string 切换到 std wstring 以支持 Unicode 例如 这将允许最终用户在命
  • 使用 vbscript 隐藏打开指定 url 和指定浏览器的链接

    我想转换这个批处理命令 start msedge exe new window https www google com 到 vbscript 文件 这样我就可以隐藏地打开它 我试过这个 Set WshShell WScript Creat
  • Pdf 的字段应在 asp.net 中使用 itextsharp 保持可编辑状态

    我有一个可填写的pdf 其中我有几个文本框 我使用以下代码 itextsharp 填充这些字段 DataTable dt new DataTable String pdfPath1 Server MapPath pdfs transmitt
  • 大文字显得模糊

    我正在使用 SFML 1 6 制作一个小游戏 我需要显示一些文本 所以我使用sf String班级 问题是 当我将尺寸增加到 96pt 时 边缘显得有点模糊 不过 当我增加 Microsoft Word 中的文本大小时 它看起来非常干净并且
  • 如何用Python四舍五入到小数点后两位? [复制]

    这个问题在这里已经有答案了 我在这段代码的输出中得到了很多小数 华氏度到摄氏度转换器 我的代码目前如下所示 def main printC formeln typeHere def typeHere global Fahrenheit tr
  • 使用 bash 脚本将密钥代码发送到 Xorg + wine

    如何将密钥代码发送到在 wine 下运行的 linux 中当前运行的应用程序 为了简单起见 我希望它位于 bash 下 使用名为xvkbd 它应该存在于每个 Linux 发行版中 语法很简单 xvkbd text line of keyco
  • CGAffineTransform 连接:适当的转换顺序

    我知道 每当我们想要对一个点同时应用一系列变换时 我们必须指定与我们想要感知的相反方向的序列 如果我想翻译 T 然后旋转 R 一个点x我们需要以串联矩阵结束RT 那么每个点都变换为 RT x 苹果转型文档显示 CGAffineTransfo
  • gnuplot:在for循环中设置线条样式

    我必须在同一张图上绘制几条曲线 我必须使用 for 循环来做到这一点 我想用线绘制前两条曲线 用点绘制其他曲线 我可以用线绘制所有曲线或用点绘制所有曲线 但不能在同一个 for 循环中进行更改 这是我的代码的相关部分 set style l
  • 停止后台工作者

    我的应用程序使用后台工作人员在循环内执行一些工作 我拥有它 以便在每次循环迭代时 它检查取消挂起是否为真 如果是 则中断循环 一切正常 我的应用程序在完成循环的当前迭代后停止处理 问题是我认为后台工作人员仍在运行 如果我单击按钮再次开始处理
  • 在 Hibernate 中持久化 LinkedList

    我试图保留一个具有 LinkedList 属性的类 但似乎无法正确执行 这是我的代码和映射 import java util LinkedList public class Stuff implements java io Serializ
  • 强制刷新到 Observable.Buffer c#

    有没有办法强制 Observable Buffer 在缓冲时间结束之前刷新 在示例中 mSubscription mFluxObservable Buffer new TimeSpan 0 0 1 30 Subscribe o gt sav
  • App Store (iTunes Connect) 的 512x512 图像,Apple 会像在手机上那样进行圆角处理吗?

    将 iPhone 应用程序提交到 iTunes Connect 进行 AppStore 分发后 他们会要求提供 512x512 像素的图像 以下是提交位置旁边的内容 将在 App Store 上使用的应用程序图标的大版本 它必须至少为 72
  • 如何使用gekko估计FOPDT方程中的theta值?

    我正在尝试使用 GEKKO 来拟合某个数据集 使用 FOPDT 优化方法来估计 k tau 和 theta 我看到了使用 odeint 的示例https apmonitor com pdc index php Main FirstOrder