给定一个矩阵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)
完全可以。我不知道这个警告是怎么出现的,如何避免它。我猜可能和求根函数有关,但我不确定具体是怎么回事。我担心当矩阵的大小变得很大时,它找不到真正的根。有人遇到过类似的问题吗?任何建议将不胜感激。
1条答案
按热度按时间bjp0bcyl1#
如果你看一下root的源代码,你会发现如果没有提供方法,它会调用
_root_hybr
。转到_root_hybr
,我们可以看到这一行:字符串
这会将输入
x0
(即3
)转换为数组array([3])
,因此,现在您对test
的输入是一个带有ndim=1
的数组,而不是您提供的标量。因此,当您计算x**2-4+x
时,这也是一个带有ndim=1
的数组,而不是您可能期望的标量。警告指出,将数组的元素设置为数组,with ndim>0已被弃用,因此它在将来不会起作用。为了避免警告和将来的错误,您需要在函数中将x
转换回函数期望的标量值,您可以使用x = x.item()
执行此操作。