如何解决使用GEKKO避障问题未找到解决方案,存在解决方案
可以在here找到原始问题。
我是使用这个包的初学者,下面给出的大部分代码都是从 GEKKO 官方文档中给出的例子中借用的。
通常的进口:
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
初始化模型并定义时间点:
m = GEKKO() # initialize gekko
nt = 501
m.time = np.linspace(0.0,1.0,nt)
t = m.Param(value=m.time)
p = np.zeros(nt) # mark final time point
p[-1] = 1.0
final = m.Param(value=p)
定义状态和控制变量:
x = m.Var(value=0.0)
y = m.Var(value=0.0)
z = m.Var(value=0.0)
V = m.FV(value=2.0,lb=0.0,ub=100.0)
V.STATUS = 1
theta = m.CV(1.0)
theta.STATUS = 1
theta.SPHI = 0
theta.SPLO = 6.28
V
被选为固定变量,因为问题陈述提到:
V 是一个恒定的标量速度。
theta
已被假定在 [0,2*pi]
中,因为它没有在问题陈述中直接提及。
z
用作代理变量以实现积分目标。
定义约束方程:
m.Equation(x.dt()==V*m.cos(theta))
m.Equation(y.dt()==V*m.sin(theta))
m.Equation(x*final==1.2)
m.Equation(y*final==1.6)
m.Equation(((x-0.4)**2)+((y-0.5)**2)>=0.1)
m.Equation(((x-0.8)**2)+((y-1.5)**2)>=0.1)
定义获得二阶导数所需的变量:
dx = m.Var(value = 0.0)
dy = m.Var(value = 0.0)
ddx = m.Var(value = 0.0)
ddy = m.Var(value = 0.0)
使这项工作的相应方程:
m.Equation(dx==x.dt())
m.Equation(dy==y.dt())
m.Equation(ddx==dx.dt())
m.Equation(ddy==dy.dt())
将代理变量的导数设置为积分内的目标并求解:
m.Equation(z.dt()==(ddx**2)+(ddy**2))
m.Obj(z*final)
m.options.IMODE = 6 # optimal control mode
m.solve(disp=True)
我不确定我对给定问题的编码方式是否正确。正如给定的链接所示,存在问题的解决方案。我曾尝试使用APOPT和IPOPT来解决这个问题,两个求解器都无法找到解决方案。自 COLD_START
起无法使用 DOF < 0
。
对此的任何帮助将不胜感激!
解决方法
模型的一个问题是两个终端约束,因为除了最后一个点(其中 final=1)之外的每个点都是 TerminateProcess
和 0=1.2
。
0=1.6
需要另一种形式。
m.Equation(x*final==1.2)
m.Equation(y*final==1.6)
下面是一个可行的解决方案,但没有优化。
m.Equation((x-1.2)*final==0)
m.Equation((y-1.6)*final==0)
IPOPT 无法解决 import numpy as np
from gekko import GEKKO
m = GEKKO()
nt = 51
m.time = np.linspace(0,1,nt)
# mark final time point
p = np.zeros(nt); p[-1] = 1
final = m.Param(p)
# define theta as a Variable
#theta = m.Var(value=np.pi/2.0,lb=0,ub=2*np.pi)
# define theta as an MV
theta = m.MV(value=0,ub=2*np.pi)
theta.STATUS = 1; theta.DCOST = 0
V = m.FV(value=2.15,ub=10) # velocity
#V.STATUS = 1
x,y,dx,dy,ddx,ddy = m.Array(m.Var,6)
m.Equation(x.dt()==V*m.cos(theta))
m.Equation(y.dt()==V*m.sin(theta))
m.Equation(((x-0.4)**2)+((y-0.5)**2)>=0.1)
m.Equation(((x-0.8)**2)+((y-1.5)**2)>=0.1)
m.Equation(dx==x.dt())
m.Equation(dy==y.dt())
m.Equation(ddx==dx.dt())
m.Equation(ddy==dy.dt())
# alternative 1 terminal constraint
m.Minimize(1e4*(x-1.2)**2)
m.Minimize(1e4*(y-1.6)**2)
# alternative 2 terminal constraint
#m.fix_final(x,1.2)
#m.fix_final(y,1.6)
# alternative 3 terminal constraint
#m.Equation((x-1.2)*final==0)
#m.Equation((y-1.6)*final==0)
# objective
m.Minimize(m.integral((ddx**2)+(ddy**2))*final)
m.options.SOLVER = 3
m.options.MAX_ITER = 1000
m.options.NODES = 3
m.options.IMODE = 6 # optimal control mode
m.solve(disp=True)
import matplotlib.pyplot as plt
plt.figure(figsize=(5,5))
th = np.linspace(0,2*np.pi,500)
x1 = np.sqrt(0.1)*np.cos(th)+0.4
y1 = np.sqrt(0.1)*np.sin(th)+0.5
x2 = np.sqrt(0.1)*np.cos(th)+0.8
y2 = np.sqrt(0.1)*np.sin(th)+1.5
plt.plot(x1,y1,'r',x2,y2,'r');
plt.plot(x.value,y.value,'b-o',markersize=2)
plt.plot([1.2],[1.6],'o',color='orange')
plt.xlabel('x'); plt.xlim([0,2.0])
plt.ylabel('y'); plt.ylim([0,2.0])
plt.title('Obstacle avoidance state variables,Speed = %2.4g'%V.value[0])
(计算)的问题。我尝试了其他几个终端约束,但求解器(APOPT 和 IPOPT)不成功。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。