예제 #1
0
Ndof = np.zeros((maxit, ), dtype=np.int)
errorType = [
    '$|| u - u_h||_0$ with p=1',
    '$|| u - u_h||_0$ with p=2',
    '$|| u - u_h||_0$ with p=3',
    '$||\\nabla u - \\nabla u_h||_0$ with p=1',
    '$||\\nabla u - \\nabla u_h||_0$ with p=2',
    '$||\\nabla u - \\nabla u_h||_0$ with p=3',
]

ps = [1, 2, 3]
q = [4, 5, 6]

errorMatrix = np.zeros((len(errorType), maxit), dtype=np.float)

for i in range(maxit):
    Ndof[i] = mesh.number_of_nodes()
    for j, p in enumerate(ps):
        integrator = mesh.integrator(q[j])
        fem = PoissonFEMModel(pde, mesh, p, integrator)
        fem.solve()
        Ndof[i] = fem.femspace.number_of_global_dofs()
        errorMatrix[j, i] = fem.get_L2_error()
        errorMatrix[j + 3, i] = fem.get_H1_error()
    if i < maxit - 1:
        mesh.uniform_refine()

print(errorMatrix)
showmultirate(plt, 0, Ndof, errorMatrix, errorType)
plt.show()
예제 #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, p + 2)  # 创建 Poisson 有限元模型
    ls = fem.solve()  # 求解
    Ndof[i] = fem.space.number_of_global_dofs()  # 获得空间自由度个数
    errorMatrix[0, i] = fem.get_L2_error()  # 计算 L2 误差
    errorMatrix[1, i] = fem.get_H1_error()  # 计算 H1 误差
    if i < maxit - 1:
        mesh.uniform_refine()  # 一致加密网格

# 显示误差
show_error_table(Ndof, errorType, errorMatrix)
# 可视化误差收敛阶
showmultirate(plt, 0, Ndof, errorMatrix, errorType)
plt.show()