如何用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)
关键修改说明
- 数组维度统一:所有输入变量(B、l、u、x0)都转为一维数组,避免和
minimize传入的一维x产生维度冲突。 - 约束函数适配:
np.matmul(A, x)当x是一维时,返回的是一维数组,和一维B相减后得到的结果符合SLSQP对等式约束的要求(返回一维数组,每个元素对应一个等式约束)。 - 目标函数适配:一维数组的减法运算直接生效,
np.linalg.norm可以正常计算范数。
内容的提问来源于stack exchange,提问作者Radu
相关产品推荐
相关产品推荐

