| | | |

Matemática numérica I

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

3.1 Método da decomposição LU

O método da decomposição LU baseia-se na fatoração da matriz de coeficientes de um sistema linear. Dado um sistema A⁢𝒙=𝒃, buscamos escrever a matriz A como o produto de uma matriz triangular inferior L (do inglês, lower triangular matrix) por uma matriz triangular superior U (do inglês, upper triangular matrix), isto é,

A=L⁢U. (3.9)

Com isso, o sistema pode ser reescrito na forma

A⁢𝒙=𝒃 (3.10)
(L⁢U)⁢𝒙=𝒃 (3.11)
L⁢(U⁢𝒙)=𝒃. (3.12)

Definindo

𝒚:=U⁢𝒙, (3.13)

obtemos o sistema triangular

L⁢𝒚=𝒃. (3.14)

Depois de resolver esse sistema, obtemos a solução do sistema original resolvendo o sistema triangular

U⁢𝒙=𝒚. (3.15)

Ou seja, a decomposição LU nos permite resolver um sistema linear por meio da resolução sucessiva de dois sistemas triangulares.

3.1.1 Sistemas triangulares

Antes de estudarmos como calcular a decomposição LU de uma matriz, vamos discutir a resolução de sistemas triangulares.

Sistema triangular inferior

Um sistema linear triangular inferior tem a forma algébrica

a1,1⁢x1=b1a2,1⁢x1+a2,2⁢x2=b2⋮⋮an−1,1⁢x1+an−1,2⁢x2+⋯+an−1,n−1⁢xn−1=bn−1an⁢,1⁢x1+an⁢,2⁢x2+⋯+an,n−1⁢xn−1+an,n⁢xn=bn (3.16)

Se ai,i≠0 para todo i=1,…,n, o sistema tem solução única e pode ser resolvido diretamente, de cima para baixo, isto é:

x1=b1a1,1 (3.17)
x2=b2−a2,1⁢x1a2,2 (3.18)
⋮ (3.19)
xn=bn−an⁢,1⁢x1−an⁢,2⁢x2−…−an,n−1⁢xn−1an,n (3.20)
Exemplo 3.1.1.

Vamos resolver o sistema triangular inferior

x1=2−3⁢x1+2⁢x2=−8−x1+x2−x3=0 (3.21)

Na primeira equação, temos

x1=2 (3.22)

Então, da segunda equação do sistema

−3⁢x1+2⁢x2=−8 (3.23)
x2=−8+3⁢x12 (3.24)
x2=−8+3⋅22 (3.25)
x2=−1 (3.26)

E, por fim, da última equação

−x1+x2−x3=0 (3.27)
x3=x1−x2−1 (3.28)
x3=2−(−1)−1 (3.29)
x3=−3 (3.30)

Concluímos que a solução do sistema é 𝒙=(2,−1,−3).

Código 4: solSisTriaInf.py
1import numpy as np
2
3def solSisTriaInf(A, b):
4 n = b.size
5 x = np.zeros_like(b)
6 for i in range(n):
7 x[i] = b[i]
8 for j in range(i):
9 x[i] -= A[i,j]*x[j]
10 x[i] /= A[i,i]
11 return x
12
13# mat coefficientes
14A = np.array([[1., 0., 0.],
15 [-3., 2., 0.],
16 [-1., 1., -1.]])
17
18# vet termos constantes
19b = np.array([2., -8., 0.])
20
21# resol sis lin
22x = solSisTriaInf(A, b)
23print(x)
Observação 3.1.1.(Número de operações em ponto flutuante)

A computação da solução de um sistema n×n triangular inferior requer O⁢(n2) operações em ponto flutuante (multiplicações/divisões e adições/subtrações).

Sistema triangular superior

Um sistema linear triangular superior tem a forma algébrica

a1,1⁢x1+a1,2⁢x2+⋯+a1,n⁢xn=b1a2,2⁢x2+⋯+a2,n⁢xn=b2⋮⋮an,n⁢xn=bn (3.31)

Pode ser diretamente resolvido de baixo para cima, i.e.

xn=bnan,n (3.32)
xn−1=bn−1−an−1,n⁢xnan−1,n−1 (3.33)
⋮ (3.34)
xn=b1−a1,1⁢x1−a1,2⁢x2−…−a1,n−1⁢xn−1a1,1 (3.35)
Exemplo 3.1.2.

Vamos resolver o sistema triangular superior

2⁢x1−x2+2⁢x3=72⁢x2−x3=−33⁢x3=3 (3.36)

Da última equação, temos

x3=33 (3.37)
x3=1 (3.38)

