You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用LinearConstraint调用minimize函数报错:约束需用字典定义

解决scipy.optimize.minimize中LinearConstraint约束报错问题

我尝试在相关矩阵上用LinearConstraint调用minimize函数,结果报错“Constraints must be defined using a dictionary”,不知道怎么用字典形式定义LinearConstraint的线性约束,求解决建议。

使用的数据

col1      col2     col3
   1        0.59  0.68
   0.59  1        0.92
   0.68 0.92  1

计算代码

from scipy.optimize import minimize, LinearConstraint
import numpy as np  # 原代码遗漏numpy导入

A0 = [.3,.4,.3]
bnds = [(1, 1) for i in range(len(A0))]

def test(w):   
    return (w@np.matrix(corr))@w

temp=minimize(test,A0,constraints=(LinearConstraint(np.array([1,1,1]),lb=1.0,ub=1.0), ))

报错信息

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
C:\Program Files\Anaconda3\lib\site-packages\scipy\optimize\slsqp.py in _minimize_slsqp(func, x0, args, jac, bounds, constraints, maxiter, ftol, iprint, disp, eps, callback, **unknown_options)
    253         try:
--> 254             ctype = con['type'].lower()
    255         except KeyError:

TypeError: 'LinearConstraint' object is not subscriptable

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
<ipython-input-332-ce6c477d5282> in <module>
      8     return (w@np.matrix(corr))@w
      9 
---> 10 temp=minimize(test,A0,constraints=(LinearConstraint(np.array([1,1,1]),lb=1.0,ub=1.0), ))

C:\Program Files\Anaconda3\lib\site-packages\scipy\optimize\_minimize.py in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options)
    609     elif meth == 'slsqp':
    610         return _minimize_slsqp(fun, x0, args, jac, bounds,
--> 611                                constraints, callback=callback, **options)
    612     elif meth == 'trust-constr':
    613         return _minimize_trustregion_constr(fun, x0, args, jac, hess, hessp,

C:\Program Files\Anaconda3\lib\site-packages\scipy\optimize\slsqp.py in _minimize_slsqp(func, x0, args, jac, bounds, constraints, maxiter, ftol, iprint, disp, eps, callback, **unknown_options)
    256             raise KeyError('Constraint %d has no type defined.' % ic)
    257         except TypeError:
--> 258             raise TypeError('Constraints must be defined using a '
    259                             'dictionary.')
    260         except AttributeError:

TypeError: Constraints must be defined using a dictionary.

问题原因与解决方法

报错核心原因:LinearConstraint对象仅适配trust-constr优化方法,而你当前使用的是默认的SLSQP方法(minimize在有约束时默认调用SLSQP),SLSQP不支持LinearConstraint类型,只接受字典形式的约束定义。

有两种可行解决方式:

方式1:改用trust-constr方法

直接在minimize调用中指定方法参数,即可直接使用LinearConstraint对象:

temp = minimize(test, A0, constraints=(LinearConstraint(np.array([1,1,1]), lb=1.0, ub=1.0), ), method='trust-constr')

方式2:用字典形式定义约束(适配SLSQP方法)

如果不想更换优化方法,可将线性约束写成字典格式。SLSQP要求约束字典包含type('eq'表示等式约束,'ineq'表示不等式)、fun(约束函数)等键。针对你的等式约束w1 + w2 + w3 = 1,可这样定义:

constraints = ({'type': 'eq', 'fun': lambda w: np.sum(w) - 1})
temp = minimize(test, A0, constraints=constraints)

另外注意:原代码遗漏了numpy的导入语句,需要补充import numpy as np,同时要确保corr变量已正确定义为你的相关矩阵。

内容的提问来源于stack exchange,提问作者Sanchit Aluna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 05:50:25