自由终端时间、积分目标和微分方程作为约束

2024-03-03

我正在尝试解决一个最优控制问题,该问题涉及最小化具有固定状态但自由终端时间的积分目标。这是一个相对简单的问题,可以通过解析来解决。 Gekko 的解决方案与解析不符。

我不确定我做错了什么。我遵循了几个 Gekko 示例来解决这个问题。任何帮助深表感谢。

我遇到的另一个问题是如何让 Gekko 自动计算控制的初始值。最优控制总是从指定的初始控制猜测开始。

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

# create GEKKO model
m = GEKKO()
# time points
n = 501
tm = np.linspace(0, 1, n)
m.time = tm

# Variables
x1 = m.Var(value=1)  # x1
x2 = m.Var(value=2)  # x2
# u = m.Var(value=-1)  # control variable used as normal var
u = m.MV(value=-1) # manipulative variable
u.STATUS = 1
u.DCOST = 1e-5

p = np.zeros(n)
p[-1] = 1.0
final = m.Param(value=p)

# FV
tf = m.FV(value=10.0, lb=0.0, ub=100.0)
tf.STATUS = 1

# equations
m.Equation(x1.dt()/tf == x2)
m.Equation(x2.dt()/tf == u)


# Final conditions
soft = True
if soft:
    # soft terminal constraint
    m.Minimize(final*1e5*(x1-3)**2)
    # m.Minimize(final*1e5*(x2-2)**2)
else:
    # hard terminal constraint
    x1f = m.Param()
    m.free(x1f)
    m.fix_final(x1f, 3)
    # connect endpoint parameters to x1 and x2
    m.Equations([x1f == x1])

# Objective Function
obj = m.Intermediate(tf*final*m.integral(0.5*u**2))

m.Minimize(final*obj)

m.options.IMODE = 6
m.options.NODES = 2
m.options.SOLVER = 3
m.options.MAX_ITER = 500
# m.options.MV_TYPE = 0
m.options.DIAGLEVEL = 0
m.solve(disp=False)


# Create a figure
plt.figure(figsize=(10, 4))
plt.subplot(2, 2, 1)
# plt.plot([0,1],[1/9,1/9],'r:',label=r'$x<\frac{1}{9}$')
plt.plot(tm, x1.value, 'k-', lw=2, label=r'$x1$')
plt.ylabel('x1')
plt.legend(loc='best')
plt.subplot(2, 2, 2)
plt.plot(tm, x2.value, 'b--', lw=2, label=r'$x2$')
plt.ylabel('x2')
plt.legend(loc='best')
plt.subplot(2, 2, 3)
plt.plot(tm, u.value, 'r--', lw=2, label=r'$u$')
plt.ylabel('control')
plt.legend(loc='best')
plt.xlabel('Time')
plt.subplot(2, 2, 4)
plt.plot(tm, obj.value, 'g-', lw=2, label=r'$\frac{1}{2} \int u^2$')
plt.text(0.5, 3.0, 'Final Value = '+str(np.round(obj.value[-1], 2)))
plt.ylabel('Objective')
plt.legend(loc='best')
plt.xlabel('Time')
plt.show()


以下是一些修改:

# u = m.MV(value=-1)
u = m.MV(value=-1,fixed_initial=False)

#obj = m.Intermediate(tf*final*m.integral(0.5*u**2))
obj = m.Intermediate(m.integral(0.5*u**2))

m.options.NODES = 3 # increase accuracy

如果添加一个约束tf<=3然后它给出与上面相同的解决方案。

然而,如果你放松tf约束到<=100那么就有更好的解决方案了。

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

# create GEKKO model
m = GEKKO()
# time points
n = 501
tm = np.linspace(0, 1, n)
m.time = tm

# Variables
x1 = m.Var(value=1)  # x1
x2 = m.Var(value=2)  # x2
u = m.MV(value=-1,fixed_initial=False) # manipulated variable
u.STATUS = 1
u.DCOST = 1e-5

