def test(d=1): n = np.random.randint(low=3, high=10, size=d) n = 3 * np.ones(d, dtype=int) bounds = d * [np.array([-1, 1])] if d > 1: bounds[-1] *= 100 expr = '' for i in range(d): expr += f"cos(pi*x{i})+" expr = expr[:-1] uex = anasol.AnalyticalSolution(expr, dim=d) solvers = ["direct", "pyamg", "mg"] solvers = ["pyamg", "mg"] N, errs, its, ts = [], {}, {}, {} for solver in solvers: errs[solver], its[solver], ts[solver] = [], [], [] gold = None while (1): n = 2 * n - 1 g = grid.Grid(n=n, bounds=bounds) if g.nall() > 2 * 1e6 or np.max(g.dx) < 1e-3: break N.append(g.nall()) A = matrix.createMatrixDiff(g) b = matrix.createRhsVectorDiff(g, uex) if gold == None: u0 = np.zeros_like(b) else: u0 = transfer.interpolate(gridf=g, gridc=gold, uold=uold) for solver in solvers: u, t, it = solve.solve(solver, A, b, x0=u0, grid=g) err = errors.errorl2(g, u, uex) errs[solver].append(err) its[solver].append(it) ts[solver].append(t) uold, gold = u, g print(f"its={its}") fig = plt.figure() ax = fig.add_subplot(311) ax.set_xlabel(r'$\log_{10}(N)$') ax.set_ylabel(r'$\log_{10}(e)$') ax.set_title(f"{expr}") for solver in solvers: ax.plot(np.log10(N), np.log10(errs[solver]), '-x', label=f"{solver}") ax.legend() ax = fig.add_subplot(312) ax.set_xlabel(r'$\log_{10}(N)$') ax.set_ylabel(r'it') ax.set_title(f"iter") for solver in solvers: ax.plot(np.log10(N), its[solver], '-x', label=f"{solver}") ax.legend() ax = fig.add_subplot(313) ax.set_xlabel(r'$\log_{10}(N)$') ax.set_ylabel(r't') ax.set_title(f"time") for solver in solvers: ax.plot(np.log10(N), np.log10(ts[solver]), '-x', label=f"{solver}") ax.legend() plt.show()
def test(solvers, d=1): n = np.random.randint(low=10,high=20, size=d) bounds = d*[[-1,1]] g = grid.Grid(n=n, bounds=bounds) expr = '' for i in range(d): expr += f"{np.random.randint(low=1,high=9)}*x{i}+" uex = anasol.AnalyticalSolution(expr[:-1], dim=g.dim) A = matrix.createMatrixDiff(g) b = matrix.createRhsVectorDiff(g, uex) for solver in solvers: u, t, iter = solve(solver, A, b, grid=g) err = errors.errorl2(g, u, uex) print(f"grid={g}\nsolver = {solver}\terr = {err:10.4e}\t time = {t}\t iter = {iter}")
def test(d=1): n = np.random.randint(low=4, high=8, size=d) bounds = d * [[-1, 1]] g = grid.Grid(n=n, bounds=bounds) expr = '' for i in range(d): expr += f"{np.random.randint(low=1,high=9)}*x{i}+" uex = anasol.AnalyticalSolution(expr[:-1], dim=g.dim) A = matrix.createMatrixDiff(g) b = matrix.createRhsVectorDiff(g, uex) u = splinalg.spsolve(A, b) err = errors.errorl2(g, u, uex) print(f"u={uex} grid={g}\nerr = {err:10.4e}")
def test(d=1): n = np.random.randint(low=3, high=4, size=d) bounds = d * [[-1, 1]] expr = '' for i in range(d): expr += f"cos(pi*x{i})+" expr = expr[:-1] uex = anasol.AnalyticalSolution(expr, dim=d) N, errs, its, ts = [], [], [], [] gold = None for k in range(2 * (6 - d)): n = 2 * n - 1 g = grid.Grid(n=n, bounds=bounds) A = matrix.createMatrixDiff(g) b = matrix.createRhsVectorDiff(g, uex) if gold == None: u0 = np.zeros_like(b) else: u0 = transfer.interpolate(gridf=g, gridc=gold, uold=uold) u, t, it = solve.solve("pyamg", A, b, x0=u0) err = errors.errorl2(g, u, uex) uold, gold = u, g N.append(g.nall()) errs.append(err) its.append(it) ts.append(t) # print(f"u={uex} grid={g}\nerr = {err:10.4e}") slope, ic, r, p, stderr = stats.linregress(np.log10(N), np.log10(errs)) # print(f"y = {slope:4.2f} * x {ic:+4.2f}") fig = plt.figure() ax = fig.add_subplot(211) ax.set_xlabel(r'$\log_{10}(N)$') ax.set_ylabel(r'$\log_{10}(e)$') ax.set_title(f"{expr}") ax.plot(np.log10(N), np.log10(errs), '-x', label=f"err") ax.plot(np.log10(N), ic + slope * np.log10(N), '-k', label=f"y = {slope:4.2f} * x {ic:+4.2f}") ax.legend() ax = fig.add_subplot(212) ax.set_xlabel(r'$\log_{10}(N)$') ax.set_ylabel(r'it', color='b') p0, = ax.plot(np.log10(N), its, '-xb', label=f"it") ax.set_title(f"iter/time") axt = ax.twinx() p1, = axt.plot(np.log10(N), np.log10(ts), '-xr', label=f"t") axt.set_ylabel(r'$\log_{10}(t)$', color='r') ax.tick_params(axis='y', labelcolor='b') axt.tick_params(axis='y', labelcolor='r') plt.legend(handles=[p0, p1]) plt.show()
#=================================================================# class MgDriver(mg.FdDriver): def __init__(self, grid, A, **kwargs): maxlevel=-10000 if grid.dim == 1: maxlevel = -100 super().__init__(grid, A=A, smoothers=['lgs'], maxlevel=maxlevel) #=================================================================# def solve(A, b, grid, x0=None, verbose=True): mgD = MgDriver(grid, A) mgS = mg.MultiGrid(mgD) return mgS.solve(b, x0=x0, verbose=verbose) #=================================================================# if __name__ == '__main__': import matplotlib.pyplot as plt d, l = 3, 6 expr = '' for i in range(d): expr += f"log(1+x{i}**2)*" expr = expr[:-1] uex = anasol.AnalyticalSolution(expr, dim=d) bounds=d*[[-1,1]] grid = grid.Grid(n=np.array(d*[2**l+1]), bounds=bounds) print(f"uex = {uex} N={grid.nall()}") b = matrix.createRhsVectorDiff(grid, uex) A = matrix.createMatrixDiff(grid) u, res = solve(A, b, grid) plotgrid.plot(grid, u=u) plt.show()