| | | | |

3.1 Método da Decomposição LU

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

O Método da Decomposição LU é uma forma eficiente de se resolver sistemas lineares de pequeno porte. Dado um sistema A𝒙=𝒃, a ideia é decompor a matriz A como o produto de uma matriz triangular inferior L (do inglês, lower triangular matrix) com uma matriz triangular superior U (do inglês, upper triangular matrix), i.e.

A=LU. (3.6)

Com isso, o sistema pode ser reescrito na forma

A𝒙=𝒃 (3.7)
(LU)𝒙=𝒃 (3.8)
L(U𝒙)=𝒃. (3.9)

Denotando,

U𝒙=:𝐲 (3.10)

podemos resolver o seguinte sistema triangular

L𝒚=𝒃. (3.11)

Tendo resolvido este sistema, a solução do sistema A𝒙=𝒃 pode, então, ser computada como a solução do sistema triangular

U𝒙=𝒚. (3.12)

Ou seja, a decomposição LU nos permite resolver uma sistema pela resolução de dois sistemas triangulares.

3.1.1 Sistemas Triangulares

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

Sistema Triangular Inferior

Um sistema linear triangular inferior tem a forma algébrica

a1,1x1=b1a2,1x1+a2,2x2=b2an1,1x1+an1,2x2++an1,n1xn1=bn1an,1x1+an,2x2++an,n1xn1+an,nxn=bn (3.13)

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

x1 =b1a1,1 (3.14)
x2 =b2a2,1x1a2,2 (3.15)
(3.16)
xn =bnan,1x1an,2x2an,n1xn1an,n (3.17)
Exemplo 3.1.1.

Vamos resolver o sistema triangular inferior

x1=23x1+2x2=8x1+x2x3=0 (3.18)

Na primeira equação, temos

x1=2 (3.19)

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

3x1+2x2=8 (3.20)
x2=8+3x12 (3.21)
x2=8+322 (3.22)
x2=1 (3.23)

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

x1+x2x3=0 (3.24)
x3=x1x21 (3.25)
x3=2(1)1 (3.26)
x3=3 (3.27)

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,1x1+a1,2x2++a1,nxn=b1a2,2x2++a2,nxn=b2an,nxn=bn (3.28)

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

xn =bnan,n (3.29)
xn1 =bn1an1,nxnan1,n1 (3.30)
(3.31)
xn =b1a1,1x1a1,2x2a1,n1xn1a1,1 (3.32)
Exemplo 3.1.2.

Vamos resolver o sistema triangular superior

2x1x2+2x3=72x2x3=33x3=3 (3.33)

Da última equação, temos

x3=33 (3.34)
x3=1 (3.35)

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

2x2x3=3 (3.36)
x2=x332 (3.37)
x2=132 (3.38)
x2=1 (3.39)

Por fim, da primeira equação

2x1x2+2x3=7 (3.40)
x1=7+x22x32 (3.41)
x1=7122 (3.42)
x1=2 (3.43)

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=[aij]i,j=1n,n, com a1,10, 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.44)

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.45)

E, denotando

L(1)=[1000l2,1(1)100l3,1(1)010ln,1(1)001] (3.46)

temos

A=L(1)U(1). (3.47)

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.48)

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.49)

Além disso, denotando

L(2)=[1000l2,1(1)100l3,1(1)l3,2(2)10ln,1(1)ln,2(2)01] (3.50)

temos

A=L(2)U(2). (3.51)

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

A=LU, (3.52)

onde L é a matriz triangular inferior

L=L(n1)=[1000l2,1(1)100l3,1(1)l3,2(2)10ln,1(1)ln,2(2)ln,3(3)1] (3.53)

e U é a matriz triangular superior

U=U(n1)=[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)000un,n(n1)]. (3.54)
Exemplo 3.1.3.

Consideramos a seguinte matriz

A=[122341153]. (3.55)

Para obtermos sua decomposição LU começamos com

L(0) :=[100010001], (3.59)
U(0) :=[122341153]. (3.63)

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)=[122341153]U1(1)U1(0)U21U2(0)31U1(0)U31U3(0)11U1(0), (3.64)

temos

L(1) :=[100310101], (3.68)
U(1) :=[122025031]. (3.72)

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

U(1):=[122025031]U1(2)U1(1)U2(2)U2(1)U3(2)U3(1)32U2(1), (3.73)

donde

L(2)=[10031011.51], (3.77)
U(1)=[122025006.5]. (3.81)

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.82)

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

  1. 1.

    Computamos a decomposição LU

    A=LU. (3.83)
  2. 2.

    Resolvemos o sistema triangular inferior

    L𝒚=𝒃. (3.84)
  3. 3.

    Resolvemos o sistema triangular superior

    U𝒙=𝒚. (3.85)
