GEKKO RTO 与 MPC 模式

2024-01-06

这是一个由此衍生的问题one https://stackoverflow.com/questions/60761440/variable-bounds-in-mpc-with-gekko。在发布我的问题后,我找到了一个解决方案(更像是强制优化器优化的补丁)。有件事让我困惑。约翰·赫登格伦 https://stackoverflow.com/users/2366941/john-hedengren正确地指出ab=1.0在 ODE 中会导致不可行的解决方案IMODE=6。然而,在我的零散工作中IMODE=3我确实得到了解决方案。

我试图了解这里发生的事情阅读GEKKO's https://gekko.readthedocs.io/en/latest/imode.html的文档IMODE=3 and 6但我不清楚

IMODE=3

RTO 实时优化 (RTO) 是一种稳态模式,允许 决策变量(STATUS=1 的 FV 或 MV 类型)或其他 变量超过方程的数量。目标函数 指导附加变量的选择以选择最优的 可行的解决方案。 RTO 是 Gekko 的默认模式,如果 未指定 m.options.IMODE。

IMODE=6

MPC 模型预测控制 (MPC) 是通过 IMODE=6 实现的 同时解决方案或使用 IMODE=9 作为连续拍摄方法。

为什么b=1。在一种模式下有效但在另一种模式下无效?

这是我的零碎工作IMODE=3 and b=1.0:

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt

m = GEKKO(remote=False)
m.time = np.linspace(0,23,24)

#initialize variables
T_e = [50.,50.,50.,50.,45.,45.,45.,60.,60.,63.,\
       64.,45.,45.,50.,52.,53.,53.,54.,54.,53.,52.,51.,50.,45.]
temp_low = [55.,55.,55.,55.,55.,55.,55.,68.,68.,68.,68.,55.,55.,68.,\
            68.,68.,68.,55.,55.,55.,55.,55.,55.,55.]
temp_upper = [75.,75.,75.,75.,75.,75.,75.,70.,70.,70.,70.,75.,75.,\
              70.,70.,70.,70.,75.,75.,75.,75.,75.,75.,75.]
TOU = [0.05,0.05,0.05,0.05,0.05,0.05,0.05,200.,200.,\
       200.,200.,200.,200.,200.,200.,200.,200.,200.,\
       200.,200.,200.,0.05,0.05,0.05]

b = m.Param(value=1.)
k = m.Param(value=0.05)

u = [m.MV(0.,lb=0.,ub=1.) for i in range(24)]

# Controlled Variable
T = [m.SV(60.,lb=temp_low[i],ub=temp_upper[i]) for i in range(24)]

for i in range(24):
    u[i].STATUS = 1

for i in range(23):
    m.Equation( T[i+1]-T[i]-k*(T_e[i]-T[i])-b*u[i]==0.0 )

m.Obj(np.dot(TOU,u))

m.options.IMODE = 3
m.solve(debug=True)
myu =[u[0:][i][0] for i in range(24)]
print myu
myt =[T[0:][i][0] for i in range(24)]
plt.plot(myt)
plt.plot(temp_low)
plt.plot(temp_upper)
plt.show()
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(myu,color='b')
ax2.plot(TOU,color='k')
plt.show()

Results:


不可行与不可行的区别IMODE=6以及可行的IMODE=3那是IMODE=3case 允许优化器调整温度初始条件。优化器认识到初始条件可以更改,因此将其修改为 75,以保持可行并最大限度地减少未来的能耗。

from gekko import GEKKO
import numpy as np

m = GEKKO(remote=False)
m.time = np.linspace(0,23,24)

#initialize variables
T_external = [50.,50.,50.,50.,45.,45.,45.,60.,60.,63.,\
              64.,45.,45.,50.,52.,53.,53.,54.,54.,\
              53.,52.,51.,50.,45.]
temp_low = [55.,55.,55.,55.,55.,55.,55.,68.,68.,68.,68.,\
            55.,55.,68.,68.,68.,68.,55.,55.,55.,55.,55.,55.,55.]
temp_upper = [75.,75.,75.,75.,75.,75.,75.,70.,70.,70.,70.,75.,\
              75.,70.,70.,70.,70.,75.,75.,75.,75.,75.,75.,75.]
TOU_v = [0.05,0.05,0.05,0.05,0.05,0.05,0.05,200.,200.,200.,200.,\
         200.,200.,200.,200.,200.,200.,200.,200.,200.,200.,0.05,\
         0.05,0.05]

