Skip to content

Instantly share code, notes, and snippets.

@laztname
Created May 13, 2019 03:07
Show Gist options
  • Save laztname/87a0fce528517c198da5b7a73da54f9f to your computer and use it in GitHub Desktop.
Save laztname/87a0fce528517c198da5b7a73da54f9f to your computer and use it in GitHub Desktop.
gaussian elimination
#!/bin/env python
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.expandtabs(3))
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 = int(input("Insert the ordo of Matrix: "))
print("Insert matrix element: ")
A = [[0 for j in range(n+1)] for i in range(n)]
# Read input data
for i in range(0, n):
line = list(map(Fraction, input("").split(" ")))
for j, el in enumerate(line):
A[i][j] = el
input()
line = input("Insert the b vector:\n").split(" ")
lastLine = list(map(Fraction, line))
for i in range(0, n):
A[i][n] = lastLine[i]
print("\n")
# Print input
pprint(A)
# Calculate solution
x = gauss(A)
# Print result
line = "Result: "
for i in range(0, n):
line += str(x[i]) + " "
print(line)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment