微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Scipy.optimize:我应该如何正确编写约束?

如何解决Scipy.optimize:我应该如何正确编写约束?

我想使用 scipy.optimize.minimize 求解 (2+x_1)/(1+x_2)-3x_1+4x_3 的最小值,x_1、x_2 和 x_3 的约束范围在 0.1 到0.9.我的代码如下:

rest = [[0.1,0.9],[0.1,0.9]]
cons = [{'type': 'ineq','fun': lambda x: x[i]-0.1 if j == 0 else lambda x: 0.9-x[i]} for i in range(3) for j in range(2)]
# cons = [{'type': 'ineq','fun': lambda x: x[0]-0.1},#        {'type': 'ineq','fun': lambda x: 0.9-x[0]},'fun': lambda x: x[1]-0.1},'fun': lambda x: 0.9-x[1]},'fun': lambda x: x[2]-0.1},'fun': lambda x: 0.9-x[2]}]
res2 = minimize(lambda x: (2 + x[0]) / (1 + x[1]) - 3 * x[0] + 4 * x[2],np.array((0.5,0.5,0.5)),method='SLSQP',constraints=cons)
res2.fun,res2.success,res2.x

运行它并报告类型错误

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-3caab45922c2> in <module>
      7 #        {'type': 'ineq',8 #        {'type': 'ineq','fun': lambda x: 0.9-x[2]}]
----> 9 res2 = minimize(lambda x: (2 + x[0]) / (1 + x[1]) - 3 * x[0] + 4 * x[2],constraints=cons)
     10 res2.fun,res2.x

~\anaconda3\lib\site-packages\scipy\optimize\_minimize.py in minimize(fun,x0,args,method,jac,hess,hessp,bounds,constraints,tol,callback,options)
    623         return _minimize_cobyla(fun,**options)
    624     elif meth == 'slsqp':
--> 625         return _minimize_slsqp(fun,626                                constraints,callback=callback,**options)
    627     elif meth == 'trust-constr':

~\anaconda3\lib\site-packages\scipy\optimize\slsqp.py in _minimize_slsqp(func,maxiter,ftol,iprint,disp,eps,finite_diff_rel_step,**unkNown_options)
    410     g = append(sf.grad(x),0.0)
    411     c = _eval_constraint(x,cons)
--> 412     a = _eval_con_normals(x,cons,la,n,m,meq,mieq)
    413 
    414     while 1:

~\anaconda3\lib\site-packages\scipy\optimize\slsqp.py in _eval_con_normals(x,mieq)
    484 
    485     if cons['ineq']:
--> 486         a_ieq = vstack([con['jac'](x,*con['args'])
    487                         for con in cons['ineq']])
    488     else:  # no inequality constraint

~\anaconda3\lib\site-packages\scipy\optimize\slsqp.py in <listcomp>(.0)
    484 
    485     if cons['ineq']:
--> 486         a_ieq = vstack([con['jac'](x,*con['args'])
    487                         for con in cons['ineq']])
    488     else:  # no inequality constraint

~\anaconda3\lib\site-packages\scipy\optimize\slsqp.py in cjac(x,*args)
    282                                                  rel_step=finite_diff_rel_step)
    283                     else:
--> 284                         return approx_derivative(fun,x,method='2-point',285                                                  abs_step=epsilon,args=args)
    286 

~\anaconda3\lib\site-packages\scipy\optimize\_numdiff.py in approx_derivative(fun,rel_step,abs_step,f0,sparsity,as_linear_operator,kwargs)
    424 
    425         if sparsity is None:
--> 426             return _dense_difference(fun_wrapped,h,427                                      use_one_sided,method)
    428         else:

~\anaconda3\lib\site-packages\scipy\optimize\_numdiff.py in _dense_difference(fun,use_one_sided,method)
    495             x = x0 + h_vecs[i]
    496             dx = x[i] - x0[i]  # Recompute dx as exactly representable number.
--> 497             df = fun(x) - f0
    498         elif method == '3-point' and use_one_sided[i]:
    499             x1 = x0 + h_vecs[i]

TypeError: unsupported operand type(s) for -: 'function' and 'function'

我不知道为什么未注释的 cons 和注释的 cons 是不等价的。谢谢回答!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。