给定一个矩阵 A,其中某些元素是 x 的函数,找到 x 使得 det(A) = 0。我从一个 5x5 对角矩阵开始,如代码所示。root 函数实际上给出了正确的 r...
给定一个矩阵 A,其中一些元素是 x 的函数,找到 x 使得 det(A) = 0。
我从一个 5x5 对角矩阵开始,如代码所示。根函数实际上给出了正确的根 (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 = asarray(x0).flatten()
这会将您的输入转换 x0
为 3
数组, array([3])
因此现在您的输入 test
是一个数组,而 ndim=1
不是您提供的标量。因此,当您计算时, x**2-4+x
这也是一个数组, ndim=1
而不是您可能期望的标量。警告指出,使用 ndim>0 的数组设置数组元素已被弃用,因此将来将不再起作用。为了避免警告和未来错误,您需要在函数中将其转换 x
回函数所需的标量值,您可以使用 x = x.item()
.