gpt4 book ai didi

python - scipy.minimize 似乎不遵守约束

转载 作者:行者123 更新时间:2023-12-01 09:23:11 67 4
gpt4 key购买 nike

scipy.minimize 似乎不遵守约束。这是一个简单的示例,其中约束是为了防止对数中的负参数,但最小化函数不遵守:

import math
from scipy.optimize import minimize

def obj(x,b):
print "obj x",x
return math.log(x-b)

def constr(x,b):
print "constr x",x
return x-b

x=3.1
b=3
a=minimize(obj,x,args=(b),constraints={'type': 'ineq', 'fun':constr,'args':[b]})

输出是:

constr x [ 3.1]
obj x [ 3.1]
constr x [ 3.1]
obj x [ 3.1]
obj x [ 3.10000001]
constr x [ 3.1]
constr x [ 3.10000001]
obj x [ 3.]
Traceback (most recent call last):
File "scipy_minimize_constraints.py", line 19, in
a=minimize(obj,x,args=(b),constraints={'type': 'ineq', 'fun':constr,'args':[b]})
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/_minimize.py", line 495, in minimize
constraints, callback=callback, **options)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/slsqp.py", line 378, in _minimize_slsqp
fx = func(x)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 292, in function_wrapper
return function(*(wrapper_args + args))
File "scipy_minimize_constraints.py", line 9, in obj
return math.log(x-b)
ValueError: math domain error

python2.7Scipy版本1.0.0

我做错了什么吗?

最佳答案

约束

def constr(x,b):
return x-b

结果为x-b >= 0(非负),但允许x-b = 0。如果x-b = 0,则log(x-b)未定义。您需要引入一些 epsilon,例如:

eps = 1e-12
def constr(x,b):
return x-b-eps

这不会抛出你的错误。

但可能有一个更重要的问题:我真的不认为求解器(这里是 SLSQP)保证它的迭代是可行的!在某些情况下这可能会出现问题。在您的简单示例中,解决方法是将约束转换为边界。这当然表达能力较差(并不总是可能;但对于你的小例子来说是这样),但这些界限在迭代中受到尊重!

inferred_lb = b + eps
a = minimize(obj, x, args=(b,), bounds=[(inferred_lb, None)])

(当然:不要使用最小化进行一维优化。有一个最小化标量。)

关于python - scipy.minimize 似乎不遵守约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50638315/

67 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com