def gaussian_elimination(m): """ Parameters ---------- m : list of list of floats (matrix) Returns ------- list of floats solution to the system of linear equation Raises ------ ValueError no unique solution """ # forward elimination n = height(m) for i in range(n): for j in range(i+1, n): m[j] = [m[j][k] - m[i][k]*m[j][i]/m[i][i] for k in range(n+1)] if m[n-1][n-1] == 0: raise ValueError('No unique solution') # backward substitution x = [0] * n for i in range(n-1, -1, -1): # for i in reversed(range(n)): s = sum(m[i][j] * x[j] for j in range(i, n)) x[i] = (m[i][n] - s) / m[i][i] return x
def gaussian_elimination_with_pivot(m): """ Parameters ---------- m : list of list of floats (matrix) Returns ------- list of floats solution to the system of linear equation Raises ------ ValueError no unique solution """ # forward elimination n = height(m) for i in range(n): pivot(m, n, i) for j in range(i + 1, n): m[j] = [ m[j][k] - m[i][k] * m[j][i] / m[i][i] for k in range(n + 1) ] if m[n - 1][n - 1] == 0: raise ValueError('No unique solution') # backward substitution x = [0] * n for i in range(n - 1, -1, -1): s = sum(m[i][j] * x[j] for j in range(i, n)) x[i] = (m[i][n] - s) / m[i][i] return x
def jacobi(m, x0=None, eps=1e-5, max_iteration=100): n = height(m) x0 = [0] * n if x0 == None else x0 x1 = [None] * n for __ in range(max_iteration): for i in range(n): s = sum(-m[i][j] * x0[j] for j in range(n) if i != j) x1[i] = (m[i][n] + s) / m[i][i] if all(abs(x1[i] - x0[i]) < eps for i in range(n)): return x1 x0, x1 = x1, x0 raise ValueError('Solution does not converge')
def gauss_seidel(m, x0=None, eps=1e-5, max_iteration=100): n = height(m) x0 = [0] * n if x0 == None else x0 x1 = x0[:] for __ in range(max_iteration): for i in range(n): s = sum(-m[i][j] * x1[j] for j in range(n) if i != j) x1[i] = (m[i][n] + s) / m[i][i] if all(abs(x1[i] - x0[i]) < eps for i in range(n)): return x1 x0 = x1[:] raise ValueError("Solution does not converge")
def jacobi(m, x0=None, eps=1e-5, max_iteration=100): n = height(m) x0 = [0] * n if x0 == None else x0 x1 = [None] * n for __ in range(max_iteration): for i in range(n): s = sum(-m[i][j] * x0[j] for j in range(n) if i != j) x1[i] = (m[i][n] + s) / m[i][i] if all(abs(x1[i]-x0[i]) < eps for i in range(n)): return x1 x0, x1 = x1, x0 raise ValueError('Solution does not converge')