Use o botão abaixo para reportar erros ou dar sugestões.
Cálculo Numérico - Versão Python
4.5 Método da matriz tridiagonal
O método da matriz tridiagonal ou algoritmo
de Thomas6
ou ainda TDMA (do inglês tridiagonal matrix algorithm) é o caso particular da
eliminação gaussiana aplicada a matrizes tridiagonais.
Uma matriz tridiagonal é uma matriz quadrada cujos únicos elementos
não nulos estão na diagonal principal e nas diagonais imediatamente
acima e abaixo da principal. Um sistema tridiagonal é um sistema de
equações lineares cuja matriz associada é tridiagonal, conforme a
seguir:
Observamos que não é necessário armazenar todos os
elementos da matriz em memória, sendo suficiente armazenar os vetores
,
e
. Por
conveniência, a partir daqui, definiremos os elementos inexistentes na matriz
e
como
zero:
(4.89)
O algoritmo para a solução do sistema tridiagonal (4.88) pelo algoritmo de
Thomas é dada pelas seguintes expressões:
Finalmente a solução final é obtida por substituição reversa:
Teorema 4.5.1.A aplicação da eliminação gaussiana sem pivotamentoao sistema (4.88) produz o algoritmo dado em (4.90) e (4.92).
Demonstração. O primeiro passo consiste em dividir todos os elementos da primeira
linha de (4.88) por :
onde
e
O segundo passo consiste em substituir a segunda linha por ela mesma subtraída da linha
1 multiplicada por
():
Em seguida, dividimos a segunda linha por
, a fim
de normalizar a diagonal principal:
onde
e .
O próximo passo consiste em substituir a terceira linha
por ela mesma subtraída da linha 2 multiplicada por
():
A fim de normalizar o elemento da diagonal da terceira linha, dividimos toda a
linha por :
Este procedimento é realizado até que se atinja a última linha e temos o
seguinte sistema:
Neste estágio, podemos encontrar os
através de substituição reversa, isto é: a última linha diz
(4.100)
A penúltima linha diz
(4.101)
Esse mesmo procedimento aplicado à linha
, nos
dá
(4.102)
Exemplo 4.5.1. Considere a resolução do seguinte sistema tridiagonal pelo
algoritmo de Thomas:
Primeiramente identificamos os vetores
,
,
e
:
Agora, calculamos os vetores
e :
Finalmente, calculamos o vetor :
E assim, obtemos o vetor .
Código Python: Método da matriz tridiagonal
import numpy as np def TDMA(a,b,c,d): #preliminares a = a.astype(’double’) b = b.astype(’double’) c = c.astype(’double’) d = d.astype(’double’) #recupera ordem do sistema n=np.shape(a)[0] #inicializa vetores auxiliares cl=np.zeros(n) dl=np.zeros(n) x=np.zeros(n) #calcula cl e dl cl[0]=c[0]/b[0] for i in np.arange(1,n-1,1): cl[i]=c[i]/(b[i]-a[i]*cl[i-1]) dl[0]=d[0]/b[0] for i in np.arange(1,n,1): dl[i]=(d[i]-a[i]*dl[i-1])/(b[i]-a[i]*cl[i-1]) #faz substituicao reversa para obter a solucao x x[n-1]=dl[n-1] for i in np.arange(n-2,-1,-1): x[i]=dl[i]-cl[i]*x[i+1] return x
Nesse código, usou-se cl e dl para denotar
e
.
Observe que se for desnecessário preservar os valores originais dos vetores
e
, eles
podem, com economia de memória e simplicidade de código, ser sobrescritos pelos
vetores e
,
respectivamente. Eis uma nova implementação:
import numpy as np def TDMA(a,b,c,d): #preliminares a = a.astype(’double’) b = b.astype(’double’) c = c.astype(’double’) d = d.astype(’double’) #recupera ordem do sistema n=np.shape(a)[0] #inicializa vetor x x=np.zeros(n) #calcula cl e dl sobrescrevendo-os em c e d c[0]=c[0]/b[0] for i in np.arange(1,n-1,1): c[i]=c[i]/(b[i]-a[i]*c[i-1]) d[0]=d[0]/b[0] for i in np.arange(1,n,1): d[i]=(d[i]-a[i]*d[i-1])/(b[i]-a[i]*c[i-1]) #faz substituicao reversa para obter a solucao x x[n-1]=d[n-1] for i in np.arange(n-2,-1,-1): x[i]=d[i]-c[i]*x[i+1] return x
A solução do sistema do Exemplo 4.5.1 pode ser obtida através dos
seguintes comandos:
E 4.5.1.Considere o problema linear tridiagonal dado por
Identifique os vetores ,
,
e
relativos ao algoritmo da matriz tridiagonal. Depois resolva o sistema usando o
computador.
Resposta.
E 4.5.2. Considere o seguinte sistema de equações lineares:
Identifique os vetores ,
,
e
relativos ao algoritmo da matriz tridiagonal no sistema linear dado. Depois resolva
o sistema usando o computador. Veja também Exercício 4.7.4