| | | |

Matemática numérica III

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

1.1 Matrizes banda

A solução de um sistema linear cuja matriz dos coeficientes é uma matriz banda pode ser computada eficientemente com um formato de armazenamento adequado. Uma matriz A é uma matriz banda quando seus elementos não nulos estão dispostos em apenas algumas de suas diagonais. A largura da banda é o número de diagonais que contêm elementos não nulos, incluindo a diagonal principal. A largura inferior l (superior u) é o número de diagonais não nulas abaixo (acima) da diagonal principal (d=l+u+1).

Exemplo 1.1.1.(Matriz tridiagonal)

Uma matriz tridiagonal é uma matriz banda com largura da banda d=3, largura inferior l=1 e largura superior u=1.

Para fixarmos as ideias, considere o seguinte sistema linear

a0,0⁢x0+a0,1⁢x1=b0 (1.1)
a1,0⁢x0+a1,1⁢x1+a1,2⁢x2=b1 (1.2)
a2,0⁢x0+a2,1⁢x1+a2,2⁢x2+a2,3⁢x3=b2 (1.3)
a3,1⁢x1+a3,2⁢x2+a3,3⁢x3+a3,4⁢x4=b3 (1.4)
⋮
an−1,n−3⁢xn−3+an−1,n−2⁢xn−2+an−1,n−1⁢xn−1=bn−1 (1.5)

ou seja, um sistema linear n×n cuja a matriz dos coeficientes é uma matriz banda com largura da banda d=4, largura inferior l=2 e largura superior u=1. A matriz dos coeficientes é dada por

A=[𝒂0,0a0,100⋯0a1,0𝒂1,1a1,20⋯0a2,0a2,1𝒂2,2a2,3⋯00a3,1a3,2𝒂3,3⋯0⋮⋮⋮⋮⋱⋮000an−1,n−3an−1,n−2𝒂𝒏−𝟏,𝒏−𝟏]. (1.6)

Notemos que a matriz A pode ser armazenada de forma compacta como

B=[∗a0,1a1,2⋯an−3,n−2an−2,n−1𝒂0,0𝒂1,1𝒂2,2⋯𝒂𝒏−𝟐,𝒏−𝟐𝒂𝒏−𝟏,𝒏−𝟏a1,0a2,1a3,2⋯an−1,n−2∗a2,0a3,1a4,2⋯∗∗] (1.7)

Observemos que existe uma simples relação entre os índices da matriz A e os índices da matriz B. De fato, para i=0,1,…,n−1 e j=0,1,…,n−1, temos

Bu+i−j,j=Ai,j. (1.8)
Exemplo 1.1.2.(Equação de Poisson 1D)

Consideremos a equação de Poisson111Siméon Denis Poisson, 1781 - 1840, matemático francês. Fonte: Wikipédia: Siméon Denis Poisson. unidimensional e com condições de contorno de Dirichlet homogêneas

−u′′⁢(x)=f⁢(x), (1.9)
u⁢(0)=0, (1.10)
u⁢(1)=0. (1.11)

para x∈(0,1). Assumindo a fonte f⁢(x)=π2⁢sen⁡(π⁢x), a solução analítica é dada por u⁢(x)=sen⁡(π⁢x) (verifique!).

Vamos empregar o método de diferenças finitas para computar uma aproximação para a sua solução. Começamos assumindo uma malha uniforme de n nodos xi=i⁢h, com tamanho de malha h=1/(n−1), i=0,1,…,n−1. Empregando a fórmula de diferenças central, encontramos o seguinte problema discreto associado

u0=0, (1.12)
−1h2⁢ui−1+2h2⁢ui−1h2⁢ui+1=f⁢(xi), (1.13)
un−1=0, (1.14)

para i=1,2,…,n−2. Este é um sistema linear A⁢𝒖=h2⁢𝒃 em que a matriz dos coeficientes é a matriz tridiagonal n×n

A=[100⋯00−12−1⋯000−12⋯00⋮⋮⋮⋱⋮⋮000⋯2−1000⋯01]. (1.15)

O vetor das incógnitas é 𝒖=(u0,u1,…,un−1) e o vetor dos termos constantes é h2⁢𝒃=h2⁢(f⁢(x0),f⁢(x1),…,f⁢(xn−1)). Note que a matriz A pode ser armazenada de forma compacta como

Ab=[∗0−1⋯−1−1122⋯21−1−1−1⋯−1∗] (1.16)