Então, da segunda equação do sistema, obtemos

2⁢x2−x3=−3 (3.39)
x2=x3−32 (3.40)
x2=1−32 (3.41)
x2=−1 (3.42)

Por fim, da primeira equação

2⁢x1−x2+2⁢x3=7 (3.43)
x1=7+x2−2⁢x32 (3.44)
x1=7−1−22 (3.45)
x1=2 (3.46)

Concluímos que a solução do sistema é 𝒙=(2,−1,1).

Código 5: solSisTriaSup.py
1import numpy as np
2
3def solSisTriaSup(A, b):
4 n = b.size
5 x = np.zeros_like(b)
6 for i in range(n-1,-1,-1):
7 x[i] = b[i]
8 for j in range(n-1,i,-1):
9 x[i] -= A[i,j]*x[j]
10 x[i] /= A[i,i]
11 return x
12
13
14# mat coefficientes
15A = np.array([[2., -1., 2.],
16 [0., 2., -1.],
17 [0., 0., 3.]])
18
19# vet termos constantes
20b = np.array([7., -3., 3.])
21
22# sol sis lin
23x = solSisTriaSup(A, b)
24print(x)
Observação 3.1.2.(Número de operações em ponto flutuante)

A computação da solução um sistema n×n triangular superior requer O⁢(n2) operações em ponto flutuante (multiplicações/divisões e adições/subtrações).

3.1.2 Decomposição LU

O procedimento da decomposição LU é equivalente ao método de eliminação gaussiana. Consideramos uma matriz A=[ai⁢j]i,j=1n,n, com a1,1≠0, e começamos denotando esta matriz por U(0)=[ui,j(0)]i,j=1n,n=A e tomando L(0)=In×n. A eliminação abaixo do pivô u1,1(0), pode ser computada com as seguintes operações equivalentes por linha

U(0)=[u1,1(0)u1,2(0)u1,3(0)…u1,n(0)u2,1(0)u2,2(0)u2,3(0)…u2,n(0)u3,1(0)u3,2(0)u3,3(0)…u3,n(0)⋮⋮⋮…⋮un⁢,1(0)un⁢,2(0)an⁢,3(0)…un,n(0)]⁢U1(1)←U1(0)U2(1)←U2(0)−l2,1(1)⁢U1(0)U3(1)←U3(0)−l3,1(1)⁢U1(0)⋮Un(1)←Un(0)−ln⁢,1(1)⁢U1(0) (3.47)

onde, li⁢,1(1)=ui⁢,1(0)/u1,1(0), i=2,3,…,n.

Destas computações, obtemos uma nova matriz da forma

U(1)=[u1,1(1)u1,2(1)u1,3(1)…u1,n(1)0u2,2(1)u2,3(1)…u2,n(1)0u3,2(1)u3,3(1)…u3,n(1)⋮⋮⋮…⋮0un⁢,2(1)un⁢,3(1)…un,n(1)] (3.48)

E, denotando

L(1)=[100…0l2,1(1)10…0l3,1(1)01…0⋮⋮⋮…⋮ln⁢,1(1)00…1] (3.49)

temos

A=L(1)⁢U(1). (3.50)

No caso de u2,2(1)≠0, podemos continuar com o procedimento de eliminação gaussiana com as seguintes operações equivalentes por linha

U(1)=[u1,1(1)u1,2(1)u1,3(1)…u1,n(1)0u2,2(1)u2,3(1)…u2,n(1)0u3,2(1)u3,3(1)…u3,n(1)⋮⋮⋮…⋮0un⁢,2(1)un⁢,3(1)…un,n(1)]⁢U1(2)←U1(1)U2(2)←U2(1)U3(2)←U3(1)−l3,2(2)⁢U2(1)⋮Un(2)←Un(1)−ln⁢,2(2)⁢U2(1) (3.51)

onde, li⁢,2(2)=ui⁢,2(1)/u2,2(1), i=3,4,…,n. Isto nos fornece o que nos fornece

U(2)=[u1,1(2)u1,2(2)u1,3(2)…u1,n(2)0u2,2(2)u2,3(2)…u2,n(2)00u3,3(2)…u3,n(2)⋮⋮⋮…⋮00un⁢,3(2)…un,n(2)]. (3.52)

Além disso, denotando

L(2)=[100…0l2,1(1)10…0l3,1(1)l3,2(2)1…0⋮⋮⋮…⋮ln⁢,1(1)ln⁢,2(2)0…1] (3.53)

temos

A=L(2)⁢U(2). (3.54)

Continuando com este procedimento, ao final de n−1 passos teremos obtido a decomposição

