python中的矩阵求逆问题:(A⁻;ⁱ;A≠;I)

python中的矩阵求逆问题:(A⁻;ⁱ;A≠;I),python,numpy,linear-algebra,Python,Numpy,Linear Algebra,我一直面临一个有趣的python问题。我试过求3x3矩阵A的逆 [[1 2 3] [4 5 6] [7 8 9]] 然后把它乘以初始值:A⁻ⁱA.我得到的不是单位矩阵(所有对角线元素都等于1),而是: [[ 12. 8. 8.] [-16. -8. 0.] [ 4. 0. 0.]] 只有在这种特定情况下才会出现问题。带有其他值的矩阵给出正确的结果。代码如下: import numpy as np np.set_printoptions(precision=2,su

我一直面临一个有趣的python问题。我试过求3x3矩阵A的逆

[[1 2 3]
[4 5 6]
[7 8 9]]
然后把它乘以初始值:A⁻ⁱA.我得到的不是单位矩阵(所有对角线元素都等于1),而是:

[[ 12.   8.   8.]
 [-16.  -8.   0.]
 [  4.   0.   0.]]
只有在这种特定情况下才会出现问题。带有其他值的矩阵给出正确的结果。代码如下:

import numpy as np
np.set_printoptions(precision=2,suppress=True)

A = np.array([1,2,3,4,5,6,7,8,9])
A = A.reshape(3,3)

print(A)
print(np.linalg.det(A))
print(np.matmul(np.linalg.inv(A),A))
输出:

[[1 2 3]
 [4 5 6]
 [7 8 9]]

6.66133814775094e-16

[[ 12.   8.   8.]
 [-16.  -8.   0.]
 [  4.   0.   0.]] 

你的矩阵是不可逆的,例如,它说矩阵是奇异的


Python打印了一个非零值的行列式(
6.66133814775094e-16
),这可能会误导您,但是,这个值非常接近于0,您应该这样对待它。计算机对浮点数的运算通常不是完全精确的(参见此问题),这可能是行列式的值接近于零,但并不精确的原因。

您的矩阵是不可逆的,参见例如,它说矩阵是奇异的


Python打印了一个非零值的行列式(
6.66133814775094e-16
),这可能会误导您,但是,这个值非常接近于0,您应该这样对待它。计算机对浮点数的运算通常不是完全精确的(例如,请参见此问题),这可能是行列式的值接近于零,但并不精确的原因。

此矩阵的行列式为0。自

import numpy as np
np.set_printoptions(precision=2,suppress=True)

A = np.array([1,2,3,4,5,6,7,8,9])
A = A.reshape(3,3)
# print determinant
print(np.linalg.det(A))
返回

[[1 2 3]
 [4 5 6]
 [7 8 9]]
0.0

您的矩阵没有可计算的逆。

此矩阵的行列式为0。自

import numpy as np
np.set_printoptions(precision=2,suppress=True)

A = np.array([1,2,3,4,5,6,7,8,9])
A = A.reshape(3,3)
# print determinant
print(np.linalg.det(A))
返回

[[1 2 3]
 [4 5 6]
 [7 8 9]]
0.0

你有一个没有可计算逆的矩阵。

正如其他人指出的,奇异矩阵是不可逆的,所以你从a^-1a得到一个无意义的答案

Numpy包含一个方便的功能来检查

正如维基百科所说,这是衡量
Ax=b
中的输出值
b
a
中矩阵值的微小变化的敏感性(有点像广义导数)。较大的值表示
A
为“il调节”,可能导致值不稳定。这是实值矩阵的固有特性,但浮点运算会使其恶化

cond
比查看
np.linalg.det(A)
更有用,因为它对
A
中的值比例不敏感(而范数和行列式是)。例如,这里是一个值很小的矩阵,但实际上不存在可逆性问题:

A = 1e-10*np.random.random(size=(3,3))

np.linalg.det(A)
# 2.128774239739163e-31
# ^^ this looks really bad...

np.linalg.cond(A)
# 8.798791503909136
# nevermind, it's probably ok

A_ident = np.matmul(np.linalg.inv(A), A)
np.linalg.norm(A_ident - np.identity(3))
# 5.392490230798587e-16
# A^(-1)*A is very close to the identity matrix, not il-conditioned.

正如其他人所指出的,奇异矩阵是不可逆的,所以从a^-1A得到的答案是无意义的

Numpy包含一个方便的功能来检查

正如维基百科所说,这是衡量
Ax=b
中的输出值
b
a
中矩阵值的微小变化的敏感性(有点像广义导数)。较大的值表示
A
为“il调节”,可能导致值不稳定。这是实值矩阵的固有特性,但浮点运算会使其恶化

cond
比查看
np.linalg.det(A)
更有用,因为它对
A
中的值比例不敏感(而范数和行列式是)。例如,这里是一个值很小的矩阵,但实际上不存在可逆性问题:

A = 1e-10*np.random.random(size=(3,3))

np.linalg.det(A)
# 2.128774239739163e-31
# ^^ this looks really bad...

np.linalg.cond(A)
# 8.798791503909136
# nevermind, it's probably ok

A_ident = np.matmul(np.linalg.inv(A), A)
np.linalg.norm(A_ident - np.identity(3))
# 5.392490230798587e-16
# A^(-1)*A is very close to the identity matrix, not il-conditioned.

矩阵具有行列式0,因此不可逆。Python3.6在尝试反转时告诉了我很多:
numpy.linalg.linalgerro:Singular matrix
这是一个奇异矩阵。它没有逆矩阵,矩阵有行列式0,因此是不可逆的。Python3.6在尝试反转时告诉了我很多:
numpy.linalg.linalgerro:Singular matrix
这是一个奇异矩阵。它没有逆矩阵。我知道奇异矩阵和浮点数的复杂行为,但不确定是否是这样。据我所知,要使用
np.linalg.cond
函数确定矩阵是否可逆,我应该注意返回值与零有很大的不同。如果我误解了,请纠正我。这是正确的:它有效地衡量了对变化的敏感性。我知道奇异矩阵和浮点数的复杂行为,但不确定是否如此。据我所知,要使用
np.linalg.cond
函数确定矩阵是否可逆,我应该注意返回值与零有很大的不同。如果我误解了,请纠正我。这是正确的:它有效地衡量了对变化的敏感性。