Após a montagem do sistema global, precisamos impor as condições de contorno de Dirichlet antes de resolver o sistema linear.
Problema¶
O sistema montado é:
Para condições de contorno não-homogêneas nos nós de fronteira, precisamos:
Fixar os valores de para nós
Modificar o sistema para acomodar esses valores conhecidos
Métodos de Imposição¶
Método 1: Eliminação Direta¶
Separe os graus de liberdade em:
Livres (): Nós internos onde é desconhecido
Fixos (): Nós de fronteira onde é conhecido
O sistema pode ser particionado:
Resolvemos apenas:
Método 2: Penalização¶
Modifique as linhas correspondentes aos nós de Dirichlet:
onde o 1 está na posição .
Alternativamente, use um valor grande :
Método 3: Substituição de Linhas e Colunas (Usado no fempack)¶
Para cada nó com condição de Dirichlet :
Modifique a linha :
para
Modifique a coluna nas outras linhas:
Para :
Para :
Isso garante que:
A linha fornece diretamente
As outras equações são ajustadas para levar em conta o valor conhecido
Algoritmo de Imposição¶
Para cada nó i com condição de Dirichlet u_i = g_i:
# Ajustar outras linhas
Para cada j != i:
b[j] -= A[j, i] * g_i
A[j, i] = 0
# Modificar linha i
A[i, :] = 0
A[i, i] = 1
b[i] = g_iIdentificação dos Nós de Fronteira¶
Para malhas estruturadas ou simples, os nós de fronteira podem ser identificados por:
1D: Nós nas extremidades do intervalo
2D: Nós com , , , ou
Para malhas gerais, pode-se usar uma tolerância:
Exemplo 1D¶
Sistema original com 4 nós:
Impondo e :
Modificar linha 0 e ajustar coluna 0:
Linha 1:
Modificar linha 3 e ajustar coluna 3:
Linha 2:
Sistema resultante:
Implementação no fempack¶
O módulo fempack.bcs fornece:
apply_dirichlet_bc(): Aplica condições de Dirichlet usando o método de substituiçãoget_boundary_nodes(): Identifica nós na fronteira
Exemplo:
from fempack.bcs import apply_dirichlet_bc
# Aplicar u = 0 em toda a fronteira
A_bc, b_bc = apply_dirichlet_bc(A, b, mesh, lambda x: 0.0)
# Resolver sistema modificado
u = spsolve(A_bc, b_bc)