在python中返回替换

时间:2017-11-29 10:54:30

标签: python numpy linear-algebra

我应该实施反向替换。我们收到行梯形矩阵A,向量b和解向量x已经初始化。

我的代码中的索引有问题。无论我如何调整我的范围,我似乎总是在开始时掉出来并得到一个出界的错误。我已经在纸上测试了我的解决方案,它应该做正确的事情,但是,我无法解决索引问题。有人有任何线索吗?

def back_substitution(A: np.ndarray, b: np.ndarray) -> np.ndarray:
    n = len(b)

    if A[n-1][n-1] == 0:
        raise ValueError

    for i in range(n-1, 0, -1):
        x[i] = A[i][i]/b[i]
        for j in range (i-1, 0, -1):
            A[i][i] += A[j][i]*x[i]

    return x

x = np.zeros(1)
M = np.matrix([[1, -1, 2], [0, -1, -2], [0, 0, -6]])
c = np.matrix([[0],[0],[3]])
back_substitution(M,c)

我收到以下错误:

Traceback (most recent call last):
  File "main.py", line 167, in <module>
    back_substitution(M,c)
  File "main.py", line 125, in back_substitution
    x[i] = A[i][i]/b[i]
  File "/usr/local/lib/python3.4/dist-packages/numpy/matrixlib/defmatrix.py", line 284, in __getitem__
    out = N.ndarray.__getitem__(self, index)
IndexError: index 2 is out of bounds for axis 0 with size 1

2 个答案:

答案 0 :(得分:2)

您正在使用列表索引,但数组使用两项数组编制索引。并且您没有在函数内部定义x,因此它正在拾取您在函数def之外定义的那个并且跳闸。因为那是一个单一的元素数组。

请不要再使用np.matrix,不推荐使用它。

def back_substitution(A: np.ndarray, b: np.ndarray) -> np.ndarray:
    n = b.size
    x = np.zeros_like(b)

    if A[n-1, n-1] == 0:
        raise ValueError

    for i in range(n-1, 0, -1):
        x[i] = A[i, i]/b[i]
        for j in range (i-1, 0, -1):
            A[i, i] += A[j, i]*x[i]

    return x

x = np.zeros(1)
M = np.matrix([[1, -1, 2], [0, -1, -2], [0, 0, -6]])
c = np.matrix([[0],[0],[3]])
back_substitution(M,c)

答案 1 :(得分:1)

我相信以下代码是正确的。请检查一下。

def back_substitution(A: np.ndarray, b: np.ndarray) -> np.ndarray:
    n = b.size
    x = np.zeros_like(b)

    if A[n-1, n-1] == 0:
        raise ValueError


    x[n-1] = b[n-1]/A[n-1, n-1]
    C = np.zeros((n,n))
    for i in range(n-2, -1, -1):
        bb = 0
        for j in range (i+1, n):
            bb += A[i, j]*x[j]

        C[i, i] = b[i] - bb
        x[i] = C[i, i]/A[i, i]

    return x