我有一些2x2矩阵,我想反演。当使用pinv (要么是numpy pinv,scipy pinv,又或者scipy pinv2)时,对于其中的一些元素,我得到了一个排序-30的元素的答案,这比它们应该的要小得多。矩阵有一个很大的行列式(如此非零),所以它是可逆的。如果我使用scipy.linalg.inv,它可以正常工作。这些矩阵都是相当相似的,它们中的大多数都能很好地处理pinv。
有人知道这里会发生什么吗?
编辑:对不起,忘了包括一个例子。如果我
A = [[1e2, -1.6e9], [-1.6e9, 3e16]]
然后使用np.linalg.inv
给出[6.81e-2, 3.63e-9; 3.63e-9, 2.27e-16]
,而np.linalg.pinv
给出[9.48e-32, -1.77e-24; -1.77e-24, 3.33e-17]
。
import numpy as np
A = np.matrix([[1e2, -1.6e9], [-1.6e9, 3e16]])
print(np.linalg.pinv(A))
print(np.linalg.inv(A))
发布于 2021-11-24 11:24:24
问题是矩阵有非常不同的奇异值。
np.linalg.svd(A)[1]
[3.00000000e+16, 1.46666666e+01]
在默认情况下,皮涅夫有一个rcond=1e-15,这决定了是否必须包含一个单数值。您可以简单地增加rcond
np.linalg.pinv(A, rcond=1e-20) @ A
matrix([[ 9.99999996e-01, 2.06089933e-01],
[-1.93556853e-16, 1.00000001e+00]])
这解决了你眼前的问题,但你可能需要检查这些病态矩阵对最终结果的影响。
https://stackoverflow.com/questions/70094858
复制相似问题