python - python 中的矩阵求逆稍有偏差

标签 python matrix linear-algebra matrix-inverse

我正在尝试使用这个http://www.irma-international.org/viewtitle/41011/反转 nxn 矩阵的算法。

我在这个矩阵上运行了函数

[[1.0, -0.5],

 [-0.4444444444444444, 1.0]]

并得到输出

[[ 1.36734694,  0.64285714]

 [ 0.57142857,  1.28571429]]

正确的输出应该是

[[ 1.28571429,  0.64285714]

 [ 0.57142857,  1.28571429]]

我的功能:

def inverse(m):
    n = len(m)
    P = -1
    D =  1
    mI = m
    while True:
        P += 1
        if m[P][P] == 0:
           raise Exception("Not Invertible")
        else:
            D = D * m[P][P]
            for j in range(n):
                if j != P:
                    mI[P][j] =  m[P][j] / m[P][P]
            for i in range(n):
                if i != P:
                    mI[i][P] = -m[i][P] / m[P][P]
            for i in range(n):
                for j in range(n):
                    if i != P and j != P:
                        mI[i][j] = m[i][j] + (m[P][j] * mI[i][P])
            mI[P][P] = 1 / m[P][P]
            if P == n - 1: # All elements have been looped through
                break

    return mI

我哪里犯了错误?

最佳答案

https://repl.it/repls/PowerfulOriginalOpensoundsystem

输出

inverse: [[Decimal('1.285714285714285693893862813'), Decimal('0.6428571428571428469469314065')], [Decimal('0.5714285714285713877877256260'), Decimal('1.285714285714285693893862813')]] numpy: [[ 1.28571429 0.64285714] [ 0.57142857 1.28571429]]

from decimal import Decimal
import numpy as np

def inverse(m):
    m = [[Decimal(n) for n in a] for a in m]
    n = len(m)
    P = -1
    D =  Decimal(1)
    mI = [[Decimal(0) for n in a] for a in m]
    while True:
        P += 1
        if m[P][P] == 0:
           raise Exception("Not Invertible")
        else:
            D = D * m[P][P]
            for j in range(n):
                if j != P:
                    mI[P][j] =  m[P][j] / m[P][P]
            for i in range(n):
                if i != P:
                    mI[i][P] = -m[i][P] / m[P][P]
            for i in range(n):
                for j in range(n):
                    if i != P and j != P:
                      mI[i][j] = m[i][j] + (m[P][j] * mI[i][P])
            mI[P][P] = 1 / m[P][P]
            m = [[Decimal(n) for n in a] for a in mI]
            mI = [[Decimal(0) for n in a] for a in m]
            if P == n - 1: # All elements have been looped through
                break

    return m

m = [[1.0, -0.5],

 [-0.4444444444444444, 1.0]]

print(inverse(m))
print(np.linalg.inv(np.array(m)))

我的思考过程:

起初,我认为您可能存在潜在的浮点舍入错误。事实证明这不是真的。这就是十进制爵士乐的用途。

你的错误在这里

mI = m # this just creates a pointer that points to the SAME list as m

这里

for i in range(n):
                for j in range(n):
                    if i != P and j != P:
                        mI[i][j] = m[i][j] + (m[P][j] * mI[i][P])
            mI[P][P] = 1 / m[P][P] 
            # you are not copying mI to m for the next iteration
            # you are also not zeroing mI 
            if P == n - 1: # All elements have been looped through
                break

    return mI

按照算法,每次迭代都会创建一个新的a'矩阵,它不会继续修改相同的旧a。我推断这意味着在循环不变式中,a 变成了'。适用于您的测试用例,事实证明是正确的。

关于python - python 中的矩阵求逆稍有偏差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48819798/

相关文章:

python:正则表达式匹配字符串且仅匹配字符串

python - Python3.3.5如何在字符串中添加数字和字母(最终结果应该是int)?

c++ - Eigen 与 QGenericMatrix

python - 获取满足某些条件的索引

python - GtkTextView : How to change background color of current active blinking cursor line?

python - numpy - 使用一些预先计算的映射有效地将值从矩阵复制到矩阵

opengl - 透视划分解释?

matlab - 在 MATLAB 中 reshape /变换上三角矩阵

julia - 在 Julia 中模拟粒子碰撞

rgl:绘制一个带有彩色面、顶点和线的立方体