| | | |

Método dos Elementos Finitos

Ajude a manter o site livre, gratuito e sem propagandas. Colabore!

1.3 Condições de contorno

Vamos estudar sobre soluções de elementos finitos para o problema modelo

u′′=f,xI=[0,L], (1.121)

com diferentes condições de contorno.

1.3.1 Condições de Dirichlet

Consideramos o seguinte problema com condições de contorno de Dirichlet777Johann Peter Gustav Lejeune Dirichlet, 1805 - 1859, matemático alemão. Fonte: Wikipédia: Johann Peter Gustav Lejeune Dirichlet.: encontrar u tal que

u′′=f,xI=(0,L), (1.122)
u(0)=u0,u(L)=uL, (1.123)

com u0,uL e f dados.

Tomando uma função teste vV0:=H01(I):={vH1(I);v(0)=v(L)=0} e multiplicando-a em (1.122), obtemos

Iu′′v𝑑x=Ifv𝑑x. (1.124)

Aplicando a integração por partes, temos

Iuv𝑑x=Ifv𝑑x. (1.125)

Desta forma, definimos o seguinte problema fraco associado: encontrar uV:={vH1(I);v(0)=u0,v(L)=vL} tal que

a(u,v)=L(v),vV0, (1.126)

onde a(u,v) é a forma bilinear

a(u,v)=Iuv𝑑x (1.127)

e L(v) é a forma linear

L(v)=Ifv𝑑x. (1.128)
Exemplo 1.3.1.

Consideramos o problema

u′′=1,xI=[0,1], (1.129)
u(0)=1/2,u(1)=1. (1.130)

Sua solução analítica é u(x)=x2/2+x+1/2.

Para obtermos uma aproximação de elementos finitos, consideramos o seguinte problema fraco: encontrar uV:={vH1(I);v(0)=1/2,v(1)=1} tal que

a(u,v)=L(v), (1.131)

para todo vV0={vH1(I);v(0)=v(1)=0}, onde

a(u,v)=Iuv𝑑x, (1.132)
L(v)=Ifv𝑑x. (1.133)

Então, o problema de elementos finitos no espaço das funções afins por partes lê-se: encontrar uhVh={vP1(I);v(0)=1/2,v(1)=1} tal que

a(uh,vh)=L(vh), (1.134)

para todo vhVh,0={vH1(I);v(0)=v(1)=0}.

Este problema pode ser implementado com um código semelhante ao Código 4, mas com os devidos ajustes para as condições de contorno de Dirichlet não homogêneas. Estes ajustes estão presentes no código a seguir. Faça os ajustes e verifique!

Código 6: ex_mef1d_dirichlet.py
1# condição de contorno
2import numpy as np
3uD = fem.Function(V)
4# uD(0) = 0.5, uD(1) = 1
5def dirichlet_bc(x):
6 y = np.full(x.shape[1], 1.)
7 y[np.isclose(x[0], 0.)] = 0.5
8 return y
9uD.interpolate(dirichlet_bc)

1.3.2 Condições de Neumann

Consideramos o seguinte problema com condições de contorno de Neumann888Carl Gottfried Neumann, 1832 - 1925, matemático alemão. Fonte: Wikipédia: Carl Neumann. homogênea em x=L: encontrar u tal que

u′′=f,xI=[0,L], (1.135)
u(0)=u0,u(L)=0, (1.136)

com u0 e f dados. Trata-se de um problema com condição de contorno de Dirichlet999Johann Peter Gustav Lejeune Dirichlet, 1805 - 1859, matemático alemão. Fonte: Wikipédia: Johann Peter Gustav Lejeune Dirichlet. à esquerda e condição de contorno de Neumann101010Carl Gottfried Neumann, 1832 - 1925, matemático alemão. Fonte: Wikipédia: Carl Neumann. homogênea à direita.

Tomando uma função teste vV:={vH1(I);v(0)=0} e multiplicando-a em (1.135), obtemos

