Fatoração LU com Python
Contents
12. Fatoração LU com Python#
12.1. Decomposição LU#
Suponha o sistema de equações
A motivação para a decomposição LU baseia-se na observação de que sistemas triangulares são mais fáceis de resolver. Semelhantemente à Eliminação Gaussiana, a decomposição LU (que, na verdade, é uma segunda abordagem da própria Eliminação Gaussiana), explora a ideia de “fatoração” de matrizes, em que a matriz original do sistema é fatorada (“quebrada”) como
onde \(\mathbf{L}\) é uma matriz triangular inferior e \(\mathbf{U}\) é triangular superior. Nosso objetivo é determinar \(\mathbf{L}\) e \(\mathbf{U}\), de maneira que o vetor \(\mathbf{x}\) seja obtido através da resolução de um par de sistemas cujas matrizes são triangulares.
12.1.1. Exemplo#
Consideraremos que as matrizes triangulares inferiores \(\mathbf{L}\) sempre terão a sua diagonal principal formada por entradas iguais a 1. Este tipo de fatoração é conhecido como Fatoração de Doolittle.
onde
Multiplicando \(\mathbf{L}\mathbf{U}\) e definindo a resposta igual a \(\mathbf{A}\) temos:
Agora, através de substituição de recorrência, facilmente encontramos \(\mathbf{L}\) e \(\mathbf{U}\).
12.2. Usando a decomposição LU para resolver sistemas de equações#
Uma vez decomposta a matriz \(\mathbf{A}\) no produto \(\mathbf{L}\mathbf{U}\), podemos obter a solução \(\mathbf{x}\) de forma direta. O procedimento, equivalente à substituição de recorrência mencionada anteriormente, pode ser resumido como segue: dada \(\mathbf{A}\), encontre \(\mathbf{L}\) e \(\mathbf{U}\) tal que \(\mathbf{A} = \mathbf{L}\mathbf{U}\), ou seja, \((\mathbf{L}\mathbf{U})\mathbf{x} = \mathbf{b}\). Em outras palavras:
Defina \(\mathbf{y} = \mathbf{U}\mathbf{x}\).
Resolva o sistema triangular \(\mathbf{L}\mathbf{y} = \mathbf{b}\) para \(\mathbf{y}\).
Finalmente, resolva o sistema triangular \(\mathbf{U}\mathbf{x} = \mathbf{y}\) para \(\mathbf{x}\).
O benefício desta abordagem é a resolução de somente sistemas triangulares. Por outro lado, o custo empregado é termos de resolver dois sistemas.
12.2.1. Exemplo#
Encontre a solução \(\mathbf{x} = \begin{bmatrix} x_1 \\ x_2 \\ x_3 \end{bmatrix}\) do sistema
As matrizes \(\mathbf{L}\) e \(\mathbf{U}\) já foram obtidas anteriormente.
A próxima etapa é resolver \(\mathbf{L}\mathbf{y} = \mathbf{b}\), para o vetor \(\mathbf{y} = \begin{bmatrix} y_1 \\ y_2 \\ y_3 \end{bmatrix}\).
Este sistema pode ser resolvido por substituição direta, obtendo \(\mathbf{y} = \begin{bmatrix} 3 \\ 4 \\ -6 \end{bmatrix}\).
Agora que encontramos \(\mathbf{y}\), concluímos o procedimento resolvendo \(\mathbf{U}\mathbf{x} = \mathbf{y}\) para \(\mathbf{x}\). Ou seja, resolvemos:
Realizando a substituição regressiva (baixo para cima; direita para esquerda), obtemos a solução do problema.
Abaixo, temos uma implementação de uma fatoração LU sem pivoteamento.
import numpy as np
def lu_nopivot(A):
'''
Realiza fatoração LU para a matriz A
entrada:
A - matriz: array (nxn)
saida:
L,U - matriz triangular inferior, superior : array (nxn)
'''
n = np.shape(A)[0] # dimensao
L = np.eye(n) # auxiliar
for k in np.arange(n):
L[k+1:n,k] = A[k+1:n,k]/A[k,k]
for l in np.arange(k+1,n):
A[l,:] = A[l,:] - np.dot(L[l,k],A[k,:])
U = A
return (L,U)
Exemplo: Fatoração \(\bf{ LU }\) da matriz
A = np.array([[ 4., -2., -3., 6.],[ 1., 4., 2., 3.],[ 2., -3., 3., -2.],[ 1., 5., 3., 4.]])
L,U = lu_nopivot(A)
L
array([[ 1. , 0. , 0. , 0. ],
[ 0.25 , 1. , 0. , 0. ],
[ 0.5 , -0.44444444, 1. , 0. ],
[ 0.25 , 1.22222222, 0.06796117, 1. ]])
U
array([[ 4. , -2. , -3. , 6. ],
[ 0. , 4.5 , 2.75 , 1.5 ],
[ 0. , 0. , 5.72222222, -4.33333333],
[ 0. , 0. , 0. , 0.96116505]])