import numpy as np
def GENP(A, b):
'''
Gaussian elimination with no pivoting.
% input: A is an n x n nonsingular matrix
% b is an n x 1 vector
% output: x is the solution of Ax=b.
% post-condition: A and b have been modified.
'''
n = len(A)
if b.size != n:
raise ValueError("Invalid argument: incompatible sizes between A & b.", b.size, n)
for pivot_row in xrange(n-1):
for row in xrange(pivot_row+1, n):
multiplier = A[row][pivot_row]/A[pivot_row][pivot_row]
#the only one in this column since the rest are zero
A[row][pivot_row] = multiplier
for col in xrange(pivot_row + 1, n):
A[row][col] = A[row][col] - multiplier*A[pivot_row][col]
#Equation solution column
b[row] = b[row] - multiplier*b[pivot_row]
print A
print b
x = np.zeros(n)
k = n-1
x[k] = b[k]/A[k,k]
while k >= 0:
x[k] = (b[k] - np.dot(A[k,k+1:],x[k+1:]))/A[k,k]
k = k-1
return x
def GEPP(A, b):
'''
Gaussian elimination with partial pivoting.
% input: A is an n x n nonsingular matrix
% b is an n x 1 vector
% output: x is the solution of Ax=b.
% post-condition: A and b have been modified.
'''
n = len(A)
if b.size != n:
raise ValueError("Invalid argument: incompatible sizes between A & b.", b.size, n)
# k represents the current pivot row. Since GE traverses the matrix in the upper
# right triangle, we also use k for indicating the k-th diagonal column index.
for k in xrange(n-1):
#Choose largest pivot element below (and including) k
maxindex = abs(A[k:,k]).argmax() + k
if A[maxindex, k] == 0:
raise ValueError("Matrix is singular.")
#Swap rows
if maxindex != k:
A[[k,maxindex]] = A[[maxindex, k]]
b[[k,maxindex]] = b[[maxindex, k]]
for row in xrange(k+1, n):
multiplier = A[row][k]/A[k][k]
#the only one in this column since the rest are zero
A[row][k] = multiplier
for col in xrange(k + 1, n):
A[row][col] = A[row][col] - multiplier*A[k][col]
#Equation solution column
b[row] = b[row] - multiplier*b[k]
print A
print b
x = np.zeros(n)
k = n-1
x[k] = b[k]/A[k,k]
while k >= 0:
x[k] = (b[k] - np.dot(A[k,k+1:],x[k+1:]))/A[k,k]
k = k-1
return x
if __name__ == "__main__":
A = np.array([[2, 4, -2, -2], [1, 2, 4, -3], [-3, -3, 8, -2], [-1, 1, 6, -3]])
b = np.array([-4, 5, 7, 7])
print GENP(np.copy(A), np.copy(b))
print GEPP(A,b)# your code goes here
aW1wb3J0IG51bXB5IGFzIG5wCiAKZGVmIEdFTlAoQSwgYik6CiAgICAnJycKICAgIEdhdXNzaWFuIGVsaW1pbmF0aW9uIHdpdGggbm8gcGl2b3RpbmcuCiAgICAlIGlucHV0OiBBIGlzIGFuIG4geCBuIG5vbnNpbmd1bGFyIG1hdHJpeAogICAgJSAgICAgICAgYiBpcyBhbiBuIHggMSB2ZWN0b3IKICAgICUgb3V0cHV0OiB4IGlzIHRoZSBzb2x1dGlvbiBvZiBBeD1iLgogICAgJSBwb3N0LWNvbmRpdGlvbjogQSBhbmQgYiBoYXZlIGJlZW4gbW9kaWZpZWQuIAogICAgJycnCiAgICBuID0gIGxlbihBKQogICAgaWYgYi5zaXplICE9IG46CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBhcmd1bWVudDogaW5jb21wYXRpYmxlIHNpemVzIGJldHdlZW4gQSAmIGIuIiwgYi5zaXplLCBuKQogICAgZm9yIHBpdm90X3JvdyBpbiB4cmFuZ2Uobi0xKToKICAgICAgICBmb3Igcm93IGluIHhyYW5nZShwaXZvdF9yb3crMSwgbik6CiAgICAgICAgICAgIG11bHRpcGxpZXIgPSBBW3Jvd11bcGl2b3Rfcm93XS9BW3Bpdm90X3Jvd11bcGl2b3Rfcm93XQogICAgICAgICAgICAjdGhlIG9ubHkgb25lIGluIHRoaXMgY29sdW1uIHNpbmNlIHRoZSByZXN0IGFyZSB6ZXJvCiAgICAgICAgICAgIEFbcm93XVtwaXZvdF9yb3ddID0gbXVsdGlwbGllcgogICAgICAgICAgICBmb3IgY29sIGluIHhyYW5nZShwaXZvdF9yb3cgKyAxLCBuKToKICAgICAgICAgICAgICAgIEFbcm93XVtjb2xdID0gQVtyb3ddW2NvbF0gLSBtdWx0aXBsaWVyKkFbcGl2b3Rfcm93XVtjb2xdCiAgICAgICAgICAgICNFcXVhdGlvbiBzb2x1dGlvbiBjb2x1bW4KICAgICAgICAgICAgYltyb3ddID0gYltyb3ddIC0gbXVsdGlwbGllcipiW3Bpdm90X3Jvd10KICAgIHByaW50IEEKICAgIHByaW50IGIKICAgIHggPSBucC56ZXJvcyhuKQogICAgayA9IG4tMQogICAgeFtrXSA9IGJba10vQVtrLGtdCiAgICB3aGlsZSBrID49IDA6CiAgICAgICAgeFtrXSA9IChiW2tdIC0gbnAuZG90KEFbayxrKzE6XSx4W2srMTpdKSkvQVtrLGtdCiAgICAgICAgayA9IGstMQogICAgcmV0dXJuIHgKIApkZWYgR0VQUChBLCBiKToKICAgICcnJwogICAgR2F1c3NpYW4gZWxpbWluYXRpb24gd2l0aCBwYXJ0aWFsIHBpdm90aW5nLgogICAgJSBpbnB1dDogQSBpcyBhbiBuIHggbiBub25zaW5ndWxhciBtYXRyaXgKICAgICUgICAgICAgIGIgaXMgYW4gbiB4IDEgdmVjdG9yCiAgICAlIG91dHB1dDogeCBpcyB0aGUgc29sdXRpb24gb2YgQXg9Yi4KICAgICUgcG9zdC1jb25kaXRpb246IEEgYW5kIGIgaGF2ZSBiZWVuIG1vZGlmaWVkLiAKICAgICcnJwogICAgbiA9ICBsZW4oQSkKICAgIGlmIGIuc2l6ZSAhPSBuOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgYXJndW1lbnQ6IGluY29tcGF0aWJsZSBzaXplcyBiZXR3ZWVuIEEgJiBiLiIsIGIuc2l6ZSwgbikKICAgICMgayByZXByZXNlbnRzIHRoZSBjdXJyZW50IHBpdm90IHJvdy4gU2luY2UgR0UgdHJhdmVyc2VzIHRoZSBtYXRyaXggaW4gdGhlIHVwcGVyIAogICAgIyByaWdodCB0cmlhbmdsZSwgd2UgYWxzbyB1c2UgayBmb3IgaW5kaWNhdGluZyB0aGUgay10aCBkaWFnb25hbCBjb2x1bW4gaW5kZXguCiAgICBmb3IgayBpbiB4cmFuZ2Uobi0xKToKICAgICAgICAjQ2hvb3NlIGxhcmdlc3QgcGl2b3QgZWxlbWVudCBiZWxvdyAoYW5kIGluY2x1ZGluZykgawogICAgICAgIG1heGluZGV4ID0gYWJzKEFbazosa10pLmFyZ21heCgpICsgawogICAgICAgIGlmIEFbbWF4aW5kZXgsIGtdID09IDA6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk1hdHJpeCBpcyBzaW5ndWxhci4iKQogICAgICAgICNTd2FwIHJvd3MKICAgICAgICBpZiBtYXhpbmRleCAhPSBrOgogICAgICAgICAgICBBW1trLG1heGluZGV4XV0gPSBBW1ttYXhpbmRleCwga11dCiAgICAgICAgICAgIGJbW2ssbWF4aW5kZXhdXSA9IGJbW21heGluZGV4LCBrXV0KICAgICAgICBmb3Igcm93IGluIHhyYW5nZShrKzEsIG4pOgogICAgICAgICAgICBtdWx0aXBsaWVyID0gQVtyb3ddW2tdL0Fba11ba10KICAgICAgICAgICAgI3RoZSBvbmx5IG9uZSBpbiB0aGlzIGNvbHVtbiBzaW5jZSB0aGUgcmVzdCBhcmUgemVybwogICAgICAgICAgICBBW3Jvd11ba10gPSBtdWx0aXBsaWVyCiAgICAgICAgICAgIGZvciBjb2wgaW4geHJhbmdlKGsgKyAxLCBuKToKICAgICAgICAgICAgICAgIEFbcm93XVtjb2xdID0gQVtyb3ddW2NvbF0gLSBtdWx0aXBsaWVyKkFba11bY29sXQogICAgICAgICAgICAjRXF1YXRpb24gc29sdXRpb24gY29sdW1uCiAgICAgICAgICAgIGJbcm93XSA9IGJbcm93XSAtIG11bHRpcGxpZXIqYltrXQogICAgcHJpbnQgQQogICAgcHJpbnQgYgogICAgeCA9IG5wLnplcm9zKG4pCiAgICBrID0gbi0xCiAgICB4W2tdID0gYltrXS9BW2ssa10KICAgIHdoaWxlIGsgPj0gMDoKICAgICAgICB4W2tdID0gKGJba10gLSBucC5kb3QoQVtrLGsrMTpdLHhbaysxOl0pKS9BW2ssa10KICAgICAgICBrID0gay0xCiAgICByZXR1cm4geAogCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBBID0gbnAuYXJyYXkoW1syLCA0LCAtMiwgLTJdLCBbMSwgMiwgNCwgLTNdLCBbLTMsIC0zLCA4LCAtMl0sIFstMSwgMSwgNiwgLTNdXSkKICAgIGIgPSBucC5hcnJheShbLTQsIDUsIDcsIDddKQogICAgcHJpbnQgR0VOUChucC5jb3B5KEEpLCBucC5jb3B5KGIpKQogICAgcHJpbnQgR0VQUChBLGIpIyB5b3VyIGNvZGUgZ29lcyBoZXJl