b = m.Param(value=1.)
k = m.Param(value=0.05)
T_e = m.Param(value=T_external)
TL = m.Param(value=temp_low)
TH = m.Param(value=temp_upper)
TOU = m.Param(value=TOU_v)

u = m.MV(lb=0, ub=1)
u.STATUS = 1  # allow optimizer to change

# Controlled Variable
T = m.SV(value=75)

m.Equations([T>=TL,T<=TH])
m.Equation(T.dt() == k*(T_e-T) + b*u)

m.Minimize(TOU*u)

m.options.IMODE = 6
m.solve(disp=True,debug=True)

import matplotlib.pyplot as plt
plt.subplot(2,1,1)
plt.plot(m.time,temp_low,'k--')
plt.plot(m.time,temp_upper,'k--')
plt.plot(m.time,T.value,'r-')
plt.ylabel('Temperature')
plt.subplot(2,1,2)
plt.step(m.time,u.value,'b:')
plt.ylabel('Heater')
plt.xlabel('Time (hr)')
plt.show()

如果你再去一天(48 小时),你可能会发现这个问题最终将不可行,因为较小的加热器b=1无法满足温度较低的限制。

使用的优点之一IMODE=6是你可以写出微分方程,而不是自己进行离散化。和IMODE=3,您可以使用欧拉方法来求解微分方程。默认离散化为IMODE>=4 is NODES=2,相当于欧拉有限差分法。环境NODES=3-6提高准确度有限元正交配置 https://apmonitor.com/do/index.php/Main/OrthogonalCollocation.

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