A=L⁢U, (3.55)

onde L é a matriz triangular inferior

L=L(n−1)=[100…0l2,1(1)10…0l3,1(1)l3,2(2)1…0⋮⋮⋮…⋮ln⁢,1(1)ln⁢,2(2)ln⁢,3(3)…1] (3.56)

e U é a matriz triangular superior

U=U(n−1)=[u1,1(0)u1,2(0)u1,3(0)…u1,n(0)0u2,2(1)u2,3(1)…u2,n(1)00u3,3(2)…u3,n(2)⋮⋮⋮…⋮000…un,n(n−1)]. (3.57)
Exemplo 3.1.3.

Consideramos a seguinte matriz

A=[−12−23−411−53]. (3.58)

Para obtermos sua decomposição L⁢U começamos com

L(0) :=[100010001], (3.59)
U(0) :=[−12−23−411−53]. (3.60)

Então, observando que a eliminação abaixo do pivô u1,1=−1 pode ser feita com as seguintes operações equivalentes por linha

U(0)=[−12−23−411−53]⁢U1(1)←U1(0)U21←U2(0)−3−1⁢U1(0)U31←U3(0)−1−1⁢U1(0), (3.61)

temos

L(1) :=[100−310−101], (3.62)
U(1) :=[−12−202−50−31]. (3.63)

Agora, para eliminarmos abaixo do pivô u2,2=2, usamos as operações

U(1):=[−12−202−50−31]⁢U1(2)←U1(1)U2(2)←U2(1)U3(2)←U3(1)−−32⁢U2(1), (3.64)

donde

L(2)=[100−310−1−1.51], (3.65)
U(1)=[−12−202−500−6.5]. (3.66)

Isso completa a decomposição, sendo L:=L(3) e U:=U(3).

Código 6: lu.py
1import numpy as np
2
3def lu(A):
4 # num. de linhas
5 n = A.shape[0]
6
7 # inicialização
8 U = A.copy()
9 L = np.eye(n)
10
11 # decomposição
12 for i in range(n-1):
13 for j in range(i+1,n):
14 L[j,i] = U[j,i]/U[i,i]
15 U[j,i:] -= L[j,i]*U[i,i:]
16
17 return L, U
18
19# matriz
20A = np.array([[-1., 2., -2.],
21 [3., -4., 1.],
22 [1., -5., 3.]])
23
24L, U = lu(A)
Observação 3.1.3.(Número de operações em ponto flutuante)

A decomposição LU de um sistema n×n requer O⁢(n3) operações em ponto flutuante (multiplicações/divisões e adições/subtrações).

3.1.3 Resolução do sistema com decomposição LU

Consideramos o sistema linear

A⁢𝒙=𝒃. (3.67)

Para resolvê-lo com o Método LU, fazemos

  1. 1.

    Computamos a decomposição LU

    A=L⁢U. (3.68)
  2. 2.

    Resolvemos o sistema triangular inferior

    L⁢𝒚=𝒃. (3.69)
  3. 3.

    Resolvemos o sistema triangular superior

    U⁢𝒙=𝒚. (3.70)
Exemplo 3.1.4.

Vamos resolver o seguinte sistema linear

−x1+2⁢x2−2⁢x3=6 (3.71)
3⁢x1−4⁢x2+x3=−11 (3.72)
x1−5⁢x2+3⁢x3=−10. (3.73)

No exemplo anterior (Exemplo 3.1.4), vimos que a matriz de coeficientes A deste sistema admite a seguinte decomposição LU

[−12−23−411−53]⏟A=[100−310−1−1.51]⏟L⁢[−12−202−500−6.5]⏟U (3.74)

Daí, iniciamos resolvendo o seguinte sistema triangular inferior L⁢y=b, i.e.

y1=6 (3.75)
−3⁢y1+y2=−11 (3.76)
⇒y2=7, (3.77)
−y1−1.5⁢y2+y3=−10 (3.78)
⇒y3=6.5. (3.79)

Por fim, computamos a solução x resolvendo o sistema triangular superior U⁢x=y, i.e.

−6.5⁢x3=6.5 (3.80)
⇒x3=−1, (3.81)
2⁢x2−5⁢x3=7 (3.82)
⇒x2=1 (3.83)
−x1+2⁢x2−2⁢x3=6 (3.84)
⇒x1=−2. (3.85)
1import numpy as np
2
3# mat coefs
4A = np.array([[-1., 2., -2.],
5 [3., -4., 1.],
6 [1., -5., 3.]])
7# vet termos const
8b = np.array([6., -11., -10.])
9
10# 1. LU
11L, U = lu(A)
12
13# 2. Ly = b
14y = solSisTriaInf(L, b)
15
16# 3. Ux = y
17x = solSisTriaSup(U, y)

