首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NonlinearConstraints在SciPy优化中的应用

NonlinearConstraints在SciPy优化中的应用
EN

Stack Overflow用户
提问于 2021-11-04 12:35:46
回答 1查看 673关注 0票数 1

我试图在SciPy中使用优化模块,只是编写简短的试用程序。当存在线性约束时,我可以得到解,但Hessian定义不起作用。我已经在本站上使用了这个例子,但是当我尝试不使用内置的Rosenberg函数及其内建函数时,会出现一个错误。

也尝试了一个简单的在线问题,我的代码是:

代码语言:javascript
复制
import numpy as np
from scipy import optimize
from scipy.optimize import NonlinearConstraint

def fun(x):
    return x[0]**2+x[1]**2-8*x[1]+16

bounds = optimize.Bounds([0,0,0],[np.inf,np.inf,np.inf])

def cons_f(x):
    return x[0]**2+x[1]**2+x[2]
def cons_J(x):
    return [2*x[0],2*x[1],1]
def cons_H(x,v):
    return v[0]*[2,2,0]
nonlinear_constraint = optimize.NonlinearConstraint(cons_f, -np.inf, 6, jac=cons_J, hess=cons_H)

x0=[1,1]
res = optimize.minimize(fun, x0, method='trust-constr', jac=cons_J, hess=cons_H,
               constraints=[nonlinear_constraint],
               options={'verbose': 1}, bounds=bounds)
print(res.x)

在这两种情况下,我都会得到以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "C:\Users\user\OneDrive - EOP\Escritorio\Test.py", line 19, in <module>
    res = optimize.minimize(fun, x0, method='trust-constr', jac=cons_J, hess=cons_H,
  File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\scipy\optimize\_minimize.py", line 634, in minimize
    return _minimize_trustregion_constr(fun, x0, args, jac, hess, hessp,
  File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\scipy\optimize\_trustregion_constr\minimize_trustregion_constr.py", line 332, in _minimize_trustregion_constr
    objective = ScalarFunction(fun, x0, args, grad, hess,
  File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\scipy\optimize\_differentiable_functions.py", line 163, in __init__
    self.H = hess(np.copy(x0), *args)
TypeError: cons_H() missing 1 required positional argument: 'v'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-04 14:32:01

这里有几件事情出了问题:

  1. 通过设置jac=cons_Jhess=cons_H,您将使用约束函数的导数作为目标导数,这可能不是您想要做的。
  2. 约束条件cons_H是错误的。
  3. 约束函数是三个变量的函数,但是您最初的猜测x0minimize认为您有两个变量的优化问题。

修复所有问题后,代码如下所示:

代码语言:javascript
复制
import numpy as np
from scipy.optimize import Bounds, minimize, NonlinearConstraint

# objective and derivatives
def fun(x):
    return x[0]**2+x[1]**2-8*x[1]+16

def grad(x):
    return np.array([2*x[0], 2*x[1]-8, 0])

def hess(x):
    return np.array([[2, 0, 0], [0, 2, 0], [0, 0, 0]])

# constraint function and derivatives
def cons_f(x): return x[0]**2+x[1]**2+x[2]
def cons_J(x): return [2*x[0],2*x[1],1]
def cons_H(x,v): return v[0]*np.array([[2, 0, 0], [0, 2, 0], [0, 0, 0]])


# variable bounds
bounds = Bounds([0,0,0],[np.inf,np.inf,np.inf])

# constraint
con = NonlinearConstraint(cons_f, -np.inf, 6, jac=cons_J, hess=cons_H)

# initial guess
x0=[1,1,1]

res = minimize(fun, x0, method='trust-constr', jac=grad, hess=hess,
               constraints=[con], bounds=bounds)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69839367

复制
相关文章

相似问题

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