我尝试将目标函数从scipy转换为Gurobi,如下所示,但得到的结果是“**或pow()不支持的操作数类型:'gurobipy.LinExpr‘和'float'”。你知道我该怎么重写下面的内容吗?提前谢谢。
from gurobipy import *
import scipy.optimize as optimize
price = 95.0428
par = 100.0
T = 1.5
coup = 5.75
freq = 2
guess = 0.05
freq = float(freq)
periods = T * freq
coupon = coup / 100. * par / freq
dt = [(i + 1) / freq for i in range(int(periods))]
#coverting the below scipy.optimize to Gurobi
#ytm_func = lambda y: sum([coupon / (1 + y / freq) ** (freq * t) for t in dt]) + (par / (1 + y / freq) ** (freq * T)) - price
#optimize.newton(ytm_func, guess)
m = Model()
y = m.addVar(vtype=GRB.CONTINUOUS, name='y')
m.setObjective(quicksum([coupon / (1 + y / freq) ** (freq * t) for t in dt]) + (par / (1 + y / freq) ** (freq * T)) - price, GRB.MINIMIZE)
m.optimize()
m.printAttr('X')发布于 2019-08-23 07:09:02
嗨,我认为你正在尝试做的事情还没有得到gurobi的支持。至少不是二次规划。
首先,你的变量在分母中,这不是直接被建议/支持的;其次,你定义的不是一个二次问题。这是一个多项式问题。据我所知,gurobi目前只支持带有y*y等表达式的二次程序
这是一个无约束的问题,所以我想知道你为什么需要gurobi。科学求解者使用梯度下降、牛顿等方法很好地处理了这些问题。
我希望这能帮到你
https://stackoverflow.com/questions/57383934
复制相似问题