使用scipy.optimize.minimize时遇非均匀形状ValueError的解决方案咨询
解决scipy.optimize.minimize中矩阵构造的ValueError问题
问题背景
尝试用scipy.optimize.minimize寻找函数取0时的x值,函数最终输出单个数值,但内部包含矩阵操作,运行时触发如下错误:
ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (6,) + inhomogeneous part.
报错原因
- 矩阵行长度不一致:构造矩阵
A时,第二行[0 - 1, 4, 2*x, 0, 0]仅包含5个元素,而其他行都是6个元素,numpy无法生成形状均匀的二维数组,导致报错。 - 输入参数类型不匹配:
scipy.optimize.minimize会将单变量的初始值x0转换为1维numpy数组传入目标函数,但example函数定义输入为float类型,直接使用会导致后续计算的变量成为数组,可能引发潜在问题。
修复方案
- 修正矩阵
A的第二行,补充一个元素(如0),确保每行都有6个元素,符合6x6矩阵的要求。 - 在
example函数开头将输入的数组x转换为标量,比如x = x.item(),适配函数内部的标量计算逻辑。 - 调整x的取值下界,避免
d = 14*np.sqrt(1/x)中出现除以0的情况,将bounds设为(1e-6, 10000)。
完整修复代码
import numpy as np from scipy.optimize import minimize from scipy.linalg import solve def example(x) -> float: # 将minimize传入的数组x转换为标量 x = x.item() a = 4 b = 4*x c = 18*np.sin(x) d = 14*np.sqrt(1/x) # 修正第二行,补充一个0,确保每行6个元素 A = np.matrix([[0, 0, 0, -1, 1, -1], [0 - 1, 4, 2*x, 0, 0, 0], [1, 3*x-4, 4, 18, 2, 0], [0, 0, 1, 0, 0, 0], [3*x, 2*a, b, d, 0, 0], [0, 0, d, d-c, 0, 0] ]) b_vec = np.matrix([[0], [0], [b-c], [c/d], [4*a], [b*a-c] ]) C1, C2, C3, C4, C5, C6 = np.squeeze(solve(A, b_vec)) val = C1 * np.sin(a * 2) + C2 * c**2 + 4*C3*x**2 + d*C4 + C5*x + C6 return val func = lambda x: example(x) # 调整下界避免除以0 result = minimize(func, x0=15, bounds=[(1e-6, 10000)]) print(result)
说明
修复后函数可正常运行,scipy.optimize.minimize能正常执行优化流程。注意矩阵构造时需严格保证每行元素数量一致,同时处理好minimize输入参数的类型转换,避免因数组与标量混合计算引发的问题。
内容的提问来源于stack exchange,提问作者ContourplotTroubles
相关产品推荐
相关产品推荐

