【问题标题】:Python Gauss EliminationPython高斯消除
【发布时间】:2018-02-12 00:49:10
【问题描述】:

超级新手编程,仍在学习如何调试。每次我运行这个程序进行高斯消除时,我都会得到 ​​p>

"第 16 行,在 GaussElim 中 tmp=A[maxRow][k] IndexError: 列表索引超出范围"

我认为这意味着代码超出了索引的限制,但我不确定如何纠正它。任何建议将不胜感激谢谢!

def GaussElim(A):
n=len(A)

for i in range(0,n):   #search for maximum in this column
    maxE1=abs(A[i][i])
    maxRow=i
    for k in range(i+1,n):
        if abs(A[k][i])>maxE1:
            maxE1=abs(A[k][i])
            maxRow=k
            # swap maximum row with current row (column by column)
    for k in range(i,n+1):
        tmp=A[maxRow][k]
        A[maxRow][k]=A[i][k]
        A[i][k]=tmp

    for k in range(i+1,n):
        c=-A[k][i]/A[i][i]
        for j in range(i,n+1):
            if i==j:
                A[k][j]=0
            else:
                A[k][j]+=c*A[i][j]
                #solve equation Ax+b for an upper triangular matrix A
x=[0 for i in range(n)]
for i in range(n-1,-1,-1):
    x[i]=A[i][n]/A[i][i]
    for k in range(i-1,-1,-1):
        A[k][n]-=A[k][i]*x[i]
return x

def main():
A=[[2,7,3,6,2],
        [3,3,4,4,6],
        [6,9,5,3,3],
        [6,9,5,3,3],
        [4,2,1,7,5]]

mysum1 = GaussElim(A)
print('a) GaussElimination Solution = {:.1f}'.format(mysum1))

【问题讨论】:

    标签: python gauss


    【解决方案1】:

    在 python 中,列表是零索引的。如果您打印 k 的值,您会看到您得到的值 k=5,这可能来自您的范围(i,n+1)(其中 n=5)。您的 5x5 数组仅支持从 0 到 4 的索引。

    【讨论】:

    • 那么您将如何取消 +1 呢?我如何防止它变成 5?
    • 我不知道这将如何影响算法的正确性,但这应该可以防止特定的 IndexError。 range(i, n+1) 给你[i, i+1, ..., n]range(i, n) 给你[i, i+1, ..., n-1]。 (或 [] 如果 i=n)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多