-
-
Notifications
You must be signed in to change notification settings - Fork 360
Implement gaussian elimination in python #370
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
import numpy as np | ||
|
||
def gaussian_elimination(A): | ||
|
||
pivot_row = 0 | ||
|
||
# Step 1: Go by column | ||
for pivot_col in range(min(A.shape[0], A.shape[1])): | ||
|
||
# Step 2: Swap row with highest element in col | ||
max_i = np.argmax(abs(A[pivot_row:,pivot_col])) + pivot_row | ||
|
||
temp = A[pivot_row,:].copy() | ||
A[pivot_row,:] = A[max_i,:] | ||
A[max_i,:] = temp | ||
|
||
# Skip on singular matrix, not actually a pivot | ||
if A[pivot_row, pivot_col] == 0: | ||
continue | ||
|
||
# Steps 3 & 4: Zero out elements below pivot | ||
for r in range(pivot_row+1, A.shape[0]): | ||
# Step 3: Get fraction | ||
frac = -A[r,pivot_col] / A[pivot_row,pivot_col] | ||
# Step 4: Add rows | ||
A[r,:] = A[r,:] + frac*A[pivot_row,:] | ||
|
||
pivot_row += 1 | ||
|
||
|
||
""" | ||
Assumes A is already ref | ||
""" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If you want a code comment and not an actual function docstring (which would go under the |
||
def gauss_jordon_elimination(A): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
|
||
col = 0 | ||
|
||
# Scan for pivots | ||
for row in range(A.shape[0]): | ||
while col < A.shape[1] and A[row,col] == 0: | ||
col += 1 | ||
|
||
if col >= A.shape[1]: | ||
continue | ||
|
||
# Set each pivot to one via row scaling | ||
A[row,:] = A[row,:] / A[row,col] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use |
||
|
||
# Zero out elements above pivot | ||
for r in range(row): | ||
A[r,:] = A[r,:] - A[r,col] * A[row,:] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use |
||
|
||
|
||
""" | ||
Assumes A has a unique solution and A in ref | ||
""" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same docstring and ref comment. |
||
def back_substitution(A): | ||
|
||
sol = np.zeros(A.shape[0]).T | ||
|
||
# Go by pivots along diagonal | ||
for pivot_i in range(A.shape[0]-1, -1, -1): | ||
s = 0 | ||
for col in range(pivot_i+1, A.shape[1]-1): | ||
s += A[pivot_i,col] * sol[col] | ||
sol[pivot_i] = (A[pivot_i,A.shape[1]-1] - s) / A[pivot_i,pivot_i] | ||
|
||
return sol | ||
|
||
|
||
def main(): | ||
A = np.matrix('2. 3 4 6; 1 2 3 4; 3 -4 0 10') | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
A = np.array([[2, 3, 4, 6],
[1, 2, 3, 4],
[3, -4, 0, 10]], dtype=float) or A = np.array([[2.0, 3.0, 4.0, 6.0],
[1.0, 2.0, 3.0, 4.0],
[3.0, -4.0, 0.0, 10.0]]) |
||
|
||
print("Original") | ||
print(A, "\n") | ||
|
||
gaussian_elimination(A) | ||
print("Gaussian elimination, REF") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would not abbreviate REF in print output. |
||
print(A, "\n") | ||
|
||
print("Back subsitution") | ||
print(back_substitution(A)) | ||
print() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can you make this more consistent with the other printing sections? print("Back substitution")
print(back_substitution(A), "\n") |
||
|
||
gauss_jordon_elimination(A) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
print("Gauss-Jordan, RREF") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would not abbreviate RREF in print output. |
||
print(A, "\n") | ||
|
||
|
||
if __name__ == "__main__": | ||
main() | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use
+=
here.