| | | | |

2.2 Interpolação

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

Em revisão

Dada uma função contínua f em um triângulo K com nodos Ni, i=0,1,2, sua interpolação linear πfP1(K) é definida por

πf=i=02f(Ni)φi. (2.10)

Logo, temos πf(Ni)=f(Ni) para todo i=0,1,2.

Exemplo 2.2.1.

Consideramos a função

u(x0,x1)=sen(πx0)cos(πx1) (2.11)

defina no domínio D=[0,1]2. O seguinte código computa a interpolação de f no espaço de elementos finitos Vh sobre uma malha uniforme de 16×16 triângulos. Com ele, graficamos a função interpolada uhVh e a função u. Consulte a Fig. 2.3.

Refer to caption
Figura 2.3: Gráfico de comparação função interpolada uhVh (gráfico de contornos em cores) e da função original u (isolinhas) referentes ao Exemplo 2.2.1.
Código 9: interp2d.py
1from mpi4py import MPI
2from dolfinx import mesh
3
4# malha
5domain = mesh.create_unit_square(MPI.COMM_WORLD, 16, 16)
6
7from dolfinx import fem
8
9# espaço de elementos finitos
10V = fem.functionspace(domain, ("P",1))
11
12# função do espaço V
13uh = fem.Function(V)
14
15# interpolate
16import numpy as np
17def u(x, mod=np):
18    return mod.sin(mod.pi*x[0])*mod.sin(mod.pi*x[1])
19
20uh.interpolate(lambda x: u(x))
21
22# eval fun
23from dolfinx import geometry
24
25def fun_eval(u, points,
26             domain=domain):
27  u_values = []
28  bb_tree = geometry.bb_tree(domain, domain.topology.dim)
29  cells = []
30  points_on_proc = []
31  # Find cells whose bounding-box collide with the the points
32  cell_candidates = geometry.compute_collisions_points(bb_tree,
33                                                       points.T)
34  # Choose one of the cells that contains the point
35  colliding_cells = geometry.compute_colliding_cells(domain,
36                                                     cell_candidates,
37                                                     points.T)
38  for i, point in enumerate(points.T):
39    if len(colliding_cells.links(i)) > 0:
40      points_on_proc.append(point)
41      cells.append(colliding_cells.links(i)[0])
42
43  points_on_proc = np.array(points_on_proc, dtype=np.float64)
44  u_values = u.eval(points_on_proc, cells)
45  return u_values
46
47# gráfico
48import numpy as np
49nx = ny = 101
50xx0 = np.linspace(0., 1., nx)
51xx1 = np.linspace(0., 1., ny)
52X0, X1 = np.meshgrid(xx0, xx1, indexing='ij')
53points = np.zeros((3, nx*ny))
54points[0] = X0.reshape(-1)
55points[1] = X1.reshape(-1)
56
57yh = fun_eval(uh, points)
58Yh = yh.reshape((nx,ny))
59
60import matplotlib.pyplot as plt
61
62fig = plt.figure()
63ax = fig.add_subplot()
64levels=10
65cb = ax.contourf(X0, X1, Yh, levels = levels)
66fig.colorbar(cb)
67Y = u([X0, X1])
68cl = ax.contour(X0, X1, Y, levels = levels, colors='w')
69ax.clabel(cl)
70plt.show()

Afim de determinarmos estimativas para o erro de interpolação, precisamos da chamada derivada total de primeira ordem

Df=(|fx0|2+|fx1|2)1/2, (2.12)

e da derivada total de segunda ordem

D2f=(|2fx02|2+|2fx0x1|2+|2fx12|2)1/2. (2.13)
Proposição 2.2.1.

(Erro da interpolação no espaço linear.) A interpolação πf satisfaz as seguintes estimativas

fπfL2(K) ChK2D2fL2(K), (2.14)
D(fπf)L2(K) ChKD2fL2(K). (2.15)
Demonstração.

Veja [1, Capítulo 4]. ∎

Observação 2.2.1.

A constante C dependo do inverso de sen(θK) onde θK é o menor angulo de K. Desta forma, para um triângulo com θK muito pequeno, as estimativas (2.14) e (2.15) perdem sentido. Este fato indica a necessidade de se trabalhar com malhas regulares.

A interpolação no espaço Vh de uma dada função f no domínio Ω é denotada também por πfVh e definida por

πf=i=0np1f(Ni)φi. (2.16)
Proposição 2.2.2.

(Erro da interpolação no espaço contínuo linear por partes.) O interpolador πfVh satisfaz as seguintes estimativas

fπfL2(Ω)2CK𝒦hK4D2fL2(K)2, (2.17)
D(fπf)L2(Ω)2CK𝒦hK2D2fL2(K)2,. (2.18)
Demonstração.

Demonstração análoga a Proposição 1.1.2. ∎

Observação 2.2.2.

(Taxa de convergência.) A taxa de convergência (ou ordem de truncamento) do erro de interpolação é definida como a potência do h na estimativa (2.17). Esta taxa pode ser computacionalmente estimada. De fato, o erro de interpolação para uma dada malha i tem a forma εiChir. Conhecendo εi1Chi1r para uma outra malha i1, podemos resolver para r, obtendo a estimativa

rlnεi/εi1lnhi/hi1. (2.19)
Exemplo 2.2.2.

Consideramos a interpolação feita no Exemplo 2.2.1. Aqui, computamos o erro de interpolação na norma L2, i.e.

ε=uhuL2(Ω) (2.20)

para diferentes refinamentos de malha.

Refer to caption
Figura 2.4: Tamanho da malha h versus erro de interpolação na norma L2 referente ao Exemplo 2.2.2.

Na Tabela 2.1, temos o número de células e seu tamanho h, o erro de interpolação ε e a estimativa da taxa de convergência dada por (2.19).

Tabela 2.1: Erro de interpolação referente ao Exemplo 2.2.2.
#células h ϵ r
4×4 3.5×101 6.0×102 -x-
8×8 1.8×101 1.6×102 1.91
16×16 8.8×102 3.9×103 2.04
32×32 4.4×102 9.8×104 1.99
64×64 2.2×102 2.4e×104 2.03

2.2.1 Exercícios

Em construção


Envie seu comentário

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. Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!