Python gekko一维飞机飞行最优控制问题

Python gekko一维飞机飞行最优控制问题,python,gekko,Python,Gekko,我需要解决一维飞机飞行的最优控制问题。我有一架1000米高的飞机。我需要它沿x轴向前行驶1000米,同时最大限度地减少燃油消耗。当它达到x=1000时,我需要停止程序 我的目标函数如下:minj=>-mass(tf)。(通过最大化质量,消耗的燃油将降至最低)。优化器控制油门踏板 该问题受到以下约束:dx/dt=VdV/dt=(节气门阻力)/质量dm/dt=-油门*燃油流量 我开发了一个Gekko/Python脚本,如下所示。但是,优化脚本没有实现解决方案,导致: Exception: @erro

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

我的目标函数如下:
minj=>-mass(tf)
。(通过最大化质量,消耗的燃油将降至最低)。优化器控制油门踏板

该问题受到以下约束:
dx/dt=V
<代码>dV/dt=(节气门阻力)/质量<代码>dm/dt=-油门*燃油流量

我开发了一个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)的
上限有点太低,无法满足所有约束条件

我猜“燃料流”应该是一个
m.Const
,因为我假设它是每个油门的燃料流量

最后,当您使用
final
指定最后一个时间点的值时,您需要确保关联的
方程
也适用于整个时间步。我建议用这个代替

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()

所以,我将nt减少到11(从101)并且我将模拟时间更改为420,优化程序现在可以工作了!但是,我也想知道,当达到某个值时,是否有可能强制程序停止?我看到,通过这个实现-m.方程(final*(x-1000)==0),程序在最后可能的时刻刚好达到必要的x值。如何强制程序尽快达到x=1000,然后在达到x=1000时停止?然后,您可能还需要添加一个额外的目标,以最小化
最终时间
本身。请检查一个示例问题,说明如何在目标函数中添加时间。非常感谢你!