Iu′′v𝑑x=Ifv𝑑x. (1.137)

Aplicando a integração por partes, temos

Iuv𝑑xu(L)v(L)u(L)=0+u(0)v(0)v(0)=0 (1.138)
=Ifvdx. (1.139)

Desta forma, definimos o seguinte problema fraco associado: encontrar uV~:={vH1(I);v(0)=u0} tal que

a(u,v)=L(v),vV, (1.140)

onde a(u,v) é a forma bilinear

a(u,v)=Iuv𝑑x (1.141)

e L(v) é a forma linear

L(v)=Ifv𝑑x. (1.142)
Exemplo 1.3.2.

Consideramos o problema

u′′=1,xI=[0,1], (1.143)
u(0)=0,u(1)=0. (1.144)

Sua solução analítica é u(x)=x2/2+x.

Podemos construir uma aproximação por elementos finitos do seguinte problema fraco associado: encontrar uV={vH1(I);v(0)=0} tal que

a(u,v)=L(v), (1.145)

para todo vV, com as formas bilinear a(,) e linear L() dadas em (1.141) e (1.142).

Então, considerando elementos afins por partes, temos o seguinte problema de elementos finitos: encontrar uhVh={vhP1(I);vh(0)=0} tal que

a(uh,vh)=L(vh),vhVh. (1.146)

A implementação deste problema de elementos finitos é semelhante a do Código 4, mas com os devidos ajustes para as condições de contorno. Estes ajustes estão presentes no código a seguir. Faça os ajustes e verifique!

Código 7: ex_mef1d_neumann.py
1import numpy as np
2uD = fem.Function(V)
3uD.interpolate(lambda x: np.zeros(x.shape[1]))
4# uD(0) = 0 (Dirichlet); x=1: Neumann homogênea (natural)
5boundary_dofs = fem.locate_dofs_geometrical(V, lambda x: np.isclose(x[0], 0.))
6bc = fem.dirichletbc(uD, boundary_dofs)

Agora, consideramos o seguinte problema com condições de Neumann não-homogênea em x=L: encontrar u tal que

u′′=f,xI=(0,L), (1.147)
u(0)=u0,u(L)=α, (1.148)

com u0, α e f dados.

Tomando uma função teste vV:={vH1(I);v(0)=0} e multiplicando-a em (1.147), obtemos

Iu′′v𝑑x=Ifv𝑑x. (1.149)

Aplicando a integração por partes, temos

Iuv𝑑xαv(L)=Ifc𝑑x. (1.150)

Desta forma, definimos o seguinte problema fraco associado: encontrar uV~:={vH1(I);v(0)=u0} tal que

a(u,v)=L(v),vV, (1.151)

onde a(u,v) é a forma bilinear

a(u,v)=Iuv𝑑x (1.152)

e L(v) é a forma linear

L(v)=Ifv𝑑x+αv(L). (1.153)
Exemplo 1.3.3.

Consideramos o problema

u′′=1,xI=[0,1], (1.154)
u(0)=0,u(1)=1. (1.155)

Sua solução analítica é u(x)=x2/2+2x.

Agora, consideramos o seguinte problema fraco associado: encontrar uV={vH1(I);v(0)=0} tal que

a(u,v)=L(v),vV, (1.156)

com

a(u,v)=Iuv𝑑x (1.157)

e

L(v)=Ifv𝑑x+1v(1). (1.158)

O problema de elementos finitos no espaço das funções lineares por partes lê-se: encontrar uhVh={vhP1(I);vh(0)=0} tal que

a(uh,vh)=L(vh),vhVh. (1.159)

A implementação deste problema pode ser feita com um código semelhante ao Código 4, mas com os devidos ajustes para as condições de contorno e para a forma linear L(), que agora inclui um termo de contorno. Estes ajustes estão presentes no código a seguir. Faça os ajustes e verifique!

