You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求矩阵行列式根时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:43:14