我应该实施反向替换。我们收到行梯形矩阵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
答案 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