Código 8: ex_mef1d_neumann_nh.py
1# condição de contorno
2import numpy as np
3uD = fem.Function(V)
4uD.interpolate(lambda x: np.zeros(x.shape[1]))
5# uD(0) = 0 (Dirichlet); x=1: Neumann homogênea (natural)
6boundary_dofs = fem.locate_dofs_geometrical(V, lambda x: np.isclose(x[0], 0.))
7bc = fem.dirichletbc(uD, boundary_dofs)
8
9# problema mef
10import ufl
11from dolfinx import default_scalar_type
12from dolfinx.fem.petsc import LinearProblem
13u = ufl.TrialFunction(V)
14v = ufl.TestFunction(V)
15
16f = fem.Constant(domain, default_scalar_type(1.))
17g = fem.Constant(domain, default_scalar_type(1.))
18
19a = ufl.dot(ufl.grad(u), ufl.grad(v)) * ufl.dx
20L = f * v * ufl.dx
21L += g * v * ufl.ds

1.3.3 Condições de Robin

Consideramos o seguinte problema com condições de contorno de Robin111111Victor Gustave Robin, 1855 - 1897, matemático francês. Fonte: Wikipedia: Victor Gustave Robin.: encontrar u tal que

u′′=f,xI=[0,L], (1.160)
u(0)=r0(u(0)s0),u(L)=rL(u(L)sL), (1.161)

com r0, rL, s0, sL e f dados.

Tomando uma função teste vV=H1(I) e multiplicando-a em (1.160), obtemos

Iu′′v𝑑x=Ifv𝑑x. (1.162)

Aplicando a integração por partes, temos

Iuv𝑑xu(L)v(L)u(L)=rL(u(L)sL)+u(0)v(0)u(0)=r0(u(0)s0) (1.163)
=Ifcdx. (1.164)

ou, mais adequadamente,

Iuv𝑑x+rLu(L)v(L)+r0u(0)v(0) (1.165)
=Ifvdx+rLsLv(L)+r0s0v(0). (1.166)

Desta forma, definimos o seguinte problema fraco associado: encontrar uH1(I) tal que

a(u,v)=L(v),vV, (1.167)

onde a(u,v) é a forma bilinear

a(u,v)=Iuv𝑑x+rLu(L)v(L)+r0u(0)v(0) (1.168)

e L(v) é a forma linear

L(v)=Ifv𝑑x+rLsLv(L)+r0s0v(0). (1.169)
Exemplo 1.3.4.

Consideramos o problema

u′′=1,xI=[0,1], (1.170)
u(0)=u(0),u(1)=u(1)1. (1.171)

Sua solução analítica é u(x)=x2/2+5x/6+5/6.

Aqui, tomamos o seguinte problema fraco: encontrar uV=H1(I) tal que

a(u,v)=L(v),vV, (1.172)

onde

a(u,v)=Iuv𝑑x+u(1)v(1)+u(0)v(0) (1.173)

e

L(v)=Ifv𝑑x+1v(1). (1.174)

Então, uma aproximação por elementos finitos lineares por partes pode ser obtida resolvendo o seguinte problema: encontrar uhVh=P1(I) tal que

a(uh,vh)=L(vh),vhVh. (1.175)

A implementação deste problema de elementos finitos é semelhante a do Código 4, mas com os devidos ajustes para as condições de contorno e para as formas bilinear e linear. Para tanto, precisamos marcar as bordas do domínio para podermos integrar os termos de contorno. Estes ajustes estão presentes no código a seguir. Faça os ajustes e verifique!

