Source: http://personal.cege.umn.edu/~voller/ce3101_2009/matlab_solver.pdf