使用scipy minimize trust-constr时出现expected square matrix错误的问询
问题原因分析
- 约束冗余导致雅可比矩阵秩不足:你用到的两个等式约束
sin(x)=0和cos(2x + π/2)=0并非线性独立。化简第二个约束可得:cos(2x + π/2) = -sin(2x) = -2sinx·cosx = 0
当sin(x)=0成立时,第二个约束自动满足,属于完全冗余的约束。trust-constr方法要求等式约束的雅可比矩阵必须列满秩(即约束之间线性无关),冗余约束会导致雅可比矩阵的秩小于约束数量,方法内部计算拉格朗日海塞矩阵等关键矩阵时,无法得到预期的方阵结构,因此抛出ValueError('expected square matrix')。 - 单约束无报错的原因:仅使用单个等式约束或不等式约束时,雅可比矩阵的秩等于约束数量,满足方法的数学要求,因此不会触发错误。
解决方法
- 移除冗余约束:手动化简约束集合,只保留独立的约束即可。你的例子中,两个等式约束可合并为
sin(x)=0,再结合不等式约束x ≥ 1/2,可行解为x = kπ(k为正整数,且kπ ≥ 1/2)。 - 提前验证约束独立性:对多约束场景,用sympy计算等式约束的雅可比矩阵,检查其秩是否等于约束数量。比如针对你的变量x:
当from sympy import symbols, sin, cos, pi, diff x = symbols('x') eq1 = sin(x) eq2 = cos(2*x + pi/2) # 计算雅可比元素 jac_eq1 = diff(eq1, x) # 结果为cos(x) jac_eq2 = diff(eq2, x) # 结果为-2*sin(2x) = -4*sinx*cosxsinx=0时,jac_eq2=0,雅可比矩阵的两行线性相关,秩为1,小于约束数量2,明确说明约束冗余。 - 检查导数矩阵维度:用sympy生成雅可比、海塞矩阵后,转换为数值函数时要确保输出维度符合scipy要求。比如单个变量x的约束雅可比应为1维数组,多个约束的雅可比需是
(约束数量, 变量数量)的二维数组。若维度错误也可能引发类似报错,可在代码中打印矩阵形状排查。
内容的提问来源于stack exchange,提问作者Scacco Matto
相关产品推荐
相关产品推荐

