Python 中的逆矩阵 np.linalg.inv,给出了奇怪的结果,为什么?

问题描述

我有一个矩阵

A = array([[1.09624842,1.11117215,1.1286472,1.14919556,1.17347793,1.20234278,1.23689824,1.27861975,1.32951655],[1.11117215,1.32951655,1.392398  ],[1.1286472,1.392398,1.47131753],[1.14919556,1.47131753,1.57234955],[1.17347793,1.57234955,1.70503235],[1.20234278,1.70503235,1.88525391],[1.23689824,1.88525391,2.14160156],[1.27861975,2.14160156,2.53125   ],[1.32951655,2.53125,3.1875    ]])

并使用 np.linalg.inv 我得到结果

invA = array([[ 9.03216714e+13,-4.06448796e+14,7.70561913e+14,-8.00202097e+14,4.95034612e+14,-1.85465207e+14,4.07006142e+13,-4.71978384e+12,2.17073788e+11],[-4.06445370e+14,1.82901213e+15,-3.46751917e+15,3.60090497e+15,-2.22765654e+15,8.34595116e+14,-1.83153441e+14,2.12391394e+13,-9.76838505e+11],[ 7.70548134e+14,-3.46748639e+15,6.57381842e+15,-6.82670621e+15,4.22326723e+15,-1.58225687e+15,3.47229858e+14,-4.02661108e+13,1.85193700e+12],[-8.00179401e+14,3.60083319e+15,-6.82663466e+15,7.08926102e+15,-4.38570264e+15,1.64311714e+15,-3.60586561e+14,4.18150920e+13,-1.92318186e+12],[ 4.95014910e+14,-2.22758666e+15,4.22317467e+15,-4.38565249e+15,2.71314734e+15,-1.01649147e+15,2.23072376e+14,-2.58684453e+13,1.18975766e+12],[-1.85455567e+14,8.34558774e+14,-1.58220293e+15,1.64307835e+15,-1.01647909e+15,3.80828905e+14,-8.35743684e+13,9.69167331e+12,-4.45746509e+11],[ 4.06979905e+13,-1.83143178e+14,3.47213684e+14,-3.60573544e+14,2.23066874e+14,-8.35733246e+13,1.83405389e+13,-2.12686037e+12,9.78203657e+10],[-4.71942267e+12,2.12376932e+13,-4.02637495e+13,4.18130782e+13,-2.58674953e+13,9.69143539e+12,-2.12683472e+12,2.46639084e+11,-1.13436657e+10],[ 2.17054909e+11,-9.76761785e+11,1.85180906e+12,-1.92306915e+12,1.18970154e+12,-4.45730911e+11,9.78181643e+10,-1.13435473e+10,5.21725039e+08]])

我用它来求解 Python 中的方程。然而,我得到的结果是完全错误的,我检查了矩阵和 (A@invA).astype(int) 甚至不接近单位矩阵。

(A@invA).astype(int) = array([[1,1,0],[0,3,2,1]])

我试图在 Matlab 中获得逆矩阵,但得到了完全不同的结果,通过使用 Matlab 中的结果乘以 A*invA 得到了单位矩阵。有人可以向我解释发生了什么以及如何解决它:)?我尝试对随机数组进行 inv 矩阵乘法,一切正常...

解决方法

谢谢,

@hpaulj

为了答案。

由于矩阵几乎是奇异的,我们应该改用 np.linalg.pinv。它解决了问题!