首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我试图最小化目标函数时,SciPy约束不能正常工作。

当我试图最小化目标函数时,SciPy约束不能正常工作。
EN

Stack Overflow用户
提问于 2022-07-23 14:20:21
回答 2查看 175关注 0票数 0

我有以下简单的python代码:

代码语言:javascript
运行
复制
from scipy.optimize import minimize

def cons_function(x):

    return x[0] - 1000

def objective(x):
    a = x[0]
    
    return a ** 5

x0 = [0]
cons_dict = [{'type':'ineq', 'fun': cons_function}]
res = minimize(objective, x0, constraints=cons_dict)

print('x: ', res.x)
print('fun: ',res.fun)

产出如下:

代码语言:javascript
运行
复制
x:  [-2.64828354e+12]
fun:  -1.3026339977067573e+62 

但是x的值应该大于1000。目标函数的最小值为10e+15

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-23 14:51:47

您最初的猜测是x0是不可行的,通过检查返回优化结果res可以看出与约束相矛盾。

代码语言:javascript
运行
复制
     fun: -1.3026339977067573e+62
     jac: array([2.45939306e+50])
 message: 'Inequality constraints incompatible'
    nfev: 50
     nit: 16
    njev: 15
  status: 4
 success: False
       x: array([-2.64828354e+12])

您总是必须使用满足所有约束条件的可行的初始猜测。还请注意,您的约束是变量上的一个简单绑定,因此建议将其作为一个绑定传递,而不是更一般的约束:

代码语言:javascript
运行
复制
from scipy.optimize import minimize

def objective(x):
    a = x[0]
    return a ** 5

# 1000 <= x[0] <= None is equivalent to 1000 <= x[0] <= Inf
bounds = [(1000, None)]
x0 = [1002]
res = minimize(objective, x0, bounds=bounds)

print('x: ', res.x)
print('fun: ',res.fun)
票数 1
EN

Stack Overflow用户

发布于 2022-07-23 14:31:55

请检查您正在使用的方法的文档。根据优化方法的不同,使用甚至忽略了约束。https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html

备注

如果未给出

,则选择为BFGS、L B、SLSQP之一,这取决于问题是否具有约束或边界。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73091499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档