求矩阵行列式根时Jupyter Notebook弃用警告的问题排查
问题解决:行列式为零的根求解及警告规避
警告来源分析
你遇到的DeprecationWarning是因为使用的root函数(推测是scipy.optimize下的求根函数)会传递数组类型的参数给目标函数test,而你的代码在处理数组类型的x时,会生成元素为数组的矩阵,最终np.linalg.det(A)返回的是数组而非标量,root函数试图将这个多维数组强制转换为标量,触发了弃用警告。
警告规避方案
修改test函数,确保无论输入是标量还是数组,都先转换为标量再计算:
import numpy as np from scipy.optimize import root_scalar def test(x): # 将输入转为标量,兼容数组/标量输入 x_scalar = x.item() if isinstance(x, np.ndarray) else x A = np.zeros((5,5)) for i in range(5): A[i,i] = x_scalar**2 + x_scalar - 4 return np.linalg.det(A) # 使用root_scalar更适合单根求解 result = root_scalar(test, bracket=[0, 3]) print(result.root) # 输出约1.56155
如果坚持使用root函数(适用于多变量求根),则调整函数返回一维数组:
import numpy as np from scipy.optimize import root def test(x): x_val = x[0] A = np.zeros((5,5)) for i in range(5): A[i,i] = x_val**2 + x_val -4 return [np.linalg.det(A)] result = root(test, [3]) print(result.x[0])
大矩阵场景优化
当矩阵规模变大时,直接构造矩阵计算行列式会出现数值不稳定、计算效率极低的问题。利用对角矩阵的性质:对角矩阵的行列式等于所有对角元的乘积,因此det(A)=0等价于对角元x²+x-4=0,直接求解这个二次方程即可,无需构造矩阵:
import numpy as np # 直接求解二次方程x² +x -4=0 coeffs = [1, 1, -4] roots = np.roots(coeffs) print(roots) # 输出[-2.56155281 1.56155281]
这种方法无论矩阵多大,计算量都可以忽略,且数值稳定性拉满,完全不用担心找不到真实根的问题。
内容的提问来源于stack exchange,提问作者swang
相关产品推荐
相关产品推荐

