Fatoração LU
A fatoração LU é um método direto para resolver sistemas lineares, calcular determinantes e inverter matrizes. Consiste em decompor uma matriz quadrada
onde:
é uma matriz triangular inferior, com 1s na diagonal principal ( ); é uma matriz triangular superior (pode conter qualquer valor na diagonal).
Essa fatoração permite reescrever o sistema
resolvendo-se primeiro por substituição direta (
Requisitos para a Fatoração Lu
A fatoração LU sem pivoteamento só é possível se todos os pivôs parciais (valores
A fatoração LU é um método que decompõe uma matriz quadrada
onde:
é uma matriz triangular inferior com 1s na diagonal principal. é uma matriz triangular superior.
Passo a Passo da Fatoração Lu (sem pivoteamento)
Seja
Eliminação de Gauss para Formar e Preencher
Para cada linha
- Para cada linha
até : - Calcule o fator multiplicador:
- Subtraia
vezes a linha da linha em :
- Atribua esse multiplicador à posição
:
Exemplo Numérico
Considere a matriz
Iteração
- Linha 1:
- Linha 2:
Iteração
- Linha 2:
Resultado Final
Pivoteamento Parcial na Fatoração Lu
O pivoteamento parcial é uma técnica utilizada na fatoração LU para evitar divisões por zero e minimizar erros numéricos causados por pivôs pequenos. Ele consiste em trocar linhas da matriz
Passo a Passo com Pivoteamento Parcial
Dado
1. Inicialização
- Crie
(matriz identidade), , e (matriz de permutação).
2. Para Cada Coluna de Até
- Escolha do Pivô:
- Encontre o índice da linha com o maior valor absoluto na coluna
- Troque as linhas
e de e :
-
-
- Se
-
- Eliminação de Gauss como antes:
- Para cada linha
-
-
-
Forma Final da Decomposição com Pivoteamento
A fatoração LU com pivoteamento parcial produz:
é a matriz de permutação que representa as trocas de linha. é a matriz triangular inferior com 1s na diagonal. é a matriz triangular superior.
Validação da Fatoração
A multiplicação
Observações
- A fatoração LU não é única se não houver restrição em
ou . - A convenção comum é impor que
tenha 1s na diagonal. - O método é eficiente para sistemas lineares com múltiplos vetores
, pois o custo da fatoração ( ) é feito uma única vez
Exemplo em Python com Pivoteamento
import numpy as np
def lu_decomposition_pivot(A):
"""
Perform LU decomposition with partial pivoting on matrix A.
Decomposes PA = LU, where P is a permutation matrix, L is lower triangular, and U is upper triangular.
Parameters:
A -- Square matrix (numpy.ndarray)
Returns:
P -- Permutation matrix (numpy.ndarray)
L -- Lower triangular matrix (numpy.ndarray)
U -- Upper triangular matrix (numpy.ndarray)
"""
n = A.shape[0]
L = np.eye(n)
U = A.copy().astype(float)
P = np.eye(n)
for i in range(n):
# Find The Index Of The Row With The Largest Absolute Value In Column I
pivot = np.argmax(np.abs(U[i:, i])) + i
if U[pivot, i] == 0:
raise ValueError("Singular matrix.")
# Swap Rows In U
U[[i, pivot]] = U[[pivot, i]]
# Swap Rows In P
P[[i, pivot]] = P[[pivot, i]]
# Swap Rows In L (only For Previously Computed columns)
if i > 0:
L[[i, pivot], :i] = L[[pivot, i], :i]
# Elimination Process
for j in range(i+1, n):
m = U[j, i] / U[i, i]
L[j, i] = m
U[j] = U[j] - m * U[i]
return P, L, U
def solve_with_lu(P, L, U, b):
"""
Solve the linear system Ax = b using LU decomposition with pivoting.
Parameters:
P, L, U -- The factors of A such that PA = LU
b -- The right-hand side vector
Returns:
result -- Dictionary with keys:
'solution' : Solution vector (numpy.ndarray)
'residual' : Final residual norm (float)
"""
# Step 1: Apply The Permutation To B
Pb = np.dot(P, b)
# Step 2: Forward Substitution To Solve Ly = Pb
n = L.shape[0]
y = np.zeros(n)
for i in range(n):
y[i] = Pb[i]
for j in range(i):
y[i] -= L[i, j] * y[j]
# Step 3: Back Substitution To Solve Ux = Y
x = np.zeros(n)
for i in range(n-1, -1, -1):
x[i] = y[i]
for j in range(i+1, n):
x[i] -= U[i, j] * x[j]
x[i] /= U[i, i]
residual = np.linalg.norm(np.dot(A, x) - b, ord=np.inf) if 'A' in globals() else None
return {'solution': x, 'residual': residual}
if __name__ == "__main__":
# Example Usage
A = np.array([
[0, 3, 1],
[4, 7, 7],
[6, 18, 22]
], dtype=float)
P, L, U = lu_decomposition_pivot(A)
print("P =\n", P)
print("\nL =\n", L)
print("\nU =\n", U)
print("\nVerification: P·A =\n", np.dot(P, A))
print("\nL·U =\n", np.dot(L, U))
# Define a Right-hand Side Vector B
b = np.array([2, 4, 3], dtype=float)
# Solve The System Ax = B
result = solve_with_lu(P, L, U, b)
print("\nSolution x =\n", result['solution'])
print("\nFinal residual norm =", result['residual'])
print("\nVerification: A·x =\n", np.dot(A, result['solution']))
Resolução de Sistemas com Fatoração Lu
Após decompor a matriz
- Resolver o sistema intermediário
(substituição para frente) - Resolver o sistema
(substituição para trás)
Esse processo é eficiente porque
1. Resolver (Substituição para Frente)
Seja
Resolvemos sequencialmente:
Mais genericamente:
2. Resolver (Substituição para Trás)
Seja
Resolvemos de trás para frente:
Mais genericamente:
Exemplo Numérico
Considere a decomposição:
Etapa 1: Resolver
Logo,
Etapa 2: Resolver
Logo,