【问题标题】:Gaussian Elimination No Pivoting高斯消除无旋转
【发布时间】:2019-10-29 21:16:34
【问题描述】:

我正在尝试编写一个可以在不进行部分旋转的情况下进行高斯消除的程序。这就是我到目前为止所拥有的,我知道我搞砸了,但我似乎无法弄清楚是什么。它不断打印出与它开始时相同的矩阵,而不是对角线上的 0 和 1。任何帮助表示赞赏!

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)

【问题讨论】:

    标签: python python-3.x numpy matrix gaussian


    【解决方案1】:

    根据给定的代码,不清楚您是否有效地调用了函数gauss_elim(A, b)

    为了帮助找出正在发生的事情,请尝试逐步执行一个非常简单的示例。最好在调试器的帮助下,或通过打印出中间值。按照相同的示例将步骤写在一张纸上。

    一个简单的例子可以是:

    A = np.array([[2,4],[3,9]])
    b = np.array([[2,30]])
    

    其中一个问题是您将b 声明为1xn 矩阵,但后来将其仅用作向量。一种解决方案是将b 声明为向量:

    b = np.array([2,30])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多