O Código 1 computa a solução de um sistema linear tridiagonal usando o método de eliminação de Gauss (verifique!).

Código 1: solve_tribanded.py
1def solve_tribanded(ab, b):
2 a = ab.copy()
3 x = b.copy()
4 n = b.size
5 # eliminação
6 for i in range(1,n):
7 w = a[2,i-1]/a[1,i-1]
8 a[1,i] -= w * a[0,i]
9 x[i] -= w * x[i-1]
10 # resolve
11 x[n-1] = x[n-1]/a[1,n-1]
12 for i in range(n-2,-1,-1):
13 x[i] = (x[i] - a[0,i+1]*x[i+1])/a[1,i]
14 return x
Exemplo 1.1.3.(Equação de Poisson 2D)

Consideremos o seguinte problema de Poisson222Siméon Denis Poisson, 1781 - 1840, matemático francês. Fonte: Wikipédia: Siméon Denis Poisson. 2D

−Δ⁢u=f⁢(x,y),(x,y)∈(0,1)2, (1.17)
u⁢(0,y)=0,y∈[0,1], (1.18)
u⁢(1,y)=0,y∈[0,1], (1.19)
u⁢(x⁢,0)=0,x∈[0,1], (1.20)
u⁢(x⁢,1)=0,x∈[0,1], (1.21)

onde Δ:=∂2∂x2+∂2∂y2 é o operador laplaciano333Pierre-Simon Laplace, 1749 - 1827, matemático francês. Fonte: Wikipédia: Pierre-Simon Laplace.. Para fixarmos as ideias, vamos assumir

f⁢(x,y)=2⁢π2⁢sen⁡(π⁢x)⁢sen⁡(π⁢y). (1.22)

Vamos empregar o método de diferenças finitas para computar uma aproximação para a sua solução. Começamos assumindo uma malha uniforme de n2 nodos

xi=(i−1)⁢h (1.23)
yj=(j−1)⁢h (1.24)

com tamanho de malha h=1/(n−1), i=1,2,…,n e j=1,2,…,n. Empregando fórmulas de diferenças centrais, encontramos o seguinte problema discreto associado

ui⁢,1=u1,j=0 (1.25)
−1h2⁢ui−1,j−1h2⁢ui,j−1+4h2⁢ui,j
−1h2⁢ui+1,j−1h2⁢ui,j+1=f⁢(xi,yj) (1.26)
ui,n=un,j=0 (1.27)

Este é um sistema linear n2×n2. Tomando em conta as condições de contorno, ele pode ser reduzido a um sistema (n−2)2×(n−2)2

A⁢w=b (1.28)

usando a enumeração, iniciada em zero, das incógnitas

(i,j)→k=i−2+(j−2)⁢(n−2), (1.29)

isto é,

ui,j=wk=i−2+(j−2)⁢(n−2) (1.30)

para i,j=2,…,n−1. Consulte a Figura 1.1 para uma representação da enumeração em relação à malha.

Refer to caption
Figura 1.1: Representação da enumeração das incógnitas referente ao problema de Poisson 2D. Exemplo 1.1.3.

A fim de obter uma matriz diagonal dominante, vamos ordenar as equações do sistema discreto como segue

  • •

    j=2, i=2:

    4⁢wk−wk+1−wk+n−2=h2⁢fi,j (1.31)
  • •

    j=2, i=3,…,n−2:

    −wk−1+4⁢wk−wk+1−wk+n−2=h2⁢fi,j (1.32)
  • •

    j=2, i=n−1:

    −wk−1+4⁢wk−wk+n−2=h2⁢fi,j (1.33)
  • •

    j=3,…,n−2, i=2:

    −wk−(n−2)+4⁢wk−wk+1−wk+n−2=h2⁢fi,j (1.34)
  • •

    j=3,…,n−2, i=3,…,n−2:

    −wk−1−wk−(n−2)+4⁢wk−wk+1−wk+n−2=h2⁢fi,j (1.35)
  • •

    j=3,…,n−2, i=n−1:

    −wk−1−wk−(n−2)+4⁢wk−wk+n−2=h2⁢fi,j (1.36)
  • •

    j=n−1, i=2:

    −wk−(n−2)+4⁢wk−wk+1=h2⁢fi,j (1.37)
  • •

    j=n−1, i=3,…,n−2:

    −wk−1−wk−(n−2)+4⁢wk−wk+1=h2⁢fi,j (1.38)
  • •

    j=n−1, i=n−1:

    −wk−1−wk−(n−2)+4⁢wk=h2⁢fi,j (1.39)

