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

如何用Scipy构建线性最小化问题及解决维度匹配报错

修复Scipy minimize求解优化问题时的维度不匹配错误

错误原因

报错all the input arrays must have same number of dimensions...是因为Scipy的minimize函数会将初始值x0自动展平为一维数组,但你代码中的B、l、u、x0都是二维列向量(shape为(n,1)),导致目标函数和约束函数中出现一维数组与二维数组的运算,维度无法匹配。

修正方案

将所有涉及的数组转换为一维形式,确保运算时维度一致:

  • 把B、l、u、x0从二维列向量转为一维数组(使用.flatten()或直接定义为一维)
  • 调整约束函数和目标函数中的运算逻辑,适配一维数组的计算

修正后的完整代码

import numpy as np
from scipy.optimize import Bounds, minimize

# 保持A的二维矩阵形式不变
A = np.array([[0.11, 0.1333, 0.1333, 0.01],
              [0.02, 6.667, 0.1333, 0.12],
              [0.0933, 0.6667, 0.6, 0.01]])

# 将B、l、u、x0改为一维数组
B = np.array([25, 57, 28])
l = np.array([50, 20, 5, 50])
u = np.array([200, 80, 20, 200])
x0 = np.array([1, 2, 3, 4])

def objfun(x):
    # 现在x是一维,(u-l)/2也是一维,运算维度匹配
    return np.linalg.norm(x - (u - l)/2)

# 初始化Bounds时直接传入一维的l和u
bounds = Bounds(l, u)

# 约束函数:A*x得到一维数组,和一维B相减,返回一维结果符合SLSQP要求
eq_cons = {'type': 'eq', 'fun': lambda x: np.matmul(A, x) - B}

res = minimize(objfun, x0, method='SLSQP',
               constraints=[eq_cons], options={'ftol': 1e-9, 'disp': True},
               bounds=bounds)

# 输出优化结果
print(res.x)

关键修改说明

  1. 数组维度统一:所有输入变量(B、l、u、x0)都转为一维数组,避免和minimize传入的一维x产生维度冲突。
  2. 约束函数适配:np.matmul(A, x)当x是一维时,返回的是一维数组,和一维B相减后得到的结果符合SLSQP对等式约束的要求(返回一维数组,每个元素对应一个等式约束)。
  3. 目标函数适配:一维数组的减法运算直接生效,np.linalg.norm可以正常计算范数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:35:36