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

使用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')。

  • 单约束无报错的原因:仅使用单个等式约束或不等式约束时,雅可比矩阵的秩等于约束数量,满足方法的数学要求,因此不会触发错误。
解决方法
  1. 移除冗余约束:手动化简约束集合,只保留独立的约束即可。你的例子中,两个等式约束可合并为sin(x)=0,再结合不等式约束x ≥ 1/2,可行解为x = kπ(k为正整数,且kπ ≥ 1/2)。
  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*cosx
    
    当sinx=0时,jac_eq2=0,雅可比矩阵的两行线性相关,秩为1,小于约束数量2,明确说明约束冗余。
  3. 检查导数矩阵维度:用sympy生成雅可比、海塞矩阵后,转换为数值函数时要确保输出维度符合scipy要求。比如单个变量x的约束雅可比应为1维数组,多个约束的雅可比需是(约束数量, 变量数量)的二维数组。若维度错误也可能引发类似报错,可在代码中打印矩阵形状排查。

内容的提问来源于stack exchange,提问作者Scacco Matto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:54:54