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

壁虎中的一维平面飞行优化控制问题

如何解决壁虎中的一维平面飞行优化控制问题

我需要解决一维飞机飞行优化控制问题。我有一架 1000m 高的飞机。我需要它沿 x 轴向前行驶 1000 米,同时最大限度地减少油耗。当它达到 x=1000 时,我需要程序停止。

我的目标函数如下所示:min J => -mass(tf)。 (通过最大化质量,消耗的燃料被最小化)。优化器控制加速踏板。

问题受到以下约束:dx/dt = V; dV/dt = (Throttle - Drag)/mass; dm/dt = -Throttle * fuelflow

我开发了一个 Gekko / Python 脚本如下。但是优化脚本并没有实现解决方案,引发:

Exception: @error: Solution Not Found

我曾尝试在这里和那里更改内容,但没有奏效,我不确定问题是什么。这是我的代码

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

#Gekko model
m = GEKKO(remote=False)

#Time points
nt = 101
m.time = np.linspace(0,100,nt)

# Parameters
Tcontr = m.MV(value=0.5,lb=0.3,ub=1) #throttle pedal position
Tcontr.STATUS = 1
Tcontr.dcosT = 0

# Variables
Ro = 1.1 #air density
S = 122.6
Cd = value=0.1
FuelFlow = m.Var(value=0.7)
D = m.Var() #drag
Thrmax = 200000 #maximum theoretical throttle
Thr = m.Var() #real throttle
V = m.Var() #VeLocity
x = m.Var(value=0)
mass = m.Var(value=60000)

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

# Equations
m.Equation(x.dt()==V)
m.Equation(Thr==Tcontr*Thrmax) #Throttle
m.Equation(V.dt()==(Thr-D)/mass)
m.Equation(mass.dt()==-Thr*FuelFlow)
m.Equation(D==0.5*Ro*(V**2)*Cd*S) #Drag 
m.Equation(final*x==1000) # to stop when x==1000 is achieved

# Objective Function
m.Obj(-mass*final)
m.options.IMODE = 6
m.options.NODES = 2
m.options.MV_TYPE = 1
m.options.soLVER = 3
m.open_folder() 
m.solve()

解决方法

似乎主要问题是您的 MV (Tcontr) 的 upper bound 太低而无法满足所有约束。

而且,我猜“FuelFlow”需要是 m.Const,因为我认为它是每个油门的燃料流量。

最后,当您使用 final 指定最后一个时间点的值时,您需要确保关联的 Equation 在整个时间步长中也是可行的。我建议改用这个。

m.Equation(final*(x-1000)==0)

这样,您就可以实现目标,而不会像之前的等式那样提出任何不可行的等式。除了最后一个非零值的时间点外,您之前的等式在大多数时间点都不可行。在最后一个时间点之前,结果是“0 (LHS) = 1000 (RHS)”。

请看下面修改后的代码。

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

#Gekko model
m = GEKKO(remote=True)

#Time points
nt = 101
m.time = np.linspace(0,100,nt)

# Parameters
Tcontr = m.MV(value=0.5,lb=0.3,ub=10) #throttle pedal position
Tcontr.STATUS = 1
Tcontr.DCOST = 1e-2

# Variables
Ro = 1.1 #air density
S = 122.6
Cd = value=0.1
FuelFlow = m.Const(value=0.7)
D = m.Var() #drag
Thrmax = 200000 #maximum theoretical throttle
Thr = m.Var() #real throttle
V = m.Var() #Velocity
x = m.Var(value=0)
mass = m.Var(value=60000)

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

# Equations
m.Equation(x.dt()==V)
m.Equation(Thr==Tcontr*Thrmax) #Throttle
m.Equation(mass*V.dt()==(Thr-D))
m.Equation(mass.dt()==-Thr*FuelFlow)
m.Equation(D==0.5*Ro*(V**2)*Cd*S) #Drag 
m.Equation(final*(x-1000)==0) # to stop when x==1000 is achieved

# Objective Function
m.Obj(-mass*final)
m.options.IMODE = 6
m.options.NODES = 3
m.options.MV_TYPE = 1
m.options.SOLVER = 3
# m.open_folder() 
m.solve()

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