コード例 #1
0
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))
コード例 #2
0
ファイル: main.py プロジェクト: warelle/rdft
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))
コード例 #3
0
ファイル: myinput.py プロジェクト: warelle/rdft
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
コード例 #4
0
ファイル: myinput.py プロジェクト: warelle/rdft
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