GEKKO RTO 与 MPC 模式 的相关文章

  • Gekko 的最佳解决方案

    我想使用 hyperopt 进行超参数优化 但在找到超参数搜索空间的正确公式时遇到问题 我的问题的最佳解决方案是 0 4050 2100 2100 1200 0 0 450 150 我的尝试代码 from gekko import GEKK
  • GEKKO 的轨迹规划器无法处理给定的目标速度

    我已经为 GEKKO 的车辆设置了轨迹规划器 所以基本上我使用了非线性的运动学单轨模型 一切正常 直到我到达零件 当我给出不等于 0 的目标速度时 我可以毫无问题地给出所有其他目标状态 x 位置 y 位置 转向角和偏航角 但是如果我给出目标
  • 控制范围和预测范围

    我已经回顾了模型预测控制的参考书目和 Gekko 编程结构 尽管我了解它的编程方式及其目的 例如 我想了解 Gekko 如何根据 Seborg 中的相关内容来管理控制范围和预测范围之间的差异 我看不出代码有什么区别 下面是一个用于说明的 M
  • 使用 gekko 进行 Python 优化

    我第一次使用 gekko 来对 python 进行优化 我对 python 没有太多经验 但我知道基础知识 运行优化时出现错误代码 13 import Gekko optimization package from gekko import
  • 关于 GEKKO 中条件语句('m.if3')的问题

    我想在 GEKKO 代码中添加一些条件语句 我用 m if3 添加了以下语句 但是 它返回了语法错误 如果没有条件语句 我就不会出现这种错误 R1 1 m if3 R1 GEKKO m GEKKO remote False print m
  • SCIPY - 构建约束而不单独列出每个变量

    我正在使用 SCIPY 来优化使用远期价格的存储设施 交易期限为 1 年 根据每月价差 例如 3 月 21 日与 5 月 20 日价差 是否足够高以覆盖可变运营成本 可以从该设施注入和提取天然气 附图代表了问题 这里的值是任意的 与代码中的
  • Gekko 返回错误的成功解决方案

    以下代码返回Successful Solution Objective 0 但这不是最佳解决方案 最优解是 6 通过阅读其他问题 我认为这是在目标函数中使用非 Gekko 函数的问题 但我使用的唯一非 Gekko 函数是np matmul
  • 如何避免在 GEKKO 中创建许多二进制切换变量

    我通过最小化数千个方程来求解 14 个变量IMODE 3 in GEKKO 每个方程都是真实响应与 P 样条模型预测之间的平方误差 i e 惩罚 B 样条 eq i m Minimize y true i spline coeffs kno
  • GEKKO RTO 与 MPC 模式

    这是一个由此衍生的问题one https stackoverflow com questions 60761440 variable bounds in mpc with gekko 在发布我的问题后 我找到了一个解决方案 更像是强制优化器
  • 访问目标函数 Gekko 外部函数中的决策变量值

    我需要访问目标函数之外的决策变量 我有以下内容 tc var for index in index f a tc var index m Var value 25 name tc var format index lb 15 ub 45 i
  • 从 Schittkowski DAE 测试套件中求解 PENDULUM2?

    我只是试图解决 Schittkowski DAE 测试套件中的 DAE 问题之一 http klaus schittkowski de mc dae htm http klaus schittkowski de mc dae htm 但没有
  • GEKKO - 使用自定义目标函数进行参数估计 - 错误代码 -13

    我已经使用 Gekko 教程 线性和非线性回归 中介绍的相同技术成功地执行了稳态参数估计 下面是代码 coding utf 8 Spyder Editor This is a temporary script file from io im
  • 如何在 python Gekko 中加速具有 1446 个变量的整数非线性规划?

    我正在解决一个整数非线性编程问题与蟒蛇壁虎 其中有 1446 个整数变量 31 个变量线性组合的约束以及 1 个要最大化的非线性目标 该程序需要很长时间 我想知道是否可以speed up 以及如何更好地调整m solver options
  • 使用 Python Gekko 的全局最小值与局部最小值解决方案

    一个简单的优化示例有 2 个局部最小值 0 0 8 有目标的936 0 and 7 0 0 有目标的951 0 在 Python Gekko 中使用本地优化器的技术有哪些 APOPT BPOPT IPOPT 寻找全局解决方案 from ge
  • 自由终端时间、积分目标和微分方程作为约束

    我正在尝试解决一个最优控制问题 该问题涉及最小化具有固定状态但自由终端时间的积分目标 这是一个相对简单的问题 可以通过解析来解决 Gekko 的解决方案与解析不符 我不确定我做错了什么 我遵循了几个 Gekko 示例来解决这个问题 任何帮助
  • 我可以在 Gekko 的设计优化过程中使用隐式目标函数吗?这个隐式函数是一个创建数值模型的子程序

    我正在使用 Abaqus 进行抗震结构系统设计的优化 我打算使用 Gekko 来达到这个目的 但似乎我在写下有关此任务的合适语法时犯了错误 Objective 是负责创建Abaqus数值模型 分析模型 处理结果和计算罚函数的子程序的名称 目
  • 如何在 GEKKO 中实现 OR 约束

    我有一个优化问题 我必须找到给定电机的最低成本 并且存在一个限制 即电机要么运行 要么不运行 但如果它运行的话 它必须达到其功率范围的下限 我将包含我的代码 以展示我所尝试的内容 from gekko import GEKKO power
  • Python gekko 方程定义中的换行符

    我目前正在手动实现有限元的伽辽金法 并使用 python gekko 来求解所得的非线性代数方程组 这对于小型系统来说不会产生任何问题并且工作正常 一旦系统变得更加复杂 涉及长方程和指数项m exp 对于求解器来说 方程可能不再具有正确的格
  • 使用 GEKKO 的 MPC 中的变量范围

    我正在尝试使用 MPC 和 GEKKO 实现恒温器控制 状态变量 温度 应在预先指定的温度下限和上限范围内 temp low and temp upper在下面的代码中 两者的界限每天都会变化 每小时一个值 目标函数是使用供暖的成本 价格也
  • Gekko优化包和numpy反函数

    我使用 Gekko 为一组反应动力学选择 A 最优实验 目标函数是最小化迹 inv Z Z 其中 Z 是通过将其参数周围的 ODE 线性化而计算出的尺度灵敏度矩阵 正如您所看到的 目标函数涉及 Z Z 的倒数 我使用了 numpy 甚至 s