p = np.zeros(n)
p[-1] = 1.0
final = m.Param(value=p)

# FV
tf = m.FV(value=10.0, lb=0.0, ub=100.0)
tf.STATUS = 1

# equations
m.Equation(x1.dt()/tf == x2)
m.Equation(x2.dt()/tf == u)


# Final conditions
soft = True
if soft:
    # soft terminal constraint
    m.Minimize(final*1e5*(x1-3)**2)
    # m.Minimize(final*1e5*(x2-2)**2)
else:
    # hard terminal constraint
    x1f = m.Param()
    m.free(x1f)
    m.fix_final(x1f, 3)
    # connect endpoint parameters to x1 and x2
    m.Equations([x1f == x1])

# Objective Function
obj = m.Intermediate(m.integral(0.5*u**2))

m.Minimize(final*obj)

m.options.IMODE = 6
m.options.NODES = 3
m.options.SOLVER = 3
m.options.MAX_ITER = 500
# m.options.MV_TYPE = 0
m.options.DIAGLEVEL = 0
m.solve(disp=True)

# Create a figure
tm = tm*tf.value[0]
plt.figure(figsize=(10, 4))
plt.subplot(2, 2, 1)
# plt.plot([0,1],[1/9,1/9],'r:',label=r'$x<\frac{1}{9}$')
plt.plot(tm, x1.value, 'k-', lw=2, label=r'$x1$')
plt.ylabel('x1')
plt.legend(loc='best')
plt.subplot(2, 2, 2)
plt.plot(tm, x2.value, 'b--', lw=2, label=r'$x2$')
plt.ylabel('x2')
plt.legend(loc='best')
plt.subplot(2, 2, 3)
plt.plot(tm, u.value, 'r--', lw=2, label=r'$u$')
plt.ylabel('control')
plt.legend(loc='best')
plt.xlabel('Time')
plt.subplot(2, 2, 4)
plt.plot(tm, obj.value, 'g-', lw=2, label=r'$\frac{1}{2} \int u^2$')
plt.text(0.5, 3.0, 'Final Value = '+str(np.round(obj.value[-1], 2)))
plt.ylabel('Objective')
plt.legend(loc='best')
plt.xlabel('Time')
plt.show()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自由终端时间、积分目标和微分方程作为约束 的相关文章

  • 将文本粘贴到 Macintosh 上的 emacs 中

    我使用的是 Macintosh 并且使用 终端 作为我的 shell 当我从任何窗口复制文本 通过鼠标拖动 然后鼠标右键菜单 gt 复制 然后将文本 鼠标右键 gt 粘贴 粘贴到运行 emacs 的终端中时 它不会充当粘贴 相反 它就像输入
  • 在 Java 中运行代码 x 秒?

    我想编写一个 java while 循环 它将迭代 15 秒 我认为执行此操作的一种方法是存储当前系统时间 15 秒 然后将其与 while 循环签名中的当前时间进行比较 有没有更好的办法 这个设计取决于你想在 15 秒内做什么 两种最合理
  • 在 R 中将时间从数字转换为时间格式

    我从 xls 文件中读取数据 显然 时间格式不正确 如下 举例 0 3840277777777778 0 3847222222222222 0 3854166666666667 确实 他们应该是 09 12 09 13 09 13 我不知道
  • C 代码获取相对于 UTC 的本地时间偏移(以分钟为单位)?

    我没有找到一种简单的方法来获取本地时间和 UTC 时间之间的时间偏移 以分钟为单位 起初我打算使用tzset 但它不提供夏令时 根据手册页 如果夏令时有效 它只是一个不为零的整数 虽然通常是一个小时 但在某些国家 地区可能是半小时 我宁愿避
  • 为什么libc中没有gmtime的反函数?

    在 libc 中 有两个函数可以将系统时间转换为日历时间 gmtime and localtime 但只有localtime有反函数 mktime 为什么没有反函数gmtime 如果不应该有 为什么gmtime exists 我发现这段代码
  • 为 CocoaPods 插件设置 Xcode

    我正在尝试设置终端 Xcode 以便正确工作Xcode CocoaPods 插件 https github com kattrali cocoapods xcode plugin 当我从插件运行集成 cocoapods 选项时 我收到一条消
  • OS X - 输入“grails”命令后终端重置

    在我的 bash profile 中 我有以下几行 export GRAILS HOME usr share java grails export PATH PATH GRAILS HOME bin GRAILS HOME 是同一目录中 g
  • 如何通过双击使该 file.sh 可执行?

    首先我用的是Mac 接下来 我需要执行这个 file sh 我们将调用它 每次我需要执行它时 我都必须打开终端并输入 cd Users Jacob Documents folderWithFileInIt bash file sh 这没关系
  • 从终端在 MAC 操作系统上安装 dmg 包

    我想通过终端在我的 MAC 操作系统中安装 dmg java 包 我尝试使用这个命令 sudo installer package jdk 7u51 macos x64 dmg target 但我收到此错误 installer Error
  • PHP:使用 DateTime 类转换日期

    我从 PayPal IPN 获得了此日期 payment date 20 12 59 Jan 13 2009 PST 我如何转换Y m d TH i s Z 我确实尝试过 date new DateTime POST payment dat
  • 在 MacOS 上重新启动终端而不关闭

    如何在不关闭窗口的情况下重新启动当前的 MacOS 终端会话 在Linux中我使用exec bash但在这种环境下它不起作用 我对 bash profile 提示 别名等 我想在不关闭它并再次打开的情况下查看 只需输入命令 exec bas
  • 如何确定特定时间是否在javascript中给定时间范围之间

    我想检查两个时间 var open time 和 var close time 之间的 var check val var open time 23 30 var close time 06 30 var check val 02 30 i
  • 如何在Python中测量时间?

    我想启动我的程序 测量程序启动的时间 然后等待几秒钟 按下按钮 K RIGHT 并测量按下按钮的时间 我正在使用 Pygame 来注册 Keydown 但在我下面的代码中它没有注册我的 Keydown 我在这里做错了什么 start tim
  • setTimeout - 将变量作为时间传递

    我有一个 setTimeout 我希望能够使用变量作为计时器 var that this var time this spawnTime setTimeout function time that SpawnCounter time 这似乎
  • 如何根据 Bash 中的 VI 模式更改光标形状?

    我的 bashrc 中有以下行 set o vi 我希望我的光标在插入模式下具有管道形状 在命令模式下具有块形状 就像我在 vimrc 中放置以下内容时在 Vim 中的形状一样 let t SI e 6 q let t SR e 4 q l
  • Gulp BrowserSync 在终端中显示“重新加载浏览器”,但没有重新加载实际的浏览器。

    我遇到一个问题 我的任务正在按需要运行 并且 BrowserSync 似乎正在工作 但实际的浏览器没有重新加载 我在终端中收到正确的消息 表明一切都按计划进行 我正在为我的本地服务器使用 MAMP 该服务器正在为 WordPress 构建提
  • 在 Haskell 命令行应用程序中提示输入密码

    以下 Haskell 程序提示用户在终端中输入密码 如果输入正确则继续 main do putStrLn Password password lt getLine case hash password member database of
  • DHT22传感器导入Adafruit_DHT错误

    因此 我已将 DHT22 湿度传感器正确连接到我的 BeagleBone Black Rev C 我在 MacBook Pro 上运行 OS Mavericks 并且按照 Adafruit 提供的有关如何使用 DHT22 的说明进行操作 我
  • 在不使用 ncurses 的情况下用 C/C++ 编写“真正的”交互式终端程序,例如 vim、htop...

    不 我不想使用ncurses 因为我想了解如何 终端可以工作 并且我自己编程也很有趣 没有 必须是可移植的 它必须只能在基于 linux xterm 的终端仿真器上工作 我想做的是编写一个交互式终端应用程序 例如 htop 和 vim 我的
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终

随机推荐