理论上,实对称矩阵的逆应该返回一个实对称矩阵(对于Hermitian矩阵也是一样的)。然而,当我使用numpy或scipy计算逆时,返回的矩阵是不对称的。我知道这是由于数值误差造成的。
避免这种不对称的最佳方法是什么?我希望在数学上是有效的,以便在我的计算中不会进一步传播误差。
import numpy as np
n = 1000
a =np.random.rand(n, n)
a_symm = (a+a.T)/2
a_symm_inv = np.linalg.inv(a_symm)
if (a_symm_inv == a_symm_inv.T).all():
print("Inverse of matrix A is symmetric") # This does not happen!
else:
print("Inverse of matrix A is asymmetric")
print("Max. asymm. value: ", np.max(np.abs((a_symm_inv-a_symm_inv.T)/2)))
编辑
这是我对问题的解决方案:
math_symm = (np.triu_indices(len(a_symm_inv), 1))
a_symm_inv[math_symm]=np.tril(a_symm_inv, -1).T[math_symm]
if (a_symm_inv == a_symm_inv.T).all():
。浮点数的算术运算并不是精确的,因此您不应该尝试进行精确的比较。 - cel