如何使用Gekko释放变量



我正在尝试使用GEKKO来做简单的代数。

给定方程6=X1*X2,我首先使用Gekkofix()函数将X1设置为2。在求解并打印该方程后,我尝试使用Gekkofree()函数释放X1,并再次使用fix()函数将X2固定为2。free函数似乎没有正确释放X2变量。

from gekko import GEKKO
m = GEKKO()
# Variables
x1 = m.Var()
x2 = m.Var()
# Equation
FindX1 = 6 == x1*x2
m.Equation(FindX1)
# Fix x1 to 2
m.fix(x1, val=2)
# Solve X2
m.solve(disp=False)
print("X1: %s and X2: %s" % (x1.VALUE, x2.VALUE))
# Fix x2 to 2
m.fix(x2, val=2)
# Free x1
m.free(x1)
# Solve X1
m.solve(disp=False)
print("X1: %s and X2: %s" % (x1.VALUE, x2.VALUE))

重新启动文件保留了规范。对于IMODE=3,它是运行目录m.path中的rto.t0。您可以使用删除重新启动文件

import os
os.remove(m.path+'\rto.t0')

有一个选项m.options.SPECS=0也可以忽略重新启动文件中的固定/自由规范,但这不会与求解引擎通信。我创建了一个新的GitHub问题来解决这个bug。

import os
from gekko import GEKKO
m = GEKKO(remote=False)
# Variables
x1 = m.Var()
x2 = m.Var()
# Equation
FindX1 = 6 == x1*x2
m.Equation(FindX1)
# Fix x1 to 2
m.fix(x1, val=2)
# Solve X2
m.solve(disp=False)
print("X1: %s and X2: %s" % (x1.VALUE, x2.VALUE))
# Fix x2 to 2
m.fix(x2, val=2)
# Free x1
m.free(x1)
os.remove(m.path+'\rto.t0')
#m.options.SPECS = 0
# Solve X1
m.solve(disp=False)
print("X1: %s and X2: %s" % (x1.VALUE, x2.VALUE))
m.open_folder()

这会产生正确的响应:

X1: [2.0] and X2: [3.0]
X1: [3.0] and X2: [2.0]

最新更新