Python 具有非线性函数和2个输入的Gekko优化误差

Python 具有非线性函数和2个输入的Gekko优化误差,python,nonlinear-optimization,gekko,Python,Nonlinear Optimization,Gekko,我想最大化两个输入的凹函数 最大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 **

我想最大化两个输入的凹函数

最大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 solver
m.options.solver=1
,可以获得成功的解决方案。在这种情况下,默认解算器IPOPT无法找到解决方案,但APOPT成功

从gekko导入gekko
m=GEKKO()
x1,x2=m.Array(m.Var,2,value=5,lb=0,ub=10)
m、 方程(x1+x2==10)
m、 最小化(2*x1**.8+1.4*x2**.9)
m、 options.IMODE=3
m、 options.SOLVER=1
m、 解决()
打印(x1.值)
打印(x2.值)

具有该解决方案的等高线图显示,它确实沿黑线达到了最佳值(x1+x2=10)

#生成等高线图
将numpy作为np导入
将matplotlib.pyplot作为plt导入
#网格点处的设计变量
xg=np.arange(0.0,10.0,0.1)
yg=np.arange(0.0,10.0,0.1)
x1g,x2g=np.meshgrid(xg,yg)
#等式/约束
eq1=x1g+x2g
#客观的
obj=2*x1g**0.8+1.4*x2g**0.9
#创建等高线图
plt.图()
#客观的
CS=零件轮廓(x1g、x2g、obj)
plt.clabel(CS,inline=1,fontsize=10)
#方程式
CS=plt.轮廓(x1g,x2g,eq1,[10.0],颜色=k',线宽=4.0])
plt.clabel(CS,inline=1,fontsize=10)
#绘图最佳点
plt.绘图(x1.值[0],x2.值[0],'o',颜色=橙色,标记大小=10)
plt.xlabel('x1');plt.ylabel('x2')
plt.savefig('contour.png'))
plt.show()
橙色圆点是
x1=0
x2=10
的最佳解决方案

编辑:最大化而不是最小化

问题陈述是最大化而不是最小化。谢谢你的更正

从gekko导入gekko
m=GEKKO()
x1,x2=m.Array(m.Var,2,value=5,lb=0,ub=10)
m、 方程(x1+x2==10)
m、 最大化(2*x1**.8+1.4*x2**.9)
m、 options.IMODE=3
m、 options.SOLVER=1
m、 解决()
打印(x1.值)
打印(x2.值)
#生成等高线图
将numpy作为np导入
将matplotlib.pyplot作为plt导入
#网格点处的设计变量
xg=np.arange(0.0,10.0,0.1)
yg=np.arange(0.0,10.0,0.1)
x1g,x2g=np.meshgrid(xg,yg)
#等式/约束
eq1=x1g+x2g
#客观的
obj=2*x1g**0.8+1.4*x2g**0.9
#创建等高线图
plt.图()
#客观的
CS=零件轮廓(x1g、x2g、obj)
plt.clabel(CS,inline=1,fontsize=10)
#方程式
CS=plt.轮廓(x1g,x2g,eq1,[10.0],颜色=k',线宽=4.0])
plt.clabel(CS,inline=1,fontsize=10)
#绘图最佳点
plt.绘图(x1.值[0],x2.值[0],'o',颜色=橙色,标记大小=10)
plt.xlabel('x1');plt.ylabel('x2')
plt.savefig('contour.png'))
plt.show()

这很有趣,我不认为边缘解决方案是正确的,有一个更好的解决方案很有趣:13.264488129859771,x:array([6.32660461,3.67339539])啊,我现在知道了,你需要在你的版本库中用最小化替换最大化-我也会添加这个解决方案。