【发布时间】:2021-07-02 18:07:15
【问题描述】:
我正在尝试使用 Gekko 套件解决具有各种初始条件的多个优化问题。分配初始条件,使用 Gekko 运行优化,并收集每个解决方案。当我尝试更改参数、目标函数或初始条件时,Gekko 经常给我“未找到解决方案错误:第 2130 行,解决引发异常(apm_error)。”我在下面介绍一些案例,希望得到解决我遇到的这个问题的建议。我之前发布了一个类似的问题,但我希望这个问题更简洁明了。谢谢。
案例 1. 运行良好,没有错误。
from gekko import GEKKO
import pandas as pd
import numpy as np
dat = {'A0': [23221, 2198, 4296, 104906, 691], 'h': [0.04, 0.25, 0.07, 0, 12.58],'emax': [23221, 2198, 4296, 104906, 691] }
dftemp = pd.DataFrame(data=dat)
na=len(dftemp)
# time points
n=51
year=50
# constants
Pa0 = 3.061
Pe0 = 10.603
C0 = 100
r = 0.05
k=50
shift=10000000 # to make positive inside log function
ll=0.15
for i in range(0,na):
# create GEKKO model
m = GEKKO(remote=False)
m.time = np.linspace(0,year,n)
t=m.time
A0=dftemp.loc[i][0]
h=dftemp.loc[i][1]
emax=dftemp.loc[i][2]
A = m.SV(value=A0, lb=0, ub=A0)
E = m.SV(value=0, lb=0, ub=A0)
u = m.MV(value=0, lb=-emax, ub=emax)
u.STATUS = 1
t = m.Param(value=m.time)
C = m.Var(value=C0)
d = m.Var(value=1)
l = m.Param(value=ll)
# Equation
m.Equation(A.dt()==-u)
m.Equation(E.dt()==u)
m.Equation(C.dt()==-C/k)
m.Equation(d==m.exp(-t*r))
# Objective (Utility)
J = m.Var(value=0)
# Final objective
Jf = m.FV()
Jf.STATUS = 1
m.Connection(Jf,J,pos2='end')
m.Equation(J.dt() == m.log((A+E*(1-l))*h*Pa0-C*u+E*Pe0+shift)*d)
# maximize U
m.Maximize(Jf)
# options
m.options.IMODE = 6 # optimal control
m.options.NODES = 3 # collocation nodes
m.options.SOLVER = 3 # solver (IPOPT)
# solve optimization problem
m.solve()
# print profit
print('Optimal Profit: ' + str(Jf.value[0]))
案例2.将“时间点”的数量从n=51更改为n=501发生错误
from gekko import GEKKO
import pandas as pd
import numpy as np
dat = {'A0': [23221, 2198, 4296, 104906, 691], 'h': [0.04, 0.25, 0.07, 0, 12.58],'emax': [23221, 2198, 4296, 104906, 691] }
dftemp = pd.DataFrame(data=dat)
na=len(dftemp)
# time points
n=501
year=50
# constants
Pa0 = 3.061
Pe0 = 10.603
C0 = 100
r = 0.05
k=50
shift=10000000 # to make positive inside log function
ll=0.15
for i in range(0,na):
# create GEKKO model
m = GEKKO(remote=False)
m.time = np.linspace(0,year,n)
t=m.time
A0=dftemp.loc[i][0]
h=dftemp.loc[i][1]
emax=dftemp.loc[i][2]
A = m.SV(value=A0, lb=0, ub=A0)
E = m.SV(value=0, lb=0, ub=A0)
u = m.MV(value=0, lb=-emax, ub=emax)
u.STATUS = 1
t = m.Param(value=m.time)
C = m.Var(value=C0)
d = m.Var(value=1)
l = m.Param(value=ll)
# Equation
m.Equation(A.dt()==-u)
m.Equation(E.dt()==u)
m.Equation(C.dt()==-C/k)
m.Equation(d==m.exp(-t*r))
# Objective (Utility)
J = m.Var(value=0)
# Final objective
Jf = m.FV()
Jf.STATUS = 1
m.Connection(Jf,J,pos2='end')
m.Equation(J.dt() == m.log((A+E*(1-l))*h*Pa0-C*u+E*Pe0+shift)*d)
# maximize U
m.Maximize(Jf)
# options
m.options.IMODE = 6 # optimal control
m.options.NODES = 3 # collocation nodes
m.options.SOLVER = 3 # solver (IPOPT)
# solve optimization problem
m.solve()
# print profit
print('Optimal Profit: ' + str(Jf.value[0]))
案例 3. 将目标函数从 m.log 更改为简单的线性求和。效果很好。
from gekko import GEKKO
import pandas as pd
import numpy as np
dat = {'A0': [23221, 2198, 4296, 104906, 691], 'h': [0.04, 0.25, 0.07, 0, 12.58],'emax': [23221, 2198, 4296, 104906, 691] }
dftemp = pd.DataFrame(data=dat)
na=len(dftemp)
# time points
n=51
year=50
# constants
Pa0 = 3.061
Pe0 = 10.603
C0 = 100
r = 0.05
k=50
shift=10000000 # to make positive inside log function
ll=0.15
for i in range(0,na):
# create GEKKO model
m = GEKKO(remote=False)
m.time = np.linspace(0,year,n)
t=m.time
A0=dftemp.loc[i][0]
h=dftemp.loc[i][1]
emax=dftemp.loc[i][2]
A = m.SV(value=A0, lb=0, ub=A0)
E = m.SV(value=0, lb=0, ub=A0)
u = m.MV(value=0, lb=-emax, ub=emax)
u.STATUS = 1
t = m.Param(value=m.time)
C = m.Var(value=C0)
d = m.Var(value=1)
l = m.Param(value=ll)
# Equation
m.Equation(A.dt()==-u)
m.Equation(E.dt()==u)
m.Equation(C.dt()==-C/k)
m.Equation(d==m.exp(-t*r))
# Objective (Utility)
J = m.Var(value=0)
# Final objective
Jf = m.FV()
Jf.STATUS = 1
m.Connection(Jf,J,pos2='end')
m.Equation(J.dt() == ((A+E*(1-l))*h*Pa0-C*u+E*Pe0+shift)*d)
# maximize U
m.Maximize(Jf)
# options
m.options.IMODE = 6 # optimal control
m.options.NODES = 3 # collocation nodes
m.options.SOLVER = 3 # solver (IPOPT)
# solve optimization problem
m.solve()
# print profit
print('Optimal Profit: ' + str(Jf.value[0]))
案例 4. 将目标函数从 m.log 更改为简单求和,并从目标函数中删除“变量”d。发生错误
from gekko import GEKKO
import pandas as pd
import numpy as np
dat = {'A0': [23221, 2198, 4296, 104906, 691], 'h': [0.04, 0.25, 0.07, 0, 12.58],'emax': [23221, 2198, 4296, 104906, 691] }
dftemp = pd.DataFrame(data=dat)
na=len(dftemp)
# time points
n=51
year=50
# constants
Pa0 = 3.061
Pe0 = 10.603
C0 = 100
r = 0.05
k=50
shift=10000000 # to make positive inside log function
ll=0.15
for i in range(0,na):
# create GEKKO model
m = GEKKO(remote=False)
m.time = np.linspace(0,year,n)
t=m.time
A0=dftemp.loc[i][0]
h=dftemp.loc[i][1]
emax=dftemp.loc[i][2]
A = m.SV(value=A0, lb=0, ub=A0)
E = m.SV(value=0, lb=0, ub=A0)
u = m.MV(value=0, lb=-emax, ub=emax)
u.STATUS = 1
t = m.Param(value=m.time)
C = m.Var(value=C0)
d = m.Var(value=1)
l = m.Param(value=ll)
# Equation
m.Equation(A.dt()==-u)
m.Equation(E.dt()==u)
m.Equation(C.dt()==-C/k)
m.Equation(d==m.exp(-t*r))
# Objective (Utility)
J = m.Var(value=0)
# Final objective
Jf = m.FV()
Jf.STATUS = 1
m.Connection(Jf,J,pos2='end')
m.Equation(J.dt() == ((A+E*(1-l))*h*Pa0-C*u+E*Pe0+shift))
# maximize U
m.Maximize(Jf)
# options
m.options.IMODE = 6 # optimal control
m.options.NODES = 3 # collocation nodes
m.options.SOLVER = 3 # solver (IPOPT)
# solve optimization problem
m.solve()
# print profit
print('Optimal Profit: ' + str(Jf.value[0]))
案例5.将目标函数从m.log改为简单的线性求和,将shift改为0,出现错误
from gekko import GEKKO
import pandas as pd
import numpy as np
dat = {'A0': [23221, 2198, 4296, 104906, 691], 'h': [0.04, 0.25, 0.07, 0, 12.58],'emax': [23221, 2198, 4296, 104906, 691] }
dftemp = pd.DataFrame(data=dat)
na=len(dftemp)
# time points
n=51
year=50
# constants
Pa0 = 3.061
Pe0 = 10.603
C0 = 100
r = 0.05
k=50
shift=0
ll=0.15
for i in range(0,na):
# create GEKKO model
m = GEKKO(remote=False)
m.time = np.linspace(0,year,n)
t=m.time
A0=dftemp.loc[i][0]
h=dftemp.loc[i][1]
emax=dftemp.loc[i][2]
A = m.SV(value=A0, lb=0, ub=A0)
E = m.SV(value=0, lb=0, ub=A0)
u = m.MV(value=0, lb=-emax, ub=emax)
u.STATUS = 1
t = m.Param(value=m.time)
C = m.Var(value=C0)
d = m.Var(value=1)
l = m.Param(value=ll)
# Equation
m.Equation(A.dt()==-u)
m.Equation(E.dt()==u)
m.Equation(C.dt()==-C/k)
m.Equation(d==m.exp(-t*r))
# Objective (Utility)
J = m.Var(value=0)
# Final objective
Jf = m.FV()
Jf.STATUS = 1
m.Connection(Jf,J,pos2='end')
m.Equation(J.dt() == ((A+E*(1-l))*h*Pa0-C*u+E*Pe0+shift)*d)
# maximize U
m.Maximize(Jf)
# options
m.options.IMODE = 6 # optimal control
m.options.NODES = 3 # collocation nodes
m.options.SOLVER = 3 # solver (IPOPT)
# solve optimization problem
m.solve()
# print profit
print('Optimal Profit: ' + str(Jf.value[0]))
【问题讨论】:
标签: python optimization gekko