python - Numpy 矩阵求逆给出大于 18 的阶数的错误结果

标签 python numpy

我在使用 NumPy 求逆矩阵时遇到问题.奇怪的是,它只在 18 阶之前给出正确的结果。一旦阶数大于 18,它就会给出错误的结果。

import numpy as np
from decimal import Decimal
import numpy.matlib

I_1=np.matlib.eye(ngrid,ngrid,k=0,dtype=Decimal)
I_2=np.matlib.eye(ngrid,ngrid,k=1,dtype=Decimal)
I_3=np.matlib.eye(ngrid,ngrid,k=2,dtype=Decimal)

B=I_1 + 10.*I_2 + I_3
B=np.divide(B,12.)

B_inv=np.linalg.inv(B)
print B_inv

C=B.dot(B_inv)
print C
包含最后一行是为了检查它是否给出了正确的结果。

最佳答案

从技术上讲,您的代码没有任何问题。但是,您在数值分析中遇到了一个非常基本的问题。这里有两种效果:

  • 浮点错误
  • 问题的条件号

  • 我不会在这里解释它们,因为几乎任何关于数值分析的介绍性书籍(例如 Kendall Atkinson)都比我在这里做得更好。我只会给你留下这个代码片段:
    import numpy as np
    
    NGRID = 8
    
    
    def HilbertMatrix(N, dtype=np.float64):
        arr = np.zeros((N,N), dtype=dtype)
        for i in range(N):
            for j in range(N):
                arr[i,j] = 1 / (i + j + 1)
        return arr
    
    
    H = HilbertMatrix(NGRID)
    J = np.linalg.inv(H)
    
    C = np.dot(H, J)
    
    print(np.allclose(C, np.eye(NGRID)))
    print(np.linalg.norm(C))
    
    尝试使用 NGRID,看看 C 离单位矩阵有多远。

    关于python - Numpy 矩阵求逆给出大于 18 的阶数的错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64292103/

    相关文章:

    python - 将日期时间字段添加到重新数组中

    python - python 中是否有 type() 的魔术方法?

    python - 使用模糊正则表达式(Python)来纠正拼写

    python - Numpy 选择默认条件返回错误值

    python - 将 ATLAS/MKL 链接到已安装的 Numpy

    python - 对列表的 numpy 数组进行排序

    python - 如何在 numpy savetxt 中格式化,使零仅保存为 "0"

    python - py2app 构建的应用程序在其他机器上显示 `ERROR: pygame.macosx import FAILED`

    python - 向字典键添加值

    python - Spark 合并与收集,哪个更快?