微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GEKKO错误:在约束和目标内调用函数时,出现“没有等式=或不等式>,<的方程”

如何解决GEKKO错误:在约束和目标内调用函数时,出现“没有等式=或不等式>,<的方程”

我的代码一直出现以下错误,并且我完全不知道该错误的来源:

@error: Equation DeFinition
Equation without an equality (=) or inequality (>,<)
true
STOPPING...

我正在寻求确定解决方案“ x”,该解决方案在满足“ warf_moodys_constraint”设置的约束的情况下将函数“ was_constraint”的结果最小化。这些函数返回一个浮点值,当我分别将初始启动向量'x'分别传递给每个函数时,我不会从这些函数中收到任何错误。谁能告诉我可能要去哪里了吗?

def was_constraint(sol_g,df,orig):
    sol = gekko_to_numpy(sol_g)
    x1 = orig.loc["Denominator","WAS"]*orig.loc["Current","WAS"]
    x2 = (sol*df["All-In Rate"]).sum()/100
    y1 = orig.loc["Denominator","WAS"]+sum(sol)
    return y1/(x1+x2)

def warf_moodys_constraint(sol_g,"Moodys WARF"]*orig.loc["Current","Moodys WARF"]
    x2 = sum(np.where(sol > 0,sol*df["Moody's WARF"],0))
    y1 = orig.loc["Denominator","Moodys WARF"] +sum(np.where(sol > 0,sol,0))
    return 3000 - (x1+x2)/y1 

def gekko_to_numpy(sol_g):
    res = np.zeros(len(sol_g))
    for i in range(len(sol_g)):
        res[i] = sol_g[i].value.value
    return res

clo_data = pd.read_excel('CLO.xlsx',sheet_name='CLO')
m = GEKKO()
x = [m.Var() for i in range(len(clo_data["Holdings"]))]

for i in range(len(clo_data["Lower Bound"])):
    x[i].lower = 0
    x[i].upper = 1000000

m.Equation(warf_moodys_constraint(x,clo_data,metrics)>=0)
m.Obj(was_constraint(x,metrics))
m.options.IMODE = 3 #steady state optimization
m.solve()

解决方法

您需要根据Gekko变量定义方程式。将Gekko变量转换为Numpy数组的方法不适用于定义方程式,因为Gekko不会对Python函数进行回调。

def gekko_to_numpy(sol_g):
    res = np.zeros(len(sol_g))
    for i in range(len(sol_g)):
        res[i] = sol_g[i].value.value
    return res

Gekko在gk_model0.apm可以看到的运行文件夹中构建m.open_folder()模型。当您使用m.solve()进行求解时,Gekko会将模型编译为字节码,并使用稀疏的非线性求解器(例如IPOPTAPOPT)对其进行求解。如果您不能使用Gekko变量,那么scipy.opitimize.minimize()函数可能是一个更好的选择。这是tutorial with that optimizer

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。