python - Gekko 示例 1b 使用不同形式的相同终端约束得到不同的结果
问题描述
我尝试了https://apmonitor.com/do/index.php/Main/DynamicOptimizationBenchmarks的示例 1b。
我构造了相同终端条件的两种不同形式,如下所示:
import numpy as np
import matplotlib.pyplot as plt
from gekko import GEKKO
m = GEKKO()
nt = 101
m.time = np.linspace(0,2,nt)
# Variables
x1 = m.Var(value=1)
x2 = m.Var(value=0)
u = m.Var(value=-0.48)
p = np.zeros(nt)
p[-1] = 1.0
final = m.Param(value=p)
# Equations
m.Equation(x1.dt()==u)
m.Equation(x2.dt()==x1**2 + u**2)
# terminal conditions
m.Equation(final*(x1-1)==0) # 1st form
# m.fix_final(x1,val=1) # 2nd form
m.Obj(x2*final)
m.options.IMODE = 6
m.solve()
plt.figure(1)
plt.plot(m.time,x1.value,'k:',linewidth=2,label=r'$x_1$')
plt.plot(m.time,x2.value,'b-',linewidth=2,label=r'$x_2$')
plt.plot(m.time,u.value,'r--',linewidth=2,label=r'$u$')
plt.legend(loc='best')plt.xlabel('Time')plt.ylabel('Value')plt.show()
它们表现不同,并实现了不同的解决方案,如下所示。
第一种形式m.Equation(final*(x1-1)==0)
:
第二种形式m.fix_final(x1,val=1)
:
我更喜欢使用fix_final
来定义这样的终端约束,例如x(tf)=0
. 但这似乎使问题无法解决。就像https://apmonitor.com/wiki/index.php/Main/GekkoPythonOptimization中的第13 个问题。
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO() # initialize GEKKO
nt = 501
m.time = np.linspace(0,1,nt)
x1 = m.Var(value=np.pi/2.0)
x2 = m.Var(value=4.0)
x3 = m.Var(value=0.0)
p = np.zeros(nt) # final time = 1
p[-1] = 1.0
final = m.Param(value=p)
tf = m.FV(value=1.0,lb=0.1,ub=100.0)
tf.STATUS = 1
u = m.MV(value=0,lb=-2,ub=2)
u.STATUS = 1
m.Equation(x1.dt()==u*tf)
m.Equation(x2.dt()==m.cos(x1)*tf)
m.Equation(x3.dt()==m.sin(x1)*tf)
# terminal constraints
m.Equation(x2*final<=0) # get solution
m.Equation(x3*final<=0)
# or
# m.fix(x2, pos=len(m.time)-1,val=0) # solution not found
# m.fix(x3, pos=len(m.time)-1,val=0)
# or
# m.fix_final(x2,val=0) # solution not found
# m.fix_final(x3,val=0)
m.Obj(tf)
m.options.IMODE = 6
m.solve()
plt.figure(1)
plt.plot(tm,x1.value,'k-',label=r'$x_1$')
plt.plot(tm,x2.value,'b-',label=r'$x_2$')
plt.plot(tm,x3.value,'g--',label=r'$x_3$')
plt.plot(tm,u.value,'r--',label=r'$u$')plt.legend(loc='best')plt.xlabel('Time')plt.show()
解决方案
当您修复变量的最终条件时,它也会将导数设置为零。这也在GitHub 上作为一个问题进行了讨论。此问题有一些解决方法,例如软终端约束(请参阅带有 GEKKO 的轨迹规划器无法处理给定的目标速度)或您展示的方式的硬终端约束。
推荐阅读
- typo3 - TYPO3 v10 动作控制器和子文件夹中的模板
- javascript - 如何使用二次缓动函数获得 2 个数字的值范围?
- wildfly - Wildfly 14 + EAR 在处理大量数据时不会被禁用
- c++ - 为什么通过引用返回向量比通过移动返回要快得多?
- r - 如何根据一列中所有其他数字的平均值重置一些异常值?
- python - ply lex 令牌背后的逻辑是什么?
- c++ - 字符串的内存有效向量
- java - 实例变量与?
- python - 如何在 Django Rest Framework 中过滤包含条件的数组?
- javascript - 使用 stopImmediatePropagation 方法禁用 routerLink