3.1.4 Fatoração LU com pivotamento parcial

O algoritmo estudando acima não é aplicável no caso de o pivô ser nulo, o que pode ser corrigido através de permutações de linhas. Na fatoração LU com pivotamento parcial fazemos permutações de linha na matriz de forma que o pivô seja sempre aquele de maior valor em módulo. Por exemplo, suponha que o elemento a3,1 seja o maior valor em módulo na primeira coluna da matriz A=U(0) com

U(0)=[u1,1(0)u1,2(0)u1,3(0)…u1,n(0)u2,1(0)u2,2(0)u2,3(0)…u2,n(0)𝒖3,1(𝟎)u3,2(0)u3,3(0)…u3,n(0)⋮⋮⋮…⋮un⁢,1(0)un⁢,2(0)an⁢,3(0)…un,n(0)]. (3.86)

Neste caso, o procedimento de eliminação na primeira coluna deve usar u3,1(0) como pivô, o que requer a permutação entre as linhas 1 e 3 (U1(0)↔U3(0)). Isto pode ser feito utilizando-se da seguinte matriz de permutação

P=[001…0010…0100…0⋮⋮⋮…⋮000…1]. (3.87)

Com essa, iniciamos o procedimento de decomposição LU com P⁢A=L(0)⁢U(0), onde L(0)=In×n e U(0)=P⁢A. Caso sejam necessárias outras mudanças de linhas no decorrer do procedimento de decomposição, a matriz de permutação P deve ser atualizada apropriadamente.

Exemplo 3.1.5.

Vamos fazer a decomposição LU com pivotamento parcial da seguinte matriz

A=[−12−23−411−53] (3.88)

Começamos, tomando

P(0)=[100010001], (3.89)
L(0)=[100010001], (3.90)
U(0)=[−12−23−411−53] (3.91)

O candidato a pivô é o elemento u2,1(0). Então, fazemos as permutações de linhas

P1((0) ↔P2(0), (3.92)
U1(0) ↔U2(0) (3.93)

e, na sequência, as operações elementares por linhas

U2:3(1)←U2:3(0)−m2:3,1(0)⁢U1(0), (3.94)

donde obtemos

P(1)=[010100001], (3.95)
L(1)=[100−0,3¯100,3¯01], (3.96)
U(1)=[3−4100,6¯−1,6¯0−3,6¯2,6¯] (3.97)

Agora, o candidato a pivô é o elemento u3,2(1). Assim, fazemos as permutações de linhas

P2(1)↔P3(1), (3.98)
U2(1)↔U3(1) (3.99)

e análogo para os elementos da coluna 1 de L. Então, fazemos a operação elementar por linha

U3(2)←U3(1)−m3,2(1)⁢U2(1) (3.100)

. Com isso, obtemos

P(2)=[010001100], (3.101)
L(2)=[1000,3¯10−0,3¯−0,18¯1], (3.102)
U(2)=[3−410−3,6¯2,6¯00−1,18¯] (3.103)

Por fim, temos obtido a decomposição LU de A na forma

P⁢A=L⁢U, (3.104)

com P=P(2), L=L(2) e U=U(2).

Código 7: lup.py
1import numpy as np
2
3def lup(A):
4 # num. de linhas
5 n = A.shape[0]
6
7 # inicialização
8 U = A.copy()
9 L = np.eye(n)
10 P = np.eye(n)
11
12 # decomposição
13 for i in range(n-1):
14 # permutação de linhas
15 p = i + np.argmax(np.fabs(U[i:,i]))
16 P[[i,p]] = P[[p,i]]
17 U[[i,p]] = U[[p,i]]
18 L[[i,p],:i] = L[[p,i],:i]
19 # eliminação gaussiana
20 for j in range(i+1,n):
21 L[j,i] = U[j,i]/U[i,i]
22 U[j,i:] -= L[j,i]*U[i,i:]
23
24 return P, L, U
25
26# matriz
27A = np.array([[-1., 2, -2],
28 [3, -4, 1],
29 [1, -5, 3]])
30
31P, L, U = lup(A)
Exemplo 3.1.6.

Vamos computar a solução do seguinte sistema linear com o Método da Decomposição LU com Pivotamento Parcial.

−x1+2⁢x2−2⁢x3=6 (3.105)
3⁢x1−4⁢x2+x3=−11 (3.106)
x1−5⁢x2+3⁢x3=−10. (3.107)

No exemplo anterior (Exemplo 3.1.5), vimos que a matriz de coeficientes A deste sistema admite a seguinte decomposição LU

P⁢A=L⁢U (3.108)

com

P=[010001100], (3.109)
L=[1000,3¯10−0,3¯−0,18¯1], (3.110)
U=[3−410−3,6¯2,6¯00−1,18¯] (3.111)

Multiplicando o sistema a esquerda pela matriz P, obtemos

P⁢A⁢𝒙=P⁢𝒃 (3.112)
L⁢U⁢𝒙=P⁢𝒃 (3.113)
L⁢(U⁢𝒙)=P⁢𝒃 (3.114)

Com isso, resolvemos

L⁢𝒚=P⁢𝒃 (3.115)

donde obtemos

𝒚=(−11,−6,3¯⁢,1,18¯) (3.116)

Então, resolvemos

U⁢𝒙=y (3.117)

donde obtemos a solução

𝒙=(−2,1,−1). (3.118)
1# matriz
2A = np.array([[-1., 2., -2.],
3 [3., -4., 1.],
4 [1., -5., 3.]])
5b = np.array([6,-11,-10])
6
7P, L, U = lup(A)
8
9y = solSisTriaInf(L, P@b)
10x = solSisTriaSup(U, y)

3.1.5 Exercícios

E. 3.1.1.

Seja a matriz

A=[−12−2341−4−53] (3.119)
  1. a)

    Compute sua decomposição LU sem pivotamento parcial.

  2. b)

    Compute sua decomposição LU com pivotamento parcial.


