def iteration_checker(size, test_num, val_range, res_opt=0): for i in range(0, test_num): (a, b, x) = generate_linear_system(size, val_range) a_float = np.array(a, dtype=np.float64) b_float = np.array(b, dtype=np.float64) x1 = [] l, u = [], [] (x1, l, u, fra, frb, fr) = rdft.rdft_lu_solver_with_lu(a, b) x0 = x1 x1_after = np.array(x1) x1_after = iteration.iteration(fra, l, u, frb, x1_after, linalg.cond(fra)) x1_after = iteration.remove_imag(x1_after) (x2, pl, pu, swapped_a, swapped_b) = pp.solve(a_float, b_float) x3 = iteration.iteration(swapped_a, pl, pu, swapped_b, x2, linalg.cond(a_float)) #x2 = lib.lu_solver(a,b) #x2 = lib.direct_solver(a_float,b_float) #x4 = lib.direct_lu_solver(a,b) if res_opt == 1: print("---error---") print("cond:", linalg.cond(a)) print("[0] error", linalg.norm(b - a.dot(x0))) print("[1] error", linalg.norm(b - a.dot(x1))) #print("[2] error", linalg.norm(b - a.dot(x2))) #print("[3] error", linalg.norm(b - a.dot(x3))) elif res_opt == 2: print( str(linalg.cond(a)) + " " + str(linalg.norm(x - x0)) + " " + str(linalg.norm(x - x1_before)) + " " + str(linalg.norm(x - x1_after)) + " " + str(linalg.norm(x - x5)) + " " + str(linalg.norm(x - x2)) + " " + str(linalg.norm(x - x3))) elif res_opt == 3: step = [] for j in x4_step: step.append(linalg.norm(x - j)) print( str(linalg.cond(a)) + " " + str(linalg.norm(x - x0)) + " " + str(linalg.norm(x - x1_before)) + " " + str(linalg.norm(x - x1_after)) + " " + str(step) + " " + str(linalg.norm(x - x2))) # partial pivot only elif res_opt == 4: print( str(linalg.cond(a)) + " " + str(linalg.norm(x - x0)) + " " + str(linalg.norm(x - x2)) + " " + str(linalg.norm(x - x4))) # partial pivot only elif res_opt != 1: print("---error---") print("cond:", linalg.cond(a)) print("[0] error", linalg.norm(x - x0)) print("[1] error", linalg.norm(x - x1_before)) # remove_imag => iteration print("[2] error", linalg.norm(x - x1_after)) # iteration => remove_imag print("[3] error", linalg.norm(x - x2))
def iteration_checker(size, test_num, val_range, res_opt=0): for i in range(0,test_num): (a,b,x) = generate_linear_system(size, val_range) a_float = np.array(a,dtype=np.float64) b_float = np.array(b,dtype=np.float64) x1 = [] l,u = [], [] (x1, l, u, fra, frb, fr) = rdft.rdft_lu_solver_with_lu(a,b) x0 = x1 x1_after = np.array(x1) x1_after = iteration.iteration(fra, l, u, frb, x1_after, linalg.cond(fra)) x1_after = iteration.remove_imag(x1_after) (x2, pl, pu, swapped_a, swapped_b) = pp.solve(a_float,b_float) x3 = iteration.iteration(swapped_a, pl, pu, swapped_b, x2, linalg.cond(a_float)) #x2 = lib.lu_solver(a,b) #x2 = lib.direct_solver(a_float,b_float) #x4 = lib.direct_lu_solver(a,b) if res_opt == 1: print("---error---") print("cond:", linalg.cond(a)) print("[0] error", linalg.norm(b - a.dot(x0))) print("[1] error", linalg.norm(b - a.dot(x1))) #print("[2] error", linalg.norm(b - a.dot(x2))) #print("[3] error", linalg.norm(b - a.dot(x3))) elif res_opt == 2: print(str(linalg.cond(a)) + " " + str(linalg.norm(x - x0)) + " " + str(linalg.norm(x - x1_before)) + " " + str(linalg.norm(x - x1_after)) + " " + str(linalg.norm(x - x5)) + " " + str(linalg.norm(x - x2)) + " " + str(linalg.norm(x - x3))) elif res_opt == 3: step = [] for j in x4_step: step.append(linalg.norm(x - j)) print(str(linalg.cond(a)) + " " + str(linalg.norm(x - x0)) + " " + str(linalg.norm(x - x1_before)) + " " + str(linalg.norm(x - x1_after)) + " " + str(step) + " " + str(linalg.norm(x - x2))) # partial pivot only elif res_opt == 4: print(str(linalg.cond(a)) + " " + str(linalg.norm(x - x0)) + " " + str(linalg.norm(x - x2)) + " " + str(linalg.norm(x - x4))) # partial pivot only elif res_opt != 1: print("---error---") print("cond:", linalg.cond(a)) print("[0] error", linalg.norm(x - x0)) print("[1] error", linalg.norm(x - x1_before)) # remove_imag => iteration print("[2] error", linalg.norm(x - x1_after)) # iteration => remove_imag print("[3] error", linalg.norm(x - x2))
def solve_getinfo(a, b, x, sample): mat = np.array(a) (size, _) = a.shape result = [] a_cond = linalg.cond(mat) (a_maxcond, _, a_subcond) = rdft.get_leading_maxcond(mat) for i in range(0, sample): # RDFT solve (x1, fra, fr, ra, x1_orig) = solve_rdft(a, b, x) (fra_maxcond, _, fra_subcond) = rdft.get_leading_maxcond(fra) fra_cond = linalg.cond(fra) err_rdft_iter = linalg.norm(x1 - x) err_rdft = linalg.norm(x1_orig - x) # RDFT improved solve (x1_imp, fra_imp, fr_imp, ra_imp, x1_imp_orig) = solve_rdft_improved(a, b, x) (fra_maxcond_imp, _, fra_subcond_imp) = rdft.get_leading_maxcond(fra) fra_cond_imp = linalg.cond(fra_imp) err_rdft_imp_iter = linalg.norm(x1_imp - x) err_rdft_imp = linalg.norm(x1_imp_orig - x) # RDFT givens solve (x5_imp, x5_imp_orig) = solve_rdft_givens(a, b, x) err_rdft_givens_iter = linalg.norm(x5_imp - x) err_rdft_givens = linalg.norm(x5_imp_orig - x) # RDFT givens solve (x7_imp, x7_imp_orig) = solve_rdft_givens_both(a, b, x) err_rdft_givens_both_iter = linalg.norm(x7_imp - x) err_rdft_givens_both = linalg.norm(x7_imp_orig - x) # GAUSS solve (x2, ga, _, x2_orig) = solve_gauss(a, b, x) (ga_maxcond, _, ga_subcond) = rdft.get_leading_maxcond(fra) ga_cond = linalg.cond(ga) err_gauss_iter = linalg.norm(x2 - x) err_gauss = linalg.norm(x2_orig - x) # Partial Pivot a_float = np.array(a, dtype=np.float64) b_float = np.array(b, dtype=np.float64) (x3, pl, pu, swapped_a, swapped_b) = pp.solve(a_float, b_float) err_pp = linalg.norm(x3 - x) ##x3_i = iteration.iteration(swapped_a, pl, pu, swapped_b, x3, linalg.cond(a_float)) #result make result.append( ([ a_maxcond / a_cond, fra_maxcond / fra_cond, fra, a_subcond, fra_subcond, fr, ra, err_rdft_iter, err_rdft, err_rdft_imp_iter, err_rdft_imp ], [err_rdft_givens_iter, err_rdft_givens ], [err_rdft_givens_both_iter, err_rdft_givens_both], [ga_maxcond / ga_cond, ga, ga_subcond, err_gauss_iter, err_gauss], [err_pp])) return result
def solve_getinfo(a,b,x,sample): mat = np.array(a) (size,_) = a.shape result = [] a_cond = linalg.cond(mat) (a_maxcond,_,a_subcond) = rdft.get_leading_maxcond(mat) for i in range(0, sample): # RDFT solve (x1, fra, fr, ra, x1_orig) = solve_rdft(a,b,x) (fra_maxcond,_,fra_subcond) = rdft.get_leading_maxcond(fra) fra_cond = linalg.cond(fra) err_rdft_iter = linalg.norm(x1-x) err_rdft = linalg.norm(x1_orig-x) # RDFT improved solve (x1_imp, fra_imp, fr_imp, ra_imp, x1_imp_orig) = solve_rdft_improved(a,b,x) (fra_maxcond_imp,_,fra_subcond_imp) = rdft.get_leading_maxcond(fra) fra_cond_imp = linalg.cond(fra_imp) err_rdft_imp_iter = linalg.norm(x1_imp-x) err_rdft_imp = linalg.norm(x1_imp_orig-x) # RDFT givens solve (x5_imp, x5_imp_orig) = solve_rdft_givens(a,b,x) err_rdft_givens_iter = linalg.norm(x5_imp-x) err_rdft_givens = linalg.norm(x5_imp_orig-x) # RDFT givens solve (x7_imp, x7_imp_orig) = solve_rdft_givens_both(a,b,x) err_rdft_givens_both_iter = linalg.norm(x7_imp-x) err_rdft_givens_both = linalg.norm(x7_imp_orig-x) # GAUSS solve (x2, ga, _, x2_orig) = solve_gauss(a,b,x) (ga_maxcond,_,ga_subcond) = rdft.get_leading_maxcond(fra) ga_cond = linalg.cond(ga) err_gauss_iter = linalg.norm(x2-x) err_gauss = linalg.norm(x2_orig-x) # Partial Pivot a_float = np.array(a,dtype=np.float64) b_float = np.array(b,dtype=np.float64) (x3, pl, pu, swapped_a, swapped_b) = pp.solve(a_float,b_float) err_pp = linalg.norm(x3-x) ##x3_i = iteration.iteration(swapped_a, pl, pu, swapped_b, x3, linalg.cond(a_float)) #result make result.append(([a_maxcond/a_cond, fra_maxcond/fra_cond, fra, a_subcond, fra_subcond, fr, ra, err_rdft_iter, err_rdft,err_rdft_imp_iter,err_rdft_imp],[err_rdft_givens_iter,err_rdft_givens],[err_rdft_givens_both_iter,err_rdft_givens_both],[ga_maxcond/ga_cond, ga, ga_subcond, err_gauss_iter, err_gauss],[err_pp])) return result