Consideramos o seguinte problema de valor de contorno
|
|
|
(1.198) |
|
|
|
(1.199) |
|
|
|
(1.200) |
|
|
|
(1.201) |
Considerando elementos lineares por partes, temos a seguinte formulação de elementos finitos: encontrar tal que
|
|
|
(1.202) |
onde , , , com as formas bilinear e linear são dadas em (1.195) e (1.196), respectivamente.
A Figura 1.8 apresenta o esboço dos gráficos das soluções analíticas e e de suas aproximações de elementos finitos e , estas construídas no espaço dos polinômios lineares por partes sobre uma malha uniforme de células.
Com o FEniCS, a computação do problema de elementos finitos pode ser feita com o seguinte código:
from __future__ import print_function, division
from fenics import *
import numpy as np
import matplotlib.pyplot as plt
#tolerance
tol=1e-14
# malha
mesh = IntervalMesh(10,-pi,pi)
# espaco
P1 = FiniteElement(’P’,interval,1)
element = MixedElement([P1,P1])
V = FunctionSpace(mesh, element)
#C.C.
def boundary(x,on_boundary):
return on_boundary
bc = [DirichletBC(V.sub(0),Constant(0.0),boundary),
DirichletBC(V.sub(1),Constant(-1.0),boundary)]
print(bc)
#MEF problem
u = TrialFunction(V)
v = TestFunction(V)
f0 = Expression(’sin(x[0]) + cos(x[0])’,
degree=10)
f1 = Expression(’cos(x[0]) - sin(x[0])’,
degree=10)
a = u[0].dx(0)*v[0].dx(0)*dx
a += u[1]*v[0]*dx
a += u[1].dx(0)*v[1].dx(0)*dx
a -= u[0]*v[1]*dx
L = f0*v[0]*dx
L += f1*v[1]*dx
#computa a sol
u = Function(V)
solve(a == L, u, bc)
#sol analitica
u0a = Expression(’sin(x[0])’,
degree=10)
u1a = Expression(’cos(x[0])’,
degree=10)
plot(u[0],mesh=mesh,marker=’.’,label=r"$u_{h0}$")
plot(u[1],mesh=mesh,marker=’.’,label=r"$u_{h1}$")
mesh = IntervalMesh(100,-pi,pi)
plot(u0a,mesh=mesh,label=r"$u_0$")
plot(u1a,mesh=mesh,label=r"$u_1$")
plt.legend(numpoints=1)
plt.grid(’on’)
plt.show()