微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

壁虎 X 值不超过某个点

如何解决壁虎 X 值不超过某个点

我需要解决一维飞机飞行优化控制问题。我有一架 1000m 高的飞机。我需要它沿 x 轴向前行驶一定距离 (x),同时最大限度地减少燃料消耗。当它到达那个距离 x 时,我需要程序停止。这个函数控制它:m.Equation(x*final<=1500)

出于某种原因,在模拟过程中,我的 x 值不想高于 1310。

我该如何解决“阻塞”问题?

我的壁虎脚本:

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

#Gekko model
m = GEKKO(remote=False)

#Time points
nt = 11
tm =  np.linspace(0,1,nt)
m.time = tm

# Variables
Ro = m.Const(value=1.1)
g = m.Const(value=9.80665)
T = m.Var()
T0 = m.Const(value=273)
S = m.Const(value=122.6)
Cd = m.Const(value=0.1)
FuelFlow = m.Var()
D = m.Var()
Thrmax = value=200000
Thr = m.Var()
V = m.Var()
nu = m.Var(value=0)
nuu = nu.value
x = m.Var(value=0)
h = m.Var(value=1000)
mass = m.Var(value=60000)
    
p = np.zeros(nt)
p[-1] = 1.0
final = m.Param(value=p)

m.options.MAX_ITER=40000 # iteration max number

#Fixed Variable
tf = m.FV(value=1,lb=0.1,ub=1000.0)
tf.STATUS = 1

# Parameters
Tcontr = m.MV(value=0.2,lb=0.2,ub=1)
Tcontr.STATUS = 1
Tcontr.dcosT = 0 #1e-2

# Equations
m.Equation(x.dt()==tf*(V*(math.cos(nuu.value))))#
m.Equation(Thr==Tcontr*Thrmax)
m.Equation(V.dt()==tf*((Thr-D)/mass))#
m.Equation(mass.dt()==tf*(-Thr*(FuelFlow/60)))#
m.Equation(D==0.5*Ro*(V**2)*Cd*S)
m.Equation(FuelFlow==0.75882*(1+(V/2938.5)))
m.Equation(x*final<=1500)
m.Equation(T==T0-h)

# Objective Function
m.Obj(-mass*tf*final)#
m.options.IMODE = 6
m.options.NODES = 3
m.options.MV_TYPE = 1
m.options.soLVER = 3
#m.open_folder() # to search for infeasibilities
m.solve()


tm = tm * tf.value[0]

print('Final Time: ' + str(tf.value[-1]))
print('Final Speed: ' + str(V.value[-1]))
print('Final X: ' + str(x.value[-1]))

plt.figure(1)
plt.subplot(2,1)
plt.plot(tm,Tcontr,'r-',linewidth=2,label=r'$Tcontr$')
#plt.plot(m.time,x.value,'r--',label=r'$x$')
plt.legend(loc='best')
plt.subplot(2,2)
plt.plot(tm,label=r'$x$')
#plt.plot(tm,mass.value,'g:',label=r'$mass$')
#plt.plot(tm,D.value,label=r'$D$')
#plt.plot(tm,V.value,'b-',label=r'$V$')
plt.legend(loc='best')
plt.xlabel('Time')
plt.ylabel('Value')
plt.show()

解决方法

Tcontr 的下限阻止 x 值超过 1310。如果约束 {{1 }} 被删除。

x

results

当解决方案不是最优的或存在不可行的解决方案时,约束通常是罪魁祸首。检测有问题的约束的一种方法是创建图以验证解决方案不是人为约束的。

制定约束的另一种方法是结合使用硬约束 m.Equation(x*final<=1500) 和软约束来指导解决方案为 Tcontr = m.MV(value=0.2,lb=0.1,ub=1) 。正确设置硬约束很重要。像 m.Equation((x-1500)*final==0) 这样的约束意味着当 final 不等于 1 时它对 m.Minimize(final*(x-1500)**2) 是不可行的。不等式版本也更好地提出为 m.Equation(x*final==1500) 但原始形式也有效,因为 {{ 1}}。

x*0==1500

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。