Monday, November 28, 2016

Gauss elimination using python

In case you are interested in reading through a list of problems in numerical methods you can do so in the following blog post Here.
The following code from this site implements Gauss elimination method to solve a system of linear equations. While the author is brilliant in her coding, something missing is a way of executing the python code.(I am reproducing the code here.....find the input at the end)

def pprint(A):
    n = len(A)
    for i in range(0, n):
        line = ""
        for j in range(0, n+1):
            line += str(A[i][j]) + "\t"
            if j == n-1:
                line += "| "
        print(line)
    print("")


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

    for i in range(0, n):
        # Search for maximum in this column
        maxEl = abs(A[i][i])
        maxRow = i
        for k in range(i+1, n):
            if abs(A[k][i]) > maxEl:
                maxEl = 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

        # Make all rows below this one 0 in current column
        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


if __name__ == "__main__":
    from fractions import Fraction
    n = input()

    A = [[0 for j in range(n+1)] for i in range(n)]

    # Read input data
    for i in range(0, n):
        line = map(Fraction, raw_input().split(" "))
        for j, el in enumerate(line):
            A[i][j] = el
    raw_input()

    line = raw_input().split(" ")
    lastLine = map(Fraction, line)
    for i in range(0, n):
        A[i][n] = lastLine[i]

    # Print input
    pprint(A)

    # Calculate solution
    x = gauss(A)

    # Print result
    line = "Result:\t"
    for i in range(0, n):
        line += str(x[i]) + "\t"
    print(line)

Input:

E:\python\Workspace>python gauss.py
3
1 2 5
6 2 1
5 4 3
                       (a blank line afterwards enter the b(column) matrix)
2 70 3
1       2       5       | 2
6       2       1       | 70
5       4       3       | 3

Result: 480/23  -1479/46        209/23

5 comments:

  1. pls dont understand how to put the input

    ReplyDelete
    Replies
    1. For the benefit of others... see you need to give spaces between inputs and create a matrix kind of input. I am sure its too late for you but wanted to say I know what the problem is.

      Delete
  2. Ran code in Python3, the first mistake:
    A = [[0 for j in range(n+1)] for i in range(n)]
    TypeError: 'str' object cannot be interpreted as an integer

    ReplyDelete