Esempio n. 1
0
             '$|| u - u_h||_{0}$',
             '$||\\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()
Esempio n. 2
0
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()