Para verificar a implementação do método de elementos finitos, calculamos erros entre a solução numérica e a solução exata .
Normas de Erro¶
Definimos as seguintes normas de erro:
Norma ¶
Para calcular numericamente:
onde:
é a solução exata avaliada no ponto de quadratura
é a solução numérica interpolada
Seminorma (Gradiente)¶
Numericamente:
onde:
Norma (Completa)¶
Norma do Máximo ()¶
Aproximadamente:
onde a maximização é feita sobre todos os nós.
Taxas de Convergência¶
Para uma família de malhas com tamanho característico , esperamos:
onde é o grau polinomial do espaço de elementos finitos:
P1/Q1: , então converge como e como
P2: , então converge como e como
Estimativa Experimental da Taxa¶
Para estimar a taxa de convergência experimentalmente, considere duas malhas com tamanhos :
onde e são os erros correspondentes.
Se plotarmos vs , a inclinação da reta é a taxa de convergência.
Method of Manufactured Solutions (MMS)¶
Para verificar a implementação:
Escolha uma solução exata suave
Calcule o termo fonte correspondente:
Resolva o problema de elementos finitos com e condições de contorno
Calcule os erros comparando com
Verifique as taxas de convergência refinando a malha
Exemplo 1D¶
Solução manufaturada:
Termo fonte:
Condições de contorno em :
Exemplo 2D¶
Solução manufaturada:
Termo fonte:
Condições de contorno em :
Teste de Convergência¶
Algoritmo típico:
for h in [h1, h2, h3, ...]: # Sequência de malhas cada vez mais finas
mesh = create_mesh(h)
A = assemble_stiffness(mesh, space)
b = assemble_load(mesh, space, f)
A_bc, b_bc = apply_dirichlet_bc(A, b, mesh, g)
u_h = solve(A_bc, b_bc)
error_L2 = compute_L2_error(u_h, u_exact, mesh, space)
error_H1 = compute_H1_error(u_h, u_exact, grad_u_exact, mesh, space)
print(f"h={h:.4f}, L2={error_L2:.6e}, H1={error_H1:.6e}")
# Plotar log(erro) vs log(h) e verificar inclinaçãoPara elementos P1/Q1, esperamos:
Inclinação para erro
Inclinação para erro
Implementação no fempack¶
O módulo fempack.verification fornece:
compute_l2_error(): Calculacompute_h1_error(): Calculacompute_errors(): Calcula múltiplas normas de uma vezconvergence_study(): Automatiza estudos de convergência
Exemplo:
from fempack.verification import compute_l2_error, compute_h1_error
error_L2 = compute_l2_error(u_h, mesh, space, u_exact)
error_H1 = compute_h1_error(u_h, mesh, space, u_exact, grad_u_exact)
print(f"||e||_L2 = {error_L2:.6e}")
print(f"|e|_H1 = {error_H1:.6e}")Os notebooks em notebooks/ demonstram estudos completos de convergência para diferentes tipos de elementos.