给定一个矩阵 A,其中一些元素是 x 的函数,找到 x 使得 det(A) = 0。
我从 5x5 对角矩阵开始,如代码所示。root 函数实际上给出了正确的根 (x = 1.562),但是
DeprecationWarning:不推荐将 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)
是完全可以的。我不知道这个警告是如何产生的以及如何避免它。我猜测可能与寻根功能有关,但我不确定具体如何。恐怕当矩阵变得很大时,它就找不到真正的根了。有人遇到过类似的问题吗?任何建议将被认真考虑。
如果您查看root 的源代码,您会发现
_root_hybr
如果没有提供方法,它就会调用。转到_root_hybr
我们可以看到有这一行:这会将您的输入转换
x0
为3
数组array([3])
,因此现在您的输入test
是一个数组ndim=1
,而不是您提供的标量。因此,当您计算时x**2-4+x
,这也是一个数组,ndim=1
而不是您可能期望的标量。该警告指出,不推荐使用 ndim>0 的数组设置数组的元素,因此将来它将不起作用。为了避免警告和未来的错误,在函数中,您需要转换x
回函数期望的标量值,您可以使用x = x.item()
.