我正在尝试编写一个程序,该程序无需部分旋转即可进行高斯消除。到目前为止,这是我所拥有的,我知道我正在弄乱某些东西,但似乎无法弄清楚。它一直打印出与开始时相同的矩阵,而不是对角线中的1而不是0。任何帮助表示赞赏!
import numpy as np
import math
#A = np.array([[1,2,-1],[5,2,2],[-3,5,-1]])
#b = np.array([[2,9,1]])
A = np.array([[8,-2,-1,0,0],[-2,9,-4,-1,0],[-1,-3,7,-1,2],[0,-4,-2,12,-5],[0,0,-7,-3,15]])
b = np.array([[5],[2],[0],[1],[5]])
def forward_elim(A, b, n):
#calculates the forward part of Gaussian elimination.
for row in range(0, n-1):
for i in range(row+1, n):
factor = A[i,row] / A[row,row]
for j in range(row, n):
A[i,j] = A[i,j] - factor * A[row,j]
b[i] = b[i] - factor * b[row]
print("A = \n%s and b = %s" % (A,b))
return A, b
def back_sub(A, b, n):
#back substitution and returns result
x = np.zeros((n,1))
x[n-1] = b[n-1] / A[n-1, n-1]
for row in range(n-2, -1, -1):
sums = b[row]
for j in range(row+1, n):
sums = sums - A[row,j] * x[j]
x[row] = sums / A[row,row]
return x
def gauss_elim(A, b):
#performs gaussian elimination without pivoting
n = A.shape[0]
#checks for zero diagonal elements
if any(np.diag(A)==0):
raise ZeroDivisionError(("Can't divide by 0")) #raise used to raise exception
A, b = forward_elim(A, b, n)
return back_sub(A, b, n)
print(A)
答案 0 :(得分:0)
从给定的代码尚不清楚您是否有效地调用了函数gauss_elim(A, b)
。
为帮助找出正在发生的情况,请尝试逐步完成一个非常简单的示例。最好借助调试器或打印出中间值。按照相同的示例在纸上写下步骤。
一个简单的例子可能是:
A = np.array([[2,4],[3,9]])
b = np.array([[2,30]])
问题之一是您将b
声明为1xn
矩阵,但后来将其仅用作向量。一个解决方案可以是将b
声明为向量:
b = np.array([2,30])