Created
November 11, 2011 05:56
-
-
Save num3ric/1357315 to your computer and use it in GitHub Desktop.
Gaussian elimination using NumPy.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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([[1.,-1.,1.,-1.],[1.,0.,0.,0.],[1.,1.,1.,1.],[1.,2.,4.,8.]]) | |
b = np.array([[14.],[4.],[2.],[2.]]) | |
print GENP(np.copy(A), np.copy(b)) | |
print GEPP(A,b) |
I forked this code and fixed the bug pointed out above, as well as making it more compact.
@tkralphs Can you provide a link to your fork?
I have forked tkralphs's code and modularized it. Allowing people to import it as a module to an existing project. https://gist.github.com/jgcastro89/49090cc69a499a129413597433b9baab
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
shouldnt lines 18 and 58 read A[row][pivot_row] = 0 and A[row][k] = 0?