【发布时间】:2020-05-27 10:22:19
【问题描述】:
Gekko 中是否有单行来检索拉格朗日乘数(类似于 GAMS 中的边际),或者如果没有单行,则另一种方式?
感谢您的帮助。
【问题讨论】:
标签: gekko
Gekko 中是否有单行来检索拉格朗日乘数(类似于 GAMS 中的边际),或者如果没有单行,则另一种方式?
感谢您的帮助。
【问题讨论】:
标签: gekko
这是检索拉格朗日乘数的一行代码。
lam = np.loadtxt(m.path + '/apm_lam.txt')
您需要将诊断级别设置为m.options.DIAGLEVEL=2 并使用m=GEKKO(remote=False) 在本地解决。当您使用m.open_folder() 打开文件夹时,您可以看到使用DIAGLEVEL=2 生成的其他一些文件。这是一个测试脚本。
from gekko import GEKKO
import numpy as np
m = GEKKO(remote=False)
#initialize variables
xi = [1,5,5,1]
x1,x2,x3,x4 = [m.Var(xi[i],lb=1,ub=5) for i in range(4)]
m.Equation(x1*x2*x3*x4>=25)
m.Equation(x1**2+x2**2+x3**2+x4**2==40)
m.Obj(x1*x4*(x1+x2+x3)+x3)
m.options.DIAGLEVEL=2
m.solve(disp=False)
print('')
print('Results')
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('x4: ' + str(x4.value))
print('Lagrange multipliers')
lam = np.loadtxt(m.path + '/apm_lam.txt')
print(lam)
这会产生结果:
Results
x1: [1.000000057]
x2: [4.74299963]
x3: [3.8211500283]
x4: [1.3794081795]
Lagrange multipliers
[-0.55227642 0.16143862]
【讨论】:
m.options.SOLVER=3 的IPOPT 或带有m.options.SOLVER=2 的BPOPT。一些求解器未配置为返回拉格朗日乘数。
m.options.SOLVER=2,它返回了乘数,但没有IPOPT。在 GEKKO 的文档中,我可以在哪里阅读有关此主题(拉格朗日乘数)的信息。到目前为止,我正在研究线性优化问题,优化结果符合预期,但是对于两个求解器,乘数仍然为零。所以它一定是我的实现中的东西。