随机推荐

  • 如何测量 scons 构建的每个组件的构建时间?

    我有一个使用 scons 构建的大型 C 项目 它的构建速度很慢 我想进行一些更改以使其构建速度更快 现在我想集中时间加速构建中最慢的部分 如何找出哪些文件的编译时间最长 我知道这个问题很旧 并且已经被接受 但最近从另一个问题中引用了它 我
  • 内联对齐 3 个 div

    我正在尝试将 3 个 div 彼此内联对齐 i have header width 100 height 160px 作为主容器 因此容器适合页面的宽度 100 then header left width 33 display inlin
  • 在SSIS数据流中动态创建表

    如何让 SSIS 数据流创建一个不存在的表 每次我尝试运行该包时 都会出现错误 指出目标表不存在 由于您希望包创建一个表然后填充它 因此您可以使用以下命令创建一个表 Execute SQL任务 只需为其提供创建表的脚本即可 如果您无法选择使
  • 检查Python中的整数溢出

    class Solution object def reverse self x type x int rtype int negative False if x lt 0 x x 1 negative True else x x sum
  • T --> IHandler 之间的映射

    我有以下界面 public interface IHandler
  • 如何获取管道另一端的pid?

    我想知道管道另一端的pid 如果是 Linux 我可以匹配 idls l proc SELF PID fd 0就像这些命令一样 root host command1 command2 I ve known command2 s PID 59
  • 如何删除 django 中的数据库表?

    我改变了模型并进行了迁移 然后我又更改了一次模型 当尝试 python manage py migrate 时出现错误 Operations to perform Apply all migrations admin auth conten
  • 404 - 请求的资源不可用。 (Spring-MVC)

    我对 Spring MVC 视图解析器不太熟悉 我试图从我的控制器返回一个 JSP 我的控制器方法正在正确执行 但是当返回视图时 我得到404 The requested resource is not available error 这是
  • Javascript / Nodejs 在 Nodejs 模块的顶层使用等待

    我尝试找到问题的解决方案 但找不到它 并且正在寻找一些 最佳实践示例 我有一个 Nodejs Express 应用程序 我的函数被分割在文件中 例如我有这个控制器 oktacontroller js var okta api key
  • IE 和 Firefox 中的按钮大小不相等

    我的 jsp 页面上有几个按钮 我使用的样式为 buttonblue background color 003366 border color 99CCFF color FFFFFF font family Verdana Arial He
  • 对如何处理 CORS OPTIONS 预检请求感到困惑

    我是跨源资源共享的新手 并试图让我的网络应用程序响应 CORS 请求 我的 web 应用程序是在 Tomcat 7 0 42 上运行的 Spring 3 2 应用程序 在我的 web 应用程序的 web xml 中 我启用了 Tomcat
  • IISExpress 8 无法读取配置文件redirection.config

    我正在使用 IISExpress8 运行 Windows Server 2008 R2 x64 当导航到 c Program Files x86 IIS Express gt iisexpress exe it says 文件名 重定向 c
  • Rails Chartkick:只需要轴上的整数值。使用离散的还是其他的?

    假设我有以下代码 使用 Chartkick 这会产生以下图表 我希望使用整数来标记垂直轴 不是小数 我认为discrete选项应该这样做 但对于这个例子 它所做的只是将水平轴上元素的格式从时间更改为数字 即以下代码 产生这个 所以我的问题是
  • 使用 TOR 运行 python 脚本

    大家好 首先我想确保有类似的主题 但没有公认的答案或明确的回应 所以我想把它们结合起来再问一遍 我有以下脚本 import urllib2 proxy urllib2 ProxyHandler http 127 0 0 1 9050 ope
  • 我想使用PHP的PDO将数据插入mysql数据库。但数据没有插入

    我想使用PHP的PDO将数据插入mysql数据库 但数据没有插入 我以前使用过PDO 但没有遇到任何问题 但在下面的例子中 我不明白我哪里做错了 谁能帮帮我吗 输出显示良好 有回声
  • 如何在 R 中为 Quantstrat 编写自定义规则函数 - 将追踪止损订单替换为 stoplimit 和ruleOrderProc

    我的目标是使用下面概述的规则来生成信号来放置新的 stoplimit 订单来取代我的追踪止损 我不希望我的止损无限期地跟踪 直到它达到我的盈亏平衡价格 如果已经可以以某种方式实现这一点 请告诉我 我希望在 quantstrat 中编写一个自
  • 如何通过短信或彩信将超链接发送到手机

    我一直在寻找一种方法 通过短信或彩信将具有不同外观的 URL 的超链接发送到手机 我能想到的唯一例子如下 url http www google co uk Click Here url 所以上面的代码会显示 点击这里 当您单击 单击此处
  • 如何使用 JSON-simple (Java) 判断返回是 JSONObject 还是 JSONArray?

    我正在访问一项服务 有时会得到这样的结果 param1 value1 param2 value2 有时会得到这样的回报 param1 value1 param2 value2 param1 value1 param2 value2 我如何知
  • 无法在 Gerrit 中合并

    每当我向 Gerrit 发送评论并且该评论等待一段时间时 我都会收到cannot mergeGerrit 中的消息 我理解它的到来 因为其他人会更改相同的文件并在我之前交付 我正在尝试以下解决方法来解决我的问题 放弃当前的审查 创建一个新的
  • GEKKO RTO 与 MPC 模式

    这是一个由此衍生的问题one https stackoverflow com questions 60761440 variable bounds in mpc with gekko 在发布我的问题后 我找到了一个解决方案 更像是强制优化器