具有非线性函数和 2 个输入的 Gekko 优化误差
Gekko optimisation error with a nonlinear function and 2 inputs
我想最大化具有两个输入的凹函数
最大 2 * x1 ** .8 + 1.4 * x2 ** .9
st x1 + x2 == C
使用 Gekko,但我收到错误代码 -2。
from gekko import GEKKO
m = GEKKO()
C = m.Param(value=10)
x1, x2 = [m.Var(lb=0, ub=10) for i in range(2)]
x1.value = 5
x2.value = 5
m.Equation(x1 + x2 == C)
m.Obj(2 * x1 ** .8 + 1.4 * x2 ** .9)
m.options.IMODE = 3
m.solve()
print(x1.value)
print(x2.value)
通过切换到 APOPT 求解器,有一个成功的解决方案 m.options.SOLVER = 1
。在这种情况下,默认求解器 IPOPT 无法找到解决方案,但 APOPT 会成功。
from gekko import GEKKO
m = GEKKO()
x1, x2 = m.Array(m.Var,2,value=5,lb=0,ub=10)
m.Equation(x1+x2 == 10)
m.Minimize(2 * x1 ** .8 + 1.4 * x2 ** .9)
m.options.IMODE = 3
m.options.SOLVER = 1
m.solve()
print(x1.value)
print(x2.value)
带有解的等值线图显示它确实达到了沿着黑线的最优值(x1+x2=10 约束)。
# Generate a contour plot
import numpy as np
import matplotlib.pyplot as plt
# Design variables at mesh points
xg = np.arange(0.0, 10.0, 0.1)
yg = np.arange(0.0, 10.0, 0.1)
x1g,x2g = np.meshgrid(xg, yg)
# Equation / Constraint
eq1 = x1g+x2g
# Objective
obj = 2*x1g**0.8 + 1.4*x2g**0.9
# Create a contour plot
plt.figure()
# Objective
CS = plt.contour(x1g,x2g,obj)
plt.clabel(CS, inline=1, fontsize=10)
# Equation
CS = plt.contour(x1g,x2g,eq1,[10.0],colors='k',linewidths=[4.0])
plt.clabel(CS, inline=1, fontsize=10)
# Plot optimal point
plt.plot(x1.value[0],x2.value[0],'o',color='orange',markersize=10)
plt.xlabel('x1'); plt.ylabel('x2')
plt.savefig('contour.png')
plt.show()
橙色圆点是 x1=0
和 x2=10
处的最优解。
编辑:最大化而不是最小化
问题陈述是最大化而不是最小化。谢谢指正。
from gekko import GEKKO
m = GEKKO()
x1, x2 = m.Array(m.Var,2,value=5,lb=0,ub=10)
m.Equation(x1+x2 == 10)
m.Maximize(2 * x1 ** .8 + 1.4 * x2 ** .9)
m.options.IMODE = 3
m.options.SOLVER = 1
m.solve()
print(x1.value)
print(x2.value)
# Generate a contour plot
import numpy as np
import matplotlib.pyplot as plt
# Design variables at mesh points
xg = np.arange(0.0, 10.0, 0.1)
yg = np.arange(0.0, 10.0, 0.1)
x1g,x2g = np.meshgrid(xg, yg)
# Equation / Constraint
eq1 = x1g+x2g
# Objective
obj = 2*x1g**0.8 + 1.4*x2g**0.9
# Create a contour plot
plt.figure()
# Objective
CS = plt.contour(x1g,x2g,obj)
plt.clabel(CS, inline=1, fontsize=10)
# Equation
CS = plt.contour(x1g,x2g,eq1,[10.0],colors='k',linewidths=[4.0])
plt.clabel(CS, inline=1, fontsize=10)
# Plot optimal point
plt.plot(x1.value[0],x2.value[0],'o',color='orange',markersize=10)
plt.xlabel('x1'); plt.ylabel('x2')
plt.savefig('contour.png')
plt.show()
我想最大化具有两个输入的凹函数
最大 2 * x1 ** .8 + 1.4 * x2 ** .9
st x1 + x2 == C
使用 Gekko,但我收到错误代码 -2。
from gekko import GEKKO
m = GEKKO()
C = m.Param(value=10)
x1, x2 = [m.Var(lb=0, ub=10) for i in range(2)]
x1.value = 5
x2.value = 5
m.Equation(x1 + x2 == C)
m.Obj(2 * x1 ** .8 + 1.4 * x2 ** .9)
m.options.IMODE = 3
m.solve()
print(x1.value)
print(x2.value)
通过切换到 APOPT 求解器,有一个成功的解决方案 m.options.SOLVER = 1
。在这种情况下,默认求解器 IPOPT 无法找到解决方案,但 APOPT 会成功。
from gekko import GEKKO
m = GEKKO()
x1, x2 = m.Array(m.Var,2,value=5,lb=0,ub=10)
m.Equation(x1+x2 == 10)
m.Minimize(2 * x1 ** .8 + 1.4 * x2 ** .9)
m.options.IMODE = 3
m.options.SOLVER = 1
m.solve()
print(x1.value)
print(x2.value)
带有解的等值线图显示它确实达到了沿着黑线的最优值(x1+x2=10 约束)。
# Generate a contour plot
import numpy as np
import matplotlib.pyplot as plt
# Design variables at mesh points
xg = np.arange(0.0, 10.0, 0.1)
yg = np.arange(0.0, 10.0, 0.1)
x1g,x2g = np.meshgrid(xg, yg)
# Equation / Constraint
eq1 = x1g+x2g
# Objective
obj = 2*x1g**0.8 + 1.4*x2g**0.9
# Create a contour plot
plt.figure()
# Objective
CS = plt.contour(x1g,x2g,obj)
plt.clabel(CS, inline=1, fontsize=10)
# Equation
CS = plt.contour(x1g,x2g,eq1,[10.0],colors='k',linewidths=[4.0])
plt.clabel(CS, inline=1, fontsize=10)
# Plot optimal point
plt.plot(x1.value[0],x2.value[0],'o',color='orange',markersize=10)
plt.xlabel('x1'); plt.ylabel('x2')
plt.savefig('contour.png')
plt.show()
橙色圆点是 x1=0
和 x2=10
处的最优解。
编辑:最大化而不是最小化
问题陈述是最大化而不是最小化。谢谢指正。
from gekko import GEKKO
m = GEKKO()
x1, x2 = m.Array(m.Var,2,value=5,lb=0,ub=10)
m.Equation(x1+x2 == 10)
m.Maximize(2 * x1 ** .8 + 1.4 * x2 ** .9)
m.options.IMODE = 3
m.options.SOLVER = 1
m.solve()
print(x1.value)
print(x2.value)
# Generate a contour plot
import numpy as np
import matplotlib.pyplot as plt
# Design variables at mesh points
xg = np.arange(0.0, 10.0, 0.1)
yg = np.arange(0.0, 10.0, 0.1)
x1g,x2g = np.meshgrid(xg, yg)
# Equation / Constraint
eq1 = x1g+x2g
# Objective
obj = 2*x1g**0.8 + 1.4*x2g**0.9
# Create a contour plot
plt.figure()
# Objective
CS = plt.contour(x1g,x2g,obj)
plt.clabel(CS, inline=1, fontsize=10)
# Equation
CS = plt.contour(x1g,x2g,eq1,[10.0],colors='k',linewidths=[4.0])
plt.clabel(CS, inline=1, fontsize=10)
# Plot optimal point
plt.plot(x1.value[0],x2.value[0],'o',color='orange',markersize=10)
plt.xlabel('x1'); plt.ylabel('x2')
plt.savefig('contour.png')
plt.show()