'$||\\nabla u - \\nabla u_h||_{0}$', '$||\\nabla u - G(\\nabla u_h)||_{0}$'] ralg = FEMFunctionRecoveryAlg() Ndof = np.zeros((maxit,), dtype=np.int) errorMatrix = np.zeros((len(errorType), maxit), dtype=np.float) for i in range(maxit): print('step:', i) fem = PoissonFEMModel(pde, mesh, 1, q=3) fem.solve() uh = fem.uh Ndof[i] = fem.mesh.number_of_nodes() errorMatrix[0, i] = fem.l2_error() errorMatrix[1, i] = fem.L2_error() errorMatrix[2, i] = fem.H1_semi_error() # rguh = ralg.harmonic_average(uh) # eta = fem.recover_estimate(rguh) eta = fem.residual_estimate() errorMatrix[3, i] = np.sqrt(np.sum(eta**2)) markedCell = mark(eta, theta=theta) if i < maxit - 1: isMarkedCell = mark(eta, theta=theta) A = mesh.bisect(isMarkedCell, returnim=True) fig = plt.figure() axes = fig.gca(projection='3d') mesh.add_plot(axes, alpha=0, showedge=True) showmultirate(plt, 0, Ndof, errorMatrix, errorType) plt.show()
p = int(sys.argv[2]) # 有限元空间的次数 n = int(sys.argv[3]) # 初始网格的加密次数 maxit = int(sys.argv[4]) # 迭代加密的次数 pde = PDE() # 创建 pde 模型 # 误差类型与误差存储数组 errorType = ['$|| u - u_h||_0$', '$||\\nabla u - \\nabla u_h||_0$'] errorMatrix = np.zeros((len(errorType), maxit), dtype=np.float) # 自由度数组 Ndof = np.zeros(maxit, dtype=np.int) # 创建初始网格对象 mesh = pde.init_mesh(n) for i in range(maxit): fem = PoissonFEMModel(pde, mesh, p, q=p + 2) # 创建 Poisson 有限元模型 ls = fem.solve() # 求解 Ndof[i] = fem.space.number_of_global_dofs() # 获得空间自由度个数 errorMatrix[0, i] = fem.L2_error() # 计算 L2 误差 errorMatrix[1, i] = fem.H1_semi_error() # 计算 H1 误差 if i < maxit - 1: mesh.uniform_refine() # 一致加密网格 # 显示误差 show_error_table(Ndof, errorType, errorMatrix) # 可视化误差收敛阶 showmultirate(plt, 0, Ndof, errorMatrix, errorType) plt.show()