Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Gekko最优控制。空气密度方程出错了_Python_Gekko - Fatal编程技术网

Python Gekko最优控制。空气密度方程出错了

Python Gekko最优控制。空气密度方程出错了,python,gekko,Python,Gekko,所以我用最优控制优化飞机飞行。飞机飞行一定距离(路径变量),然后模拟停止。解算器试图通过最大化质量值来最小化燃油消耗量(m.Maximize(masstffinal) 我试着实现气压和空气密度方程。 压力方程运行良好,但密度不起作用 对于空气压力,我使用了这个: 它变成了这个m.方程(压力==101325*(1-(0.0065*h)/T0)**((g*0.0289652)/(8.31446*0.0065)) 对于空气密度,我用了这个: 我把它变成这样:m.方程(Ro==(压力*0.0289652

所以我用最优控制优化飞机飞行。飞机飞行一定距离(
路径
变量),然后模拟停止。解算器试图通过最大化质量值来最小化燃油消耗量
(m.Maximize(masstffinal)

我试着实现气压和空气密度方程。 压力方程运行良好,但密度不起作用

对于空气压力,我使用了这个:

它变成了这个
m.方程(压力==101325*(1-(0.0065*h)/T0)**((g*0.0289652)/(8.31446*0.0065))

对于空气密度,我用了这个:

我把它变成这样:
m.方程(Ro==(压力*0.0289652)/(8.31446*T))
但出于某种原因,当我试图在密度方程激活的情况下运行程序时,模拟会一直运行,直到达到最大循环计数。我对密度方程做了什么错误

我的代码:

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,100,nt)
m.time = tm

# Variables
Ro = m.Var(value=1.1)#air density
g = m.Const(value=9.80665)
pressure = m.Var(value=101325)#
T = m.Var(value=281)#temp
T0 = m.Const(value=288)#temp at see level
S = m.Const(value=122.6)
Cd = m.Const(value=0.1)
FuelFlow = m.Var()
D = m.Var()#drag
Thrmax = m.Const(value=200000)#macimum throttle
Thr = m.Var()
V = m.Var(value=100,lb=0,ub=240)#velocity
#Vmin = m.Var(value=100)
nu = m.Var(value=0)#angle
nuu = nu.value
x = m.Var(value=0,lb=0)#x position
h = m.Var(value=1000)# height
mass = m.Var(value=60000)
path = m.Const(value=5000000) #intended distance length
L = m.Var()

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

m.options.MAX_ITER=10000 # iteration number

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

# Parameters
Tcontr = m.MV(value=0.2,lb=0.2,ub=1)
Tcontr.STATUS = 1
Tcontr.DCOST = 0

# 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/60000)))#

m.Equation(T==T0-(0.0065*h))
m.Equation(pressure==101325*(1-(0.0065*h)/T0)**((g*0.0289652)/(8.31446*0.0065)))# equation works
m.Equation(Ro==(pressure*0.0289652)/(8.31446*T))# equation does not work

m.Equation(D==0.5*Ro*(V**2)*Cd*S)
m.Equation(FuelFlow==0.75882*(1+(V/2938.5)))
m.Equation(x*final<=path)

# Objective Function
m.Minimize(final*(x-path)**2)
m.Maximize(mass*tf*final)
m.options.IMODE = 6
m.options.NODES = 2 # it was 3 before
m.options.MV_TYPE = 1
m.options.SOLVER = 3
#m.open_folder() # to search for infeasibilities
m.solve()

tm = tm * tf.value[0]
    
fig, axs = plt.subplots(6)
fig.suptitle('Results')
axs[0].plot(tm,Tcontr,'r-',LineWidth=2,label=r'$Tcontr$')
axs[0].legend(loc='best')
axs[1].plot(tm,V.value,'b-',LineWidth=2,label=r'$V$')
axs[1].legend(loc='best')
axs[2].plot(tm,x.value,'r--',LineWidth=2,label=r'$x$')
axs[2].legend(loc='best')
axs[3].plot(tm,D.value,'g-',LineWidth=2,label=r'$D$')
axs[3].legend(loc='best')
axs[4].plot(tm,mass.value,'g:',LineWidth=2,label=r'$mass$')
axs[4].legend(loc='best')
axs[5].plot(tm,T.value,'p-',LineWidth=2,label=r'$T$')
axs[5].legend(loc='best')
#axs[6].plot(tm,Ro.value,'p-',LineWidth=2,label=r'$Ro$')
#axs[6].legend(loc='best')
plt.xlabel('Time')
#plt.ylabel('Value')
plt.show()
将numpy导入为np
将matplotlib.pyplot作为plt导入
从gekko进口gekko
输入数学
#盖柯模型
m=GEKKO(远程=False)
#时点
nt=11
tm=np.linspace(0100,新界)
m、 时间=tm
#变数
Ro=m.Var(值=1.1)#空气密度
g=m.Const(值=9.80665)
压力=m.Var(值=101325)#
T=m.Var(值=281)#温度
T0=m.Const(值=288)#见标高处的温度
S=m.Const(值=122.6)
Cd=m.Const(值=0.1)
燃料流量=m.Var()
D=m.Var()#阻力
Thrmax=m.Const(值=200000)#最大节气门
Thr=m.Var()
V=m.Var(值=100,磅=0,磅=240)#速度
#Vmin=m.Var(值=100)
nu=m.Var(值=0)#角度
nuu=nu.value
x=m.Var(值=0,磅=0)#x位置
h=m.Var(值=1000)#高度
质量=m.Var(值=60000)
路径=m.Const(值=5000000)#预期距离长度
L=m.Var()
p=np.零(nt)
p[-1]=1.0
最终=m.Param(值=p)
m、 选项。最大迭代次数=10000次
#固定变量
tf=m.FV(值=1,磅=0.0001,磅=1000.0)#
tf.STATUS=1
#参数
Tcontr=m.MV(值=0.2,磅=0.2,磅=1)
Tcontr.STATUS=1
Tcontr.DCOST=0
#方程式
m、 方程(x.dt()==tf*(V*(数学cos(数值)))#
m、 方程(Thr==Tcontr*Thrmax)
m、 方程(V.dt()==tf*((Thr-D)/质量))#
m、 方程(质量dt()==tf*(-Thr*(燃料流量/60000)))#
m、 方程(T==T0-(0.0065*h))
m、 方程(压力=101325*(1-(0.0065*h)/T0)**((g*0.0289652)/(8.31446*0.0065))#方程有效
m、 方程(Ro==(压力*0.0289652)/(8.31446*T))#方程不起作用
m、 方程(D==0.5*Ro*(V**2)*Cd*S)
m、 方程式(燃料流量==0.75882*(1+(V/2938.5)))

m、 方程(x*final有两件事可以帮助解决找不到解决方案的问题:

  • 向变量添加约束以帮助解算器保持在合理范围内
  • #变量
    T=m.Var(值=281,磅=100)#温度
    h=m.Var(值=1000,磅=0)#高度
    质量=m.Var(值=60000,磅=1000)
    tf=m.FV(值=1,磅=0.1,磅=100.0)#
    

    如果解处于约束条件,则考虑进一步打开约束,并从先前解或开始解。

  • 避免通过重新排列方程被零除
  • #m.方程(Ro==(压力*0.0289652)/(8.31446*T))#方程不起作用
    m、 方程(Ro*(8.31446*T)==(压力*0.0289652))
    
    通常,在几百次迭代后,解算器会成功或不成功。如果解算不成功,设置MAX_ITER=100000可能会导致时间过长

    将numpy导入为np
    将matplotlib.pyplot作为plt导入
    从gekko进口gekko
    输入数学
    #盖柯模型
    m=GEKKO(远程=False)
    #时点
    nt=101
    tm=np.linspace(0100,新界)
    m、 时间=tm
    #变数
    Ro=m.Var(值=1.1)#空气密度
    g=m.Const(值=9.80665)
    压力=m.Var(值=101325)#
    T=m.Var(值=281,磅=100)#温度
    T0=m.Const(值=288)#见标高处的温度
    S=m.Const(值=122.6)
    Cd=m.Const(值=0.1)
    燃料流量=m.Var()
    D=m.Var()#阻力
    Thrmax=m.Const(值=200000)#最大节气门
    Thr=m.Var()
    V=m.Var(值=100,磅=0,磅=240)#速度
    #Vmin=m.Var(值=100)
    nu=m.Var(值=0)#角度
    nuu=nu.value
    x=m.Var(值=0,磅=0)#x位置
    h=m.Var(值=1000,磅=0)#高度
    质量=m.Var(值=60000,磅=1000)
    路径=m.Const(值=5000000)#预期距离长度
    L=m.Var()
    p=np.零(nt)
    p[-1]=1.0
    最终=m.Param(值=p)
    m、 选项。最大迭代次数=200次
    #固定变量
    tf=m.FV(值=1,磅=0.1,磅=100.0)#
    tf.STATUS=1
    #参数
    Tcontr=m.MV(值=0.2,磅=0.2,磅=1)
    Tcontr.STATUS=1
    Tcontr.DCOST=0
    #方程式
    m、 方程(x.dt()==tf*(V*(数学cos(数值)))#
    m、 方程(Thr==Tcontr*Thrmax)
    m、 方程(V.dt()==tf*((Thr-D)/质量))#
    m、 方程(质量dt()==tf*(-Thr*(燃料流量/60000)))#
    m、 方程(T==T0-(0.0065*h))
    m、 方程(压力=101325*(1-(0.0065*h)/T0)**((g*0.0289652)/(8.31446*0.0065))#方程有效
    m、 方程(Ro*(8.31446*T)==(压力*0.0289652))#方程不起作用
    m、 方程(D==0.5*Ro*(V**2)*Cd*S)
    m、 方程式(燃料流量==0.75882*(1+(V/2938.5)))
    
    m、 方程式(x*finalThank you!它现在按预期工作!