numpy 求矩阵的行列式的根时的一个警告

lvmkulzt  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(78)

给定一个矩阵A,其中一些元素是x的函数,找到x使得det(A)= 0。
我从一个5x5的对角矩阵开始,如代码所示。
弃用警告:不建议将ndim > 0的数组转换为标量,并且将来会出错。请确保在执行此操作之前从数组中提取单个元素。

def test(x):
    A = np.zeros((5,5))
    for i in range(5):
        A[i,i] = x**2-4+x
    return np.linalg.det(A)

root(test, 3)

字符串
但是,如果我们只是想要行列式,运行test(3)完全可以。我不知道这个警告是怎么出现的,如何避免它。我猜可能和求根函数有关,但我不确定具体是怎么回事。我担心当矩阵的大小变得很大时,它找不到真正的根。有人遇到过类似的问题吗?任何建议将不胜感激。

bjp0bcyl

bjp0bcyl1#

如果你看一下root的源代码,你会发现如果没有提供方法,它会调用_root_hybr。转到_root_hybr,我们可以看到这一行:

x0 = asarray(x0).flatten()

字符串
这会将输入x0(即3)转换为数组array([3]),因此,现在您对test的输入是一个带有ndim=1的数组,而不是您提供的标量。因此,当您计算x**2-4+x时,这也是一个带有ndim=1的数组,而不是您可能期望的标量。警告指出,将数组的元素设置为数组,with ndim>0已被弃用,因此它在将来不会起作用。为了避免警告和将来的错误,您需要在函数中将x转换回函数期望的标量值,您可以使用x = x.item()执行此操作。

相关问题