def solve_gauss_seidel(A, b, x0=None, maxiter=100): N = len(b) L, D, U = lower_diag_upper(A) E = -L F = -U x = parse_initial_cond(x0, N) residual = 1 for _ in xrange(maxiter): x = spsolve(D - E, (b + F * x)) residual = compute_normalized_linf_residual(A, x, b) return x, residual
def solve_jacobi(A, b, x0=None, maxiter=100): N = len(b) L, D, U = lower_diag_upper(A) E = - L F = - U D.data[:] = 1. / D.data[:] D_inv = D x = parse_initial_cond(x0, N) for _ in xrange(maxiter): x = D_inv * (b + (E + F) * x) residual = compute_normalized_linf_residual(A, x, b) return x, residual
def solve_ssor(A, b, x0=None, maxiter=100): L, D, U = lower_diag_upper(A) E = -L F = -U N = len(b) x = parse_initial_cond(x0, N) w = 1.24 residual = 1 for _ in xrange(maxiter): x_gauss_seidel = spsolve(D - E, (b + F * x)) x = w * x_gauss_seidel + (1. - w) * x x_gauss_seidel = spsolve(D - F, (b + E * x)) x = w * x_gauss_seidel + (1. - w) * x residual = compute_normalized_l2_residual(A, x, b) return x, residual