使用Scipy Minimize时持续遭遇奇异矩阵错误求助
优化20×5矩阵时的奇异矩阵错误排查与修复
问题背景
尝试优化一个20×5的矩阵以最大化返回值y,核心约束为矩阵所有元素的总和必须处于指定的最小与最大范围之间,但运行时持续出现奇异矩阵错误。
错误信息
Singular matrix C in LSQ subproblem (Exit mode 6) Current function value: -3.0867160133139926 Iterations: 1 Function evaluations: 261 Gradient evaluations: 1
代码中的关键问题
你的代码存在多处逻辑错误,直接导致优化失败:
- 未定义的函数与变量:目标函数
obj_func引用了未定义的output_matrix,优化时调用的cost函数完全没定义;callback函数未实现却传入minimize方法。 - 维度不匹配:要优化的是20×5矩阵(共100个元素),但初始矩阵
start_matrix只生成20个元素,bounds却设置了260个,维度完全不对应。 - 参数传递错误:
optimizer_result函数定义仅接受3个参数,但调用时传入了5个参数,且变量名不匹配(定义用tot_min_sum,调用用total_matrix_min_sum)。 - 最大化逻辑错误:
scipy.optimize.minimize是求最小值的方法,若要最大化目标函数,需返回目标值的负数。 - 冗余变量:定义了52×5的
matrix_input但未在优化逻辑中使用,属于无效变量。
修复后的代码
import numpy as np import scipy.optimize as so import random # 定义目标函数:最大化矩阵元素和,转为最小化问题实现 def obj_func(matrix_flat): # 将扁平化数组还原为20×5矩阵 matrix = matrix_flat.reshape(20, 5) # 返回负的矩阵和,让minimize实现最大化效果 return -np.sum(matrix) # 优化器函数 def optimizer_result(tot_min_sum, tot_max_sum): # 约束:矩阵总和在[tot_min_sum, tot_max_sum]区间内 constraints_list = [ {'type': 'ineq', 'fun': lambda x: np.sum(x) - tot_min_sum}, {'type': 'ineq', 'fun': lambda x: tot_max_sum - np.sum(x)} ] # 生成初始矩阵:扁平化的20×5矩阵,元素随机取0-3 start_matrix = [random.randint(0, 3) for _ in range(20*5)] # 每个元素的边界:非负,上限设为总和最大值(可按需调整) bounds = [(0, tot_max_sum)] * (20*5) # 运行优化器 optimizer_solution = so.minimize( obj_func, start_matrix, method='SLSQP', bounds=bounds, tol=0.01, options={'disp': True, 'maxiter': 100}, constraints=constraints_list ) # 将结果还原为20×5矩阵 optimizer_solution.x = optimizer_solution.x.reshape(20,5) return optimizer_solution # 初始化约束参数 tot_min_sum = 0 tot_max_sum = 20000 # 执行优化 y = optimizer_result(tot_min_sum, tot_max_sum) print(y) print("优化后的矩阵总和:", np.sum(y.x))
修复说明
- 修正目标函数逻辑:将扁平化输入还原为目标矩阵,返回负的矩阵和,利用
minimize实现最大化需求。 - 统一维度:初始矩阵和边界都设置为100个元素,匹配20×5矩阵的规模。
- 修复参数传递:调整
optimizer_result的参数与调用逻辑一致,移除无效参数。 - 清理冗余内容:删除未定义的
callback和无用的matrix_input变量。 - 简化约束表达式:第二个不等式约束直接写为
tot_max_sum - np.sum(x),逻辑更清晰。
内容的提问来源于stack exchange,提问作者star_it8293
相关产品推荐
相关产品推荐

