| | | |

Matemática Numérica III

1 Sistemas Lineares

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

1.1 Matrizes bandas

A solução de um sistema linear em que a matriz dos coeficientes é uma matriz banda pode ser eficiente computada com um adequado formato de armazenamento. 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 não nulas d, 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,0x0+a0,1x1=b0 (1.1)
a1,0x0+a1,1x1+a1,2x2=b1 (1.2)
a2,0x0+a2,1x1+a2,2x2+a2,3x3=b2 (1.3)
a3,1x1+a3,2x2+a3,3x3+a3,4x4=b3 (1.4)
an-1,n-3xn-3+an-1,n-2xn-2+an-1,n-1xn-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=3, largura inferior l=1 e largura superior u=2. A matriz dos coeficientes é dada por

A=[𝒂0,0a0,1000a1,0𝒂1,1a1,200a2,0a2,1𝒂2,2a2,300a3,1a3,2𝒂3,30000an-1,n-3an-1,n-2𝒂𝒏-𝟏,𝒏-𝟏]. (1.6)

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

Ab=[*a0,1a1,2an-3,n-2an-2,n-1𝒂0,0𝒂1,1𝒂2,2𝒂𝒏-𝟐,𝒏-𝟐𝒂𝒏-𝟏,𝒏-𝟏a1,0a2,1a3,2an-1,n-2*a2,0a3,1a4,2**] (1.7)
Exemplo 1.1.2.(Equaçao 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.8)
u(0)=0, (1.9)
u(1)=0. (1.10)

para x(0,1). Assumindo a fonte f(x)=π2sen(π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=ih, 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.11)
-1h2ui-1+2h2ui-1h2ui+1=f(xi), (1.12)
un-1=0, (1.13)

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

A=[10000-12-1000-12000002-100001]. (1.14)

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=[*100012221-1-1-1-1*] (1.15)

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

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

Consideramos 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,π)2, (1.16)
u(0,y)=0,y[0,π], (1.17)
u(π,y)=0,y[0,π], (1.18)
u(x,0)=0,x[0,π], (1.19)
u(x,π)=0,x[0,π], (1.20)

onde, Δ:=(2x2,2y2) é 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)=sen(x)sen(y) (1.21)

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.22)
yj=(j-1)h (1.23)

com tamanho de malha h=π/(n-1), i=1,2,,n e j=1,2,,n. Empregando a fórmula de diferenças central, encontramos o seguinte problema discreto associado

ui,1=u1,j=0 (1.24)
-1h2ui-1,j-1h2ui,j-1+4h2ui,j
-1h2ui+1,j-1h2ui,j+1=f(xi,yj) (1.25)
ui,n=un,j=0 (1.26)

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

Aw=b (1.27)

usando a enumeração das incógnitas

(i,j)k=i-1+(j-2)(n-2), (1.28)

i.e.

ui,j=wk=i-1+(j-2)(n-2) (1.29)

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

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

Afim de obtermos uma matriz diagonal dominante, vamos ordenar as equações do sistema discreto como segue

  • j=2, i=2:

    4wk-wk+1-wk+n-2=h2fi,j (1.30)
  • j=2, i=3,,n-2:

    -wk-1+4wk-wk+1-wk+n-2=h2fi,j (1.31)
  • j=2, i=n-1:

    -wk-1+4wk-wk+n-2=h2fi,j (1.32)
  • j=3,,n-2, i=2:

    -wk-(n-2)+4wk-wk+1-wk+n-2=h2fi,j (1.33)
  • j=3,,n-2, i=3,,n-2:

    -wk-1-wk-(n-2)+4wk-wk+1-wk+n-2=h2fi,j (1.34)
  • j=3,,n-2, i=n-1:

    -wk-1-wk-(n-2)+4wk-wk+n-2=h2fi,j (1.35)
  • j=n-1, i=2:

    -wk-(n-2)+4wk-wk+1=h2fi,j (1.36)
  • j=n-1, i=3,,n-2:

    -wk-1-wk-(n-2)+4wk-wk+1=h2fi,j (1.37)
  • j=n-1, i=n-1:

    -wk-1-wk-(n-2)+4wk=h2fi,j (1.38)

Com isso, temos um sistema com matriz com 5 bandas, consulte a Figura 1.2.

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
17u = l = n-2
18ab = np.zeros((u+l+1, (n-2)**2))
19b = np.empty((n-2)**2)
20
21# matrix banded index
22def ind(k,l):
23    return u + 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((l,u), 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.39)
u(0)=1, (1.40)
u(1)=-1. (1.41)

para x(0,1). Assumindo a fonte f(x)=π2cos(π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.42)
u(0)=1, (1.43)
u(1)=0. (1.44)

para x(0,1). Assumindo a fonte f(x)=π2cos(π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.45)
u(0)=0, (1.46)
u(1)=0. (1.47)

para x(0,1). Assumindo a fonte f(x)=π2sen(π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)+au(x)=f(x), (1.48)
u(0)=0, (1.49)
u(1)=0. (1.50)

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.51)
u(0,y)=0,y[0,1], (1.52)
u(1,y)=0,y[0,1], (1.53)
u(x,0)=sen(πx),x[0,1], (1.54)
u(x,1)=-sen(πx),x[0,1]. (1.55)

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-2x+2x2),(x,y)(0,1)2, (1.56)
u(0,y)=0,y[0,1], (1.57)
u(1,y)=0,y[0,1], (1.58)
u(x,0)=0,x[0,1], (1.59)
u(x,1)=8x(1-x),x[0,1]. (1.60)

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-2x+2x2),(x,y)(0,1)2, (1.61)
u(0,y)=0,y[0,1], (1.62)
u(1,y)=0,y[0,1], (1.63)
u(x,0)=0,x[0,1], (1.64)
ux(x,1)=8(1-x),x[0,1]. (1.65)

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