使用NumPy/SciPy最小化行列式时遇UFuncTypeError错误求助
解决SciPy minimize计算行列式时的UFuncTypeError错误
问题原因
scipy.optimize.minimize在优化过程中,会向目标函数传递单元素numpy数组作为参数(即使初始值x0是标量)。此时你的N函数生成的数组会因为混合了标量和数组元素,被自动推断为object dtype,而np.linalg.det无法处理object类型的数组,因此抛出类型转换错误。
单独调用obj(0.054)正常是因为此时传入的是标量float,N生成的是float64类型数组,det可以正常计算。
解决方案
有两种简单的修复方式:
方式一:在目标函数中将参数转为标量
修改目标函数,把minimize传递的数组参数转为标量:
obj = lambda f: np.abs(np.linalg.det(N(xi, float(f)))) # 或者更稳妥的处理单元素数组: # obj = lambda f: np.abs(np.linalg.det(N(xi, f.item())))
方式二:显式指定数组的数值类型
修改N函数,强制返回float64类型的数组,避免dtype被推断为object:
def N(xi,f): return np.array([[1,f],[xi,1]], dtype=np.float64)
验证
修改后重新运行minimize即可正常执行:
m = minimize(obj, x0) print(m)
内容的提问来源于stack exchange,提问作者DieLuftDerFreiheit
相关产品推荐
相关产品推荐