a)

L=[100−310401] (3.120)
U=[−122010−5004.5] (3.121)

b)

P=[001100010] (3.122)
L=[0000.2510−0.757.692⁢e−21] (3.123)
U=[−4−5303.25−2.75003.462] (3.124)
E. 3.1.2.

Use o Método da Decomposição LU para resolver o sistema linear

−x1+2⁢x2−2⁢x3=−1 (3.125)
3⁢x1−4⁢x2+x3=−4 (3.126)
−4⁢x1−5⁢x2+3⁢x3=20 (3.127)

usando LU.


x1=−3, x2=−1, x3=1

E. 3.1.3.

Compute a decomposição LU da matriz

A=[−10−21300−21−10−102−30]. (3.128)

P=[0100000110000010] (3.129)
L=[10000100−0.3¯0100.3¯−0.50.751] (3.130)
U=[300−202−3000−20.3¯000−0.58⁢3¯] (3.131)
E. 3.1.4.

Use o Método da Decomposição LU para resolver o sistema linear

−x1−2⁢x3+x4=1 (3.132)
3⁢x1−2⁢x4=−7 (3.133)
x1−x2−x4=−3 (3.134)
2⁢x2−3⁢x3=−3 (3.135)

x=(−1,0,1,2)

E. 3.1.5.

A matriz de Vandermonde111Alexandre-Théophile Vandermonde, 1735 - 1796, matemático francês. Fonte: Wikipédia: Alexandre-Theóphile Vandermonde. é definida por

V⁢(x1,…,xn)=[x1n−1⋯x12x11x2n−1⋯x22x21⋮⋮⋮⋮xnn−1⋯xn2xn1] (3.136)

Compute a decomposição LU com pivotamento parcial das matrizes de Vandermonde222Alexandre-Théophile Vandermonde, 1735 - 1796, matemático francês. Fonte: Wikipédia: Alexandre-Theóphile Vandermonde..

  1. a)

    V⁢(1,2,3)

  2. b)

    V⁢(−2,−1,0,1)

  3. c)

    V⁢(0.1,0.25,0.5,0.75)

  4. d)

    V⁢(−0.1,0.5,1,2,10)


Dica: A matriz de Vandermonde pode ser alocada com o seguinte código:

1import numpy as np
2x = np.array([1.,2,3])
3n = x.size
4V = np.ones((n,n))
5for i in range(n-1):
6 V[:,i] = x**(n-1-i)
7print(V)
E. 3.1.6.

Use o Método da Decomposição LU para computar a matriz inversa de cada uma das seguintes matrizes:

  1. a)
    A=[−12−2341−4−53] (3.137)
  2. b)
    B=[−10−21300−21−10−102−30]. (3.138)

Dica: A⁢A−1=I.

  1. a)
    A−1=[−0.3778−0.0889,−0.22220.28890.24440.1111−0.02220.28890.2222] (3.139)
  2. b)
    B−1=[0.85711−1.1429−0.5714−0.42860−0.42860.2857−0.28570−0.2857−0.14291.28571.−1.7143−0.8571] (3.140)

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