Python numpy 在我的电脑中产生了错误的特征值和特征向量

Python numpy produces wrong eigenvalues and eigenvectors in my computer

我正在使用 numpy 计算矩阵的特征值和特征向量,但我在本地计算机上总是得到错误的结果。我的输入数组是:

ATA =np.array([[     56100,      33750,        350,          0,          0,          0,  -13434400,   -6298800,     -67340]
      [     33750,      39025,        365,          0,          0,          0,   -6298800,   -4105800,     -40530]
      [       350,        365,          4,          0,          0,          0,    -67340,     -40530,       -421]
      [         0,          0,          0,      56100,      33750,        350,   -6297800,   -4104300,     -40480]
      [         0,          0,          0,      33750,      39025,        365,   -4104300,   -5323650,     -46800]
      [         0,          0,          0,        350,        365,          4,    -40480,     -46800,       -437]
      [ -13434400,   -6298800,     -67340,   -6297800,   -4104300,     -40480, -143294096, 1988812200,   21046240]
      [  -6298800,   -4105800,     -40530,   -4104300,  -5323650,     -46800, 1988812200, 1463802300,   13946640]
      [    -67340,     -40530,       -421,     -40480,     -46800,       -437,  21046240,   13946640,     136958]])

所以当我 运行 np.linalg.eig(ATA) 输出应该是:

(array([ 5.20824997e+09,  4.07454810e+08,  7.42539687e+04,  2.15085782e+04,
        1.47325883e+03,  6.95623993e+02,  1.00620174e+00, -2.34183896e-10,
        4.89068886e-03]), array([[ 2.84539953e-03,  1.81479448e-03, -4.03677749e-01,
         8.40141629e-02, -1.62954584e-01,  6.55925095e-01,
        -4.22667744e-01,  4.28089963e-01,  1.06176905e-01],
       [ 1.43790972e-03, -1.64731179e-03, -4.11218161e-01,
         8.20390032e-01, -1.04799961e-01, -3.83178690e-01,
        -2.95123482e-03, -3.17384527e-03, -5.22638141e-03],
       [ 1.50694971e-05, -1.03183136e-05, -3.89314681e-03,
         7.14037036e-03, -1.10215138e-02,  5.07017350e-03,
         5.91938347e-01,  3.92898770e-01,  7.03580978e-01],
       [ 1.43759890e-03, -1.64599502e-03,  7.08867672e-01,
         5.61266733e-01,  1.50187808e-01,  3.99898006e-01,
        -1.95860586e-03,  1.11445719e-03, -1.27734452e-03],
       [ 1.17548483e-03, -6.81423034e-03,  4.06683631e-01,
        -6.55054431e-02, -5.23337672e-01, -4.35335264e-01,
        -4.11520452e-01,  4.32430093e-01,  1.02594642e-01],
       [ 1.10796389e-05, -5.48396552e-05,  4.32865661e-03,
         5.41689188e-04, -1.94131236e-02,  6.27255853e-04,
        -4.22766929e-01, -5.91916200e-01,  6.85935194e-01],
       [-8.83129590e-01, -4.69109327e-01, -2.08350880e-03,
         1.14444168e-03, -5.76087521e-04,  3.54706596e-03,
        -1.71586709e-05,  6.93819107e-06, -3.51316614e-05],
       [-4.69089792e-01,  8.83088500e-01,  3.43558431e-03,
         2.66295777e-03, -9.46771468e-03, -9.51037214e-04,
         3.67021032e-05,  2.30158491e-05, -1.70205343e-04],
       [-4.82500030e-03,  5.99890239e-03, -2.98470711e-03,
        -2.30397046e-02,  8.15742461e-01, -2.71037947e-01,
        -3.50524557e-01,  3.53550068e-01,  1.12421281e-01]]))

但在我的环境中,它达到:

(array([ 2.80556520e+09, -1.48486833e+09,  8.91358635e+04,  3.12310662e+04,
        1.67293828e+04,  1.45256927e+03,  1.02287725e+00,  1.71486141e-04,
        7.14907196e-02]), array([[ 4.53911407e-03, -5.12844789e-03,  5.81815676e-01,
         4.03075138e-01, -3.54070037e-01,  5.22579137e-02,
        -4.18346581e-01, -4.39977631e-01,  4.77848175e-02],
       [ 2.46880709e-03, -1.97041290e-03,  3.86847218e-01,
         1.97085313e-01,  8.84776717e-01,  1.69008001e-01,
        -4.91082887e-03,  4.02327384e-03, -7.92374720e-03],
       [ 2.53995133e-05, -2.23326997e-05,  3.95854042e-03,
         2.45012019e-03,  6.76807972e-03,  1.08295840e-02,
         6.12610346e-01, -5.13976174e-01,  6.00293512e-01],
       [ 2.46815358e-03, -1.97050701e-03, -5.08932001e-01,
         8.30051437e-01,  7.85246368e-02, -2.14057675e-01,
        -7.15437012e-05, -8.15717096e-04,  2.31896436e-03],
       [ 2.39125344e-03, -2.86679627e-04, -4.90583621e-01,
        -1.62932815e-01,  1.38557602e-01,  5.87624795e-01,
        -4.12659947e-01, -4.43735069e-01,  3.29341124e-02],
       [ 2.18983860e-05, -4.97622085e-06, -4.62793574e-03,
         2.95201534e-04,  1.07051252e-03,  1.95471546e-02,
        -3.95612985e-01,  4.58193429e-01,  7.95703714e-01],
       [-5.59185122e-01, -8.29039916e-01, -1.58639818e-03,
        -1.34262675e-03,  7.05133701e-04,  8.24587719e-06,
         2.26139620e-07,  5.65965747e-09,  4.33823831e-07],
       [-8.28977882e-01,  5.59121133e-01,  3.58122146e-03,
         8.59258680e-03, -1.73055059e-03,  9.46280078e-03,
         2.88384523e-05,  8.09952365e-06, -1.76507697e-04],
       [-8.31631249e-03,  6.49815429e-03, -1.10014765e-01,
        -2.88224906e-01,  2.57662176e-01, -7.59600488e-01,
        -3.50532044e-01, -3.67952844e-01,  5.53810458e-02]]))

这与我的意图大相径庭。有谁知道为什么我可能会得到不同的结果?我在在线编译器中仔细检查了第一个输出,我确信它是正确的答案,那么为什么相同的代码会得到不同的结果?

嗯,这很愚蠢。显然,我在 Windows 中将 ATA 声明为一个 int 数组,而我 运行 在 macOS 和 Linux 中进行的所有其他测试,所以这可能与这些操作系统如何存储大量数字有关.因此,当我将 ATA 更​​改为浮点数组时,我得到了正确的特征值。