scipy 在Python中使用SLSQP最小化问题

2lpgd968  于 2023-06-23  发布在  Python
关注(0)|答案(1)|浏览(172)

我遇到了一个问题,当试图在Python中最小化以下函数时,float是不可迭代的。我已经检查过了,问题似乎在于我如何使用这个最小化。只是为了澄清,传递给a和b的值将在0.0和1.0之间。任何想法都非常感谢!
我把一些代码放在这里只是为了展示:

def func1(x):
return (x-1)\*\*2

def func2(x):
return math.pow(x-0.5,2)

p1 = 1.0 - a
p2 = 1.0 - b

bound1 = (0.0,p1)
bound2 = (0.0,p2)

x0 = 0.5

result1 = minimize(func1, x0, method='SLSQP', bounds = bound1)#, options={'maxiter':3})
result2 = minimize(func2, x0, method='SLSQP', bounds = bound2)#, options={'maxiter':3})

newX = result1.x
newY = result2.x
rlcwz9us

rlcwz9us1#

问题是bounds需要一个元组列表(或者Bounds对象),而这里您只是提供了一个元组。
由于你的成本函数只有一个参数可以应用边界,你只需要将当前的bounds更改为一个包含一个元组的列表,如下所示:

# bound1 = (0.0,p1)
bound1 = [(0.0,p1)]

# bound2 = (0.0,p2)
bound2 = [(0.0,p2)]

下面是工作代码:

import math
from scipy.optimize import minimize

def func1(x):
    return (x-1) ** 2

def func2(x):
    return math.pow(x-0.5,2)

a, b = .2, .5
p1 = 1.0 - a
p2 = 1.0 - b

bound1 = [(0.0,p1)]
bound2 = [(0.0,p2)]

x0 = 0.5

result1 = minimize(func1, x0, method='SLSQP', bounds = bound1)#, options={'maxiter':3})
result2 = minimize(func2, x0, method='SLSQP', bounds = bound2)#, options={'maxiter':3})

newX = result1.x
newY = result2.x

print(newX, newY) # [0.8] [0.5]

相关问题