Gaussian Elimination in Python
3x + 2y + z = 12 2x + y + 2z = 36 x + 2y + 4z = 4
Stuck trying to solve a bunch of simultaneous linear equations?
You want to use Gaussian elimination! It's generally easy to solve two or three simultaneous linear equations with a few variables, but as the number of variables grow it's nifty to have a computer solve the problem for you. Here's a cool javascript implementation which supports up to 5x5 that you can use to get an idea on how the process looks.
Here is a gaussian elimination implementation in Python, written by me from scatch for 6.01X (the advanced programming version of 6.01, MIT's intro to EECS course). I originally looked at the Wikipedia pseudocode and tried to essentially rewrite that in Python, but that was more trouble than it was worth so I just redid it from scratch. It's way simpler than a lot of the other python implementations out there (~170 lines or so). This one is roughly 15 logical lines - it's also available on Github.
def myGauss(m): #eliminate columns for col in range(len(m[0])): for row in range(col+1, len(m)): r = [(rowValue * (-(m[row][col] / m[col][col]))) for rowValue in m[col]] m[row] = [sum(pair) for pair in zip(m[row], r)] #now backsolve by substitution ans = [] m.reverse() #makes it easier to backsolve for sol in range(len(m)): if sol == 0: ans.append(m[sol][-1] / m[sol][-2]) else: inner = 0 #substitute in all known coefficients for x in range(sol): inner += (ans[x]*m[sol][-2-x]) #the equation is now reduced to ax + b = c form #solve with (c - b) / a ans.append((m[sol][-1]-inner)/m[sol][-sol-2]) ans.reverse() return ans
tests:
print myGauss([[S('x'),2.0,6.0], [2.0,6.0,0]]) print myGauss([[S('M') * S('x'),S('b'),S('y')], [2.0,6.0,0]]) print myGauss([[-3.0,2.0,-6.0,6.0], [5.0,7.0,-5.0,6.0], [1.0,4.0,-2.0,8.0]]) print str(myGauss([[2.0,4.0,6.0,8.0,10.0,0.0], [1.0,3.0,5.0,8.0,3.0,-1.0], [3.0,8.0,9.0,20.0,3.0,5.0], [4.0,8.0,9.0,-2.0,3.0,8.0], [5.0,-3.0,3.0,-2.0,1.0,0]])) == '[1.8835063437139565, 1.7012687427912341, -1.4160899653979238, -0.050749711649365627, -0.16695501730103807]' print 'example from the wikipedia' print myGauss([[2.0,1.0,-1.0,8.0], [-3.0,-1.0,2.0,-11.0], [-2.0,1.0,2.0,-3.0]]) print myGauss([[1.0,4.0,-2.0,8.0], [5.0,7.0,-5.0,6.0], [-3.0,2.0,-6.0,6.0]])