Com isso, obtemos um sistema cuja matriz tem cinco bandas; consulte a Figura 1.2.

Refer to caption
Figura 1.2: Matriz do sistema discreto construído no Exemplo 1.1.3.

O Código 2 implementa a montagem do sistema linear e sua solução usando a função solve_banded da biblioteca scipy.linalg. Verifique o código e compare a solução com a solução analítica u⁢(x,y)=sen⁡(π⁢x)⁢sen⁡(π⁢y).

Código 2: poisson2d.py
1import numpy as np
2from scipy.linalg import solve_banded
3
4
5# malha
6n = 11
7h = 1/(n-1)
8
9xx = np.linspace(0, 1, n)
10yy = np.linspace(0, 1, n)
11
12# fonte
13def f(x,y):
14 return 2 * np.pi**2 * np.sin(np.pi*x) * np.sin(np.pi*y)
15
16# sistema discreto
17upper = lower = n-2
18ab = np.zeros((upper+lower+1, (n-2)**2))
19b = np.empty((n-2)**2)
20
21# índice no formato banda
22def ind(k, l):
23 return upper + k - l, l
24
25for j in np.arange(2,n):
26 for i in np.arange(2,n):
27
28 # enumeração dos nodos computacionais
29 k = i-2 + (j-2)*(n-2)
30
31 # vetor b
32 b[k] = h**2 * f(xx[i-1], yy[j-1])
33
34 # matriz ab
35 ab[ind(k,k)] = 4.
36
37 if (j == 2):
38 if (i == 2):
39 ab[ind(k,k+1)] = -1.
40 ab[ind(k,k+n-2)] = -1.
41 elif (i <= n-2):
42 ab[ind(k,k-1)] = -1.
43 ab[ind(k,k+1)] = -1.
44 ab[ind(k,k+n-2)] = -1.
45 else: # i == n-1
46 ab[ind(k,k-1)] = -1.
47 ab[ind(k,k+n-2)] = -1.
48 elif (j <= n-2):
49 if (i == 2):
50 ab[ind(k,k-(n-2))] = -1.
51 ab[ind(k,k+1)] = -1.
52 ab[ind(k,k+n-2)] = -1.
53 elif (i <= n-2):
54 ab[ind(k,k-1)] = -1.
55 ab[ind(k,k-(n-2))] = -1.
56 ab[ind(k,k+1)] = -1.
57 ab[ind(k,k+n-2)] = -1.
58 else: # i == n-1
59 ab[ind(k,k-1)] = -1.
60 ab[ind(k,k-(n-2))] = -1.
61 ab[ind(k,k+n-2)] = -1.
62 else: # j == n-1
63 if (i == 2):
64 ab[ind(k,k-(n-2))] = -1.
65 ab[ind(k,k+1)] = -1.
66 elif (i <= n-2):
67 ab[ind(k,k-1)] = -1.
68 ab[ind(k,k-(n-2))] = -1.
69 ab[ind(k,k+1)] = -1.
70 else: # i == n-1
71 ab[ind(k,k-1)] = -1.
72 ab[ind(k,k-(n-2))] = -1.
73
74# resolve
75u = solve_banded((lower, upper), ab, b)

1.1.1 Exercícios

E. 1.1.1.

Considere o seguinte problema de Poisson444Siméon Denis Poisson, 1781 - 1840, matemático francês. Fonte: Wikipédia: Siméon Denis Poisson. unidimensional e com condições de contorno de Dirichlet não-homogêneas

−u′′⁢(x)=f⁢(x), (1.40)
u⁢(0)=1, (1.41)
u⁢(1)=−1. (1.42)

para x∈(0,1). Assumindo a fonte f⁢(x)=π2⁢cos⁡(π⁢x). Aplique o método de diferenças finitas para computar uma aproximação para a solução do problema. Use diferenças finitas centrais para a segunda derivada e uma malha uniforme.


Dica: u⁢(x)=cos⁡(π⁢x)

E. 1.1.2.

Considere o seguinte problema de Poisson555Siméon Denis Poisson, 1781 - 1840, matemático francês. Fonte: Wikipédia: Siméon Denis Poisson. unidimensional

−u′′⁢(x)=f⁢(x), (1.43)
u⁢(0)=1, (1.44)
u′⁢(1)=0. (1.45)

