【问题标题】:scipy.optimize.minimize result outside boundariesscipy.optimize.minimize 结果超出边界
【发布时间】:2016-03-07 22:46:43
【问题描述】:

我有一组 3 个方程要求解。变量 c[0]、c[1]、c[2] 是 -1 到 1 范围内的成本函数。根据我在网上发现的 scipy 优化是最好的方法。等式中除了 c[0] 到 c[3] 之外的所有内容都是常数且已知的。

0 = a + u * c[0]

0 = b + v * c[1] + w * c[2]

0 = d - n * c[1] + m * c[2]

我把它翻译成下面的优化问题与边界和约束,所以我需要SLSQP

c=np.array([])
def fun(c):
    return abs(c[0])+abs(c[1])+abs(c[2])
    
x0 = [0.05,0.05,0.05]

bnds = [(-1.0,1.0),(-1.0,1.0),(-1.0,1.0)]

cons = ({'type': 'eq', 'fun': lambda c: a+u*c[0]},
    {'type': 'eq', 'fun': lambda c: b+v*c[1]+w*c[2]},
    {'type': 'eq', 'fun': lambda c: d-n*c[1]+m*c[2]},
    )

res = minimize(fun, x0, method='SLSQP',
                        bounds=bnds,
                        constraints=cons)

我明白了:

status: 0
success: True
   njev: 3
   nfev: 15
    fun: 33.015905119807698
      x: array([  1.04805004e-02,   1.01768804e+01,  -2.28285442e+01])
message: 'Optimization terminated successfully.'
    jac: array([ 1.,  1., -1.,  0.])
    nit: 3

所以我的界限似乎被忽略了。翻译不等式的边界得到了同样的结果

计算的值为

a = -3943.3960306568406
b = 172710.8224501527
d = -380842.9800419506
u = 376260.28
v = 112878.084
w = 57886.196
n = -3205737.5856
m = 1412423.1824

【问题讨论】:

  • 我很抱歉计算的值很高,但我不想冒险给你错误的输入
  • 尝试使用 Scipy 版本 >= 0.15.0。 (还有——d 的值是多少?)
  • 感谢您的评论。在第一个版本中,我将 d 称为 c 但我认为这会导致对变量的误解,但是我现在修复了它。最初我在 scipy 0.15.1 上运行它,但现在我将它更新到 scipy 0.16.1。结果是奇怪的 res 说它是 101 迭代步骤不成功,但获得的值是好的。
  • 你解决了问题@pv。 ,我现在面对的是一个不同的人^^ 将其作为答案发布,以便我接受它
  • 您的方程组可以手动求解 - 这些值与输出相比如何?通过检查,c[0] 确实是正确的。

标签: python python-3.x optimization scipy


【解决方案1】:

尝试使用 Scipy 版本 >= 0.15.0。

SLSQP 例程在先前版本中存在一个已知错误,即在未给出约束函数的雅可比的情况下。

【讨论】:

    猜你喜欢
    • 2016-03-17
    • 2016-09-01
    • 2013-05-02
    • 2014-07-13
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多