我的代码出现以下错误,我完全不知道错误的来源:
@error: Equation Definition
Equation without an equality (=) or inequality (>,<)
true
STOPPING...
我试图确定解决方案“x”,该方案将函数“was_约束”的结果最小化,但需满足“warf_moodys_约束”设置的约束。这些函数返回一个浮点值,当我将初始起始向量“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, df, orig):
sol = gekko_to_numpy(sol_g)
x1 = orig.loc["Denominator","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, clo_data, metrics))
m.options.IMODE = 3 #steady state optimization
m.solve()
你需要用Gekko变量来定义方程。将Gekko变量转换为Numpy数组的方法无法定义表达式,因为Gekko不会回调Python函数
Gekko在运行文件夹中构建了
gk_model0.apm
模型,您可以通过m.open_folder()
看到它。当您使用m.solve()
进行求解时,Gekko将模型编译为字节码,并使用稀疏非线性解算器(如IPOPT
或APOPT
)进行求解。如果不能使用Gekko变量,那么scipy.opitimize.minimize()
函数可能是更好的选择。这是一个tutorial with that optimizer相关问题 更多 >
编程相关推荐