Código 9: ex_mef1d_robin.py
1# boundary colors
2import numpy as np
3from dolfinx.mesh import locate_entities
4from dolfinx.mesh import meshtags
5boundaries = [(0, lambda x: np.isclose(x[0], 0.)),
6 (1, lambda x: np.isclose(x[0], 1.))]
7facet_indices, facet_markers = [], []
8fdim = domain.topology.dim - 1
9for (marker, locator) in boundaries:
10 facets = locate_entities(domain, fdim, locator)
11 facet_indices.append(facets)
12 facet_markers.append(np.full_like(facets, marker))
13facet_indices = np.hstack(facet_indices).astype(np.int32)
14facet_markers = np.hstack(facet_markers).astype(np.int32)
15sorted_facets = np.argsort(facet_indices)
16facet_tag = meshtags(domain, fdim, facet_indices[sorted_facets], facet_markers[sorted_facets])
17
18# problema mef
19import ufl
20from dolfinx import default_scalar_type
21from dolfinx.fem.petsc import LinearProblem
22u = ufl.TrialFunction(V)
23v = ufl.TestFunction(V)
24
25f = fem.Constant(domain, default_scalar_type(1.))
26g = fem.Constant(domain, default_scalar_type(1.))
27
28ds = ufl.Measure('ds', domain=domain, subdomain_data=facet_tag)
29
30a = ufl.dot(ufl.grad(u), ufl.grad(v)) * ufl.dx
31a += u * v * ds(1) + u * v * ds(0)
32L = f * v * ufl.dx
33L += g * v * ds(1)

1.3.4 Exercícios

E. 1.3.1.

Obtenha uma aproximação por elementos finitos P1 da solução de

u′′+u=2cosx,em (0,π), (1.176)
u(0)=1,u(π)=1. (1.177)

Faça o esboço dos gráficos da solução analítica u=cosx e da sua aproximação de elementos finitos uh. Então, faça uma análise da convergência de malha e verifique as taxas de convergência dos erros uuhL2 e (uuh)L2.

E. 1.3.2.

Obtenha uma aproximação por elementos finitos P1 da solução de

u′′=π2cos(πx),em (0,1), (1.178)
u(0)=0,u(1)=0. (1.179)

Faça o esboço dos gráficos da solução analítica u=cos(πx) e da sua aproximação de elementos finitos uh. Então, faça uma análise da convergência de malha e verifique as taxas de convergência dos erros uuhL2 e (uuh)L2.

E. 1.3.3.

Obtenha uma aproximação por elementos finitos P1 da solução de

u′′+u=0,em (0,1), (1.180)
u(0)=1,u(1)=1. (1.181)

Faça o esboço dos gráficos da solução analítica u=cosh(x)+asenh(x), a=(1senh(1))/cosh(1), e da sua aproximação de elementos finitos uh. Então, faça uma análise da convergência de malha e verifique as taxas de convergência dos erros uuhL2 e (uuh)L2.

E. 1.3.4.

Obtenha uma aproximação por elementos finitos P1 da solução de

u′′+u=0,em (1,1), (1.182)
u(1)+u(1)=0,u(1)=0, (1.183)

Faça o esboço dos gráficos da solução analítica u=C1+C2ex, C1=C2e1, C2=1/(2senh(1)e1), e da sua aproximação de elementos finitos uh. Então, faça uma análise da convergência de malha e verifique as taxas de convergência dos erros uuhL2 e (uuh)L2.

E. 1.3.5.

Obtenha uma aproximação por elementos finitos P1 da solução de

u′′+u+2u=cos(x),em (0,π/2), (1.184)
u(0)+2u(0)=0.5,2u(π/2)u(π/2)=0.7, (1.185)

Faça o esboço dos gráficos da solução analítica u=0.1[sen(x)+3cos(x)] e da sua aproximação de elementos finitos uh. Então, faça uma análise da convergência de malha e verifique as taxas de convergência dos erros uuhL2 e (uuh)L2.


Envie seu comentário

Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!

Opcional. Preencha seu nome para que eu possa lhe contatar.
Opcional. Preencha seu e-mail para que eu possa lhe contatar.
As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a política de uso de dados para mais informações.

Licença Creative Commons
Este texto é disponibilizado nos termos da Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional. Ícones e elementos gráficos podem estar sujeitos a condições adicionais.

Pedro H A Konzen
| | | |