Exemplo 3.1.4.

Vamos resolver o seguinte sistema linear

x1+2x22x3 =6 (3.86)
3x14x2+x3 =11
x15x2+3x3 =10.

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

[122341153]A=[10031011.51]L[122025006.5]U (3.87)

Daí, iniciamos resolvendo o seguinte sistema triangular inferior Ly=b, i.e.

y1=6 (3.88)
3y1+y2=11 (3.89)
y2=7 (3.90)
y11.5y2+y3=10 (3.91)
y3=6.5. (3.92)

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

6.5x3=6.5 (3.93)
x3=1, (3.94)
2x25x3=7 (3.95)
x2=1 (3.96)
x1+2x22x3=6 (3.97)
x1=2. (3.98)
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.99)

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=[0010010010000001]. (3.100)

Com essa, iniciamos o procedimento de decomposição LU com PA=L(0)U(0), onde L(0)=In×n e U(0)=PA. 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=[122341153] (3.101)

Começamos, tomando

P(0)=[100010001], (3.105)
L(0)=[100010001], (3.109)
U(0)=[122341153] (3.113)

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

P1((0) P2(0), (3.114)
U1(0) U2(0) (3.115)

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

U2:3(1)U2:3(0)m2:3,1(0)U1(0), (3.116)

donde obtemos

P(1) =[010100001], (3.120)
L(1) =[1000,3¯100,3¯01], (3.124)
U(1) =[34100,6¯1,6¯03,6¯2,6¯] (3.128)

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

P2(1) P3(1), (3.129)
U2(1) U3(1) (3.130)

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.131)

. Com isso, obtemos

P(2) =[010001100], (3.135)
L(2) =[1000,3¯100,3¯0,18¯1], (3.139)
U(2) =[34103,6¯2,6¯001,18¯] (3.143)

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

PA=LU, (3.144)

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+2x22x3 =6 (3.145)
3x14x2+x3 =11 (3.146)
x15x2+3x3 =10. (3.147)

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

PA=LU (3.148)

com

P =[010001100], (3.152)
L =[1000,3¯100,3¯0,18¯1], (3.156)
U =[34103,6¯2,6¯001,18¯] (3.160)

Multiplicando o sistema a esquerda pela matriz P, obtemos

PA𝒙=P𝒃 (3.161)
LU𝒙=P𝒃 (3.162)
L(U𝒙)=P𝒃 (3.163)

Com isso, resolvemos

L𝒚=P𝒃 (3.164)

donde obtemos

𝒚=(11,6,3¯,1,18¯) (3.165)

Então, resolvemos

U𝒙=y (3.166)

donde obtemos a solução

𝒙=(2,1,1). (3.167)
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=[122341453] (3.168)
  1. a)

    Compute sua decomposição LU sem pivotamento parcial.

  2. b)

    Compute sua decomposição LU com pivotamento parcial.

Resposta.

a)

L =[100310401] (3.172)
U =[1220105004.5] (3.176)

b)

P =[001100010] (3.180)
L =[0000.25100.757.692e21] (3.184)
U =[45303.252.75003.462] (3.188)
E. 3.1.2.

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

x1+2x22x3 =1 (3.189)
3x14x2+x3 =4 (3.190)
4x15x2+3x3 =20 (3.191)

usando LU.

Resposta.

x1=3, x2=1, x3=1

E. 3.1.3.

Compute a decomposição LU da matriz

A=[1021300211010230]. (3.192)
Resposta.
P =[0100000110000010] (3.197)
L =[100001000.3¯0100.3¯0.50.751] (3.202)
U =[300202300020.3¯0000.583¯] (3.207)
E. 3.1.4.

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

x12x3+x4 =1 (3.208)
3x12x4 =7 (3.209)
x1x2x4 =3 (3.210)
2x23x3 =3 (3.211)
Resposta.

x=(1,0,1,2)

E. 3.1.5.

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

V(x1,,xn)=[x1n1x12x11x2n1x22x21xnn1xn2xn1] (3.212)

Compute a decomposição LU com pivotamento parcial das matrizes de Vandermonde3131endnote: 31Alexandre-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)

Resposta.

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=[122341453] (3.213)
  2. b)
    B=[1021300211010230]. (3.214)
Resposta.

Dica: AA1=I.

  1. a)
    A1=[0.37780.0889,0.22220.28890.24440.11110.02220.28890.2222] (3.215)
  2. b)
    B1=[0.857111.14290.57140.428600.42860.28570.285700.28570.14291.28571.1.71430.8571] (3.216)

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!