我在使用SLSQP方法时遇到了一些麻烦。我希望这不是什么愚蠢的事。因此,最小代码如下:
import numpy as np
import scipy.optimize as scopt
def loss(x,r):
return -np.dot(x,r)
def opt(r):
def cons(x):
return sum(x)
cons = [{'type': 'eq', 'fun': cons}]
x_opt = scopt.minimize(loss, [0., 0.], method='SLSQP', constraints=cons, args = (r,))
return x_opt
对于上下文,考虑到一些回报r,将其视为来自一组投资额x的损失的最小化。唯一的限制是没有资金的创造,所以投资的总和应该是0。
所以,如果我设置r = [0.,0.1],一切都很好,函数会返回一个错误,因为没有最小值 - 你可以将x [0]设置为负无穷大,将x [1]设置为加号无穷大,以最大化您的利润。但是如果我设置r = [0.,0.001],那么就没有错误,函数总是返回初始值(这里是[0.,0。])。
这似乎是一个来自舍入错误的错误,但我很惊讶,因为这种方法被广泛使用......我想念一些东西吗?
我正在使用python3和scipy 0.14。
编辑: 我确信这是现在的错误,因为我试图用cvxopt模块解决这个优化问题,它返回正确的解决方案。我已经报告了这个错误,我正在等待scipy家伙的确认,然后再回答这个问题。如果这不是正确的做法,有人告诉我,我是新人。