para x∈(0,1). Assumindo a fonte f⁢(x)=π2⁢cos⁡(π⁢x). Aplique o método de diferenças finitas para computar uma aproximação para a solução do problema. Use diferenças finitas centrais para a segunda derivada e uma malha uniforme. Na condição de contorno de Neumann, use uma fórmula de diferenças finitas para trás.


Dica: u⁢(x)=cos⁡(π⁢x)

E. 1.1.3.

Considere o seguinte problema de valor de contorno

−u′′⁢(x)+u′⁢(x)=f⁢(x), (1.46)
u⁢(0)=0, (1.47)
u⁢(1)=0. (1.48)

para x∈(0,1). Assumindo a fonte f⁢(x)=π2⁢sen⁡(π⁢x)+π⁢cos⁡(x). Aplique o método de diferenças finitas para computar uma aproximação para a solução do problema. Use diferenças finitas centrais para as derivadas e uma malha uniforme.


Dica: u⁢(x)=sin⁡(π⁢x)

E. 1.1.4.

Considere o seguinte problema de valor de contorno

−u′′⁢(x)+a⁢u′⁢(x)=f⁢(x), (1.49)
u⁢(0)=0, (1.50)
u⁢(1)=0. (1.51)

para x∈(0,1). Assumindo a fonte f⁢(x)=sen⁡(π⁢x), aplique o método de diferenças finitas para computar uma aproximação para a solução do problema. Use diferenças finitas centrais para as derivadas e uma malha uniforme. Faça simulações e estude os resultados para:

  • •

    a=1

  • •

    a=0.1

  • •

    a=−1

E. 1.1.5.

Considere o seguinte problema de Poisson666Siméon Denis Poisson, 1781 - 1840, matemático francês. Fonte: Wikipédia: Siméon Denis Poisson. 2D com condições de contorno de Dirichlet

−Δ⁢u=0,(x,y)∈(0,1)2, (1.52)
u⁢(0,y)=0,y∈[0,1], (1.53)
u⁢(1,y)=0,y∈[0,1], (1.54)
u⁢(x⁢,0)=sen⁡(π⁢x),x∈[0,1], (1.55)
u⁢(x⁢,1)=−sen⁡(π⁢x),x∈[0,1]. (1.56)

Aplique o método de diferenças finitas para computar uma aproximação para a solução do problema. Use diferenças finitas centrais para as derivadas e uma malha uniforme.


Dica: u⁢(x,y)=sen⁡(π⁢x)⁢cos⁡(π⁢y)

E. 1.1.6.

Considere o seguinte problema de Poisson777Siméon Denis Poisson, 1781 - 1840, matemático francês. Fonte: Wikipédia: Siméon Denis Poisson. 2D com condições de contorno de Dirichlet

−Δ⁢u=8⁢(y2−2⁢x+2⁢x2),(x,y)∈(0,1)2, (1.57)
u⁢(0,y)=0,y∈[0,1], (1.58)
u⁢(1,y)=0,y∈[0,1], (1.59)
u⁢(x⁢,0)=0,x∈[0,1], (1.60)
u⁢(x⁢,1)=8⁢x⁢(1−x),x∈[0,1]. (1.61)

Aplique o método de diferenças finitas para computar uma aproximação para a solução do problema. Use diferenças finitas centrais para as derivadas e uma malha uniforme.


Dica: u⁢(x,y)=8⁢(x−x2)⁢y2

E. 1.1.7.

Considere o seguinte problema de Poisson888Siméon Denis Poisson, 1781 - 1840, matemático francês. Fonte: Wikipédia: Siméon Denis Poisson. 2D com condições de contorno

−Δ⁢u=8⁢(y2−2⁢x+2⁢x2),(x,y)∈(0,1)2, (1.62)
u⁢(0,y)=0,y∈[0,1], (1.63)
u⁢(1,y)=0,y∈[0,1], (1.64)
u⁢(x⁢,0)=0,x∈[0,1], (1.65)
ux⁢(x⁢,1)=8⁢(1−x),x∈[0,1]. (1.66)

Aplique o método de diferenças finitas para computar uma aproximação para a solução do problema. Use diferenças finitas centrais para as derivadas e uma malha uniforme. Na condição de Neumann, use uma fórmula de diferenças finitas para trás.


Dica: u⁢(x,y)=8⁢(x−x2)⁢y2


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
| | | |