for i in range(nc): #%% 2 Generate Mesh and FEM n = int(5 * (2**i)) ng = 5 mesh = genMesh1D(domain, n) fem = genFEM1D(mesh, pd) #%% 3 Node type and DOF fem.genBC1D(domain, bc) #%% 4 Generate Matrices abd Vectors Mxx = globalMatrix1D(pde.a, mesh, fem, 1, fem, 1, ng) M0x = globalMatrix1D(pde.b, mesh, fem, 0, fem, 1, ng) M00 = globalMatrix1D(pde.c, mesh, fem, 0, fem, 0, ng) f = globalVec1D(pde.f, mesh, fem, 0, ng) #%% 5 Dirichlet boundary condition uD = pde.gD(fem.p) uD[fem.dof] = 0.0 bxx = Mxx @ uD b0x = M0x @ uD b00 = M00 @ uD #%% 6 Neumann boundary condition bN = np.zeros(np.shape(fem.p)) bN[fem.ptype == 2] = pde.gN(fem.p[fem.ptype == 2]) #%% 7 Extract degree of freedom ii, jj = np.meshgrid(fem.dof, fem.dof, indexing='ij') A = Mxx[ii, jj] + M0x[ii, jj] + M00[ii, jj]
onefun = lambda x: 1.0 error_list = [] fig, axs = plt.subplots(4, 5, sharex=True, sharey=True, figsize=(20, 16)) for pd in [1, 2, 3, 4]: file = open(f'./logs/hw2_problem2_projection_out_{pd}.log', 'w') sys.stdout = file for i in range(5): n = int(4 * (2**i)) mesh = genMesh1D(domain, n) fem = genFEM1D(mesh, pd) M = globalMatrix1D(onefun, mesh, fem, 0, fem, 0, ng) b = globalVec1D(fun, mesh, fem, 0, ng) uh = inv(M) @ b for k in range(n): vert = mesh.p[mesh.t[k, :]] x = np.linspace(vert[0], vert[1], 101) uhK = uh[fem.t[k, :]] u = evalFEfun1D(x, uhK, vert, pd, dind) axs[pd - 1, i].plot(x, fun(x), 'k', lw=2) axs[pd - 1, i].plot(x, u, 'r', lw=1) axs[pd - 1, i].grid() custom_lines = [