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 A como o produto de duas matrizes triangulares:

A=LU

onde:

Essa fatoração permite reescrever o sistema Ax=b como:

LUx=bLy=bUx=y

resolvendo-se primeiro por substituição direta (Ly=b) e depois por substituição retroativa (Ux=y).


Requisitos para a Fatoração Lu

A fatoração LU sem pivoteamento só é possível se todos os pivôs parciais (valores U[i,i]) forem não nulos. Caso contrário, é necessário realizar pivoteamento parcial para garantir a estabilidade numérica e evitar divisões por zero.

A fatoração LU é um método que decompõe uma matriz quadrada A como o produto de duas matrizes triangulares:

A=LU

onde:


Passo a Passo da Fatoração Lu (sem pivoteamento)

Seja A uma matriz quadrada de ordem n.

Eliminação de Gauss para Formar U e Preencher L

Para cada linha i=0 até n1:

m=U[j,i]U[i,i]
  1. Subtraia m vezes a linha i da linha j em U:
U[j]U[j]mU[i]
  1. Atribua esse multiplicador à posição L[j,i]:
L[j,i]=m

Exemplo Numérico

Considere a matriz A:

A=(23147761822)

Iteração i=0

Iteração i=1

Resultado Final

L=(100210391)U=(231015002)

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 A (e consequentemente de L e b, se estiver resolvendo Ax=b) de modo que o maior valor absoluto na coluna corrente seja usado como pivô.

Passo a Passo com Pivoteamento Parcial

Dado ARn×n, o algoritmo com pivoteamento parcial segue:

1. Inicialização

2. Para Cada Coluna i de 0 Até n1

  1. Escolha do Pivô:

- Encontre o índice da linha com o maior valor absoluto na coluna i, a partir da linha i:

p=argmaxki|U[k,i]|
  1. Troque as linhas i e p de U e P:

- U[[i,p],:]U[[p,i],:]

- P[[i,p],:]P[[p,i],:]

- Se i>0, troque as linhas anteriores de L também:

- L[[i,p],:i]L[[p,i],:i]

  1. Eliminação de Gauss como antes:

- Para cada linha j>i:

- m=U[j,i]/U[i,i]

- U[j]=U[j]mU[i]

- L[j,i]=m

Forma Final da Decomposição com Pivoteamento

A fatoração LU com pivoteamento parcial produz:

PA=LU

Validação da Fatoração

A multiplicação LU deve recuperar a matriz original:

LU=(100210391)(231015002)=A

Observações

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 A em A=LU, podemos resolver o sistema linear Ax=b em duas etapas:

  1. Resolver o sistema intermediário Ly=b (substituição para frente)
  2. Resolver o sistema Ux=y (substituição para trás)

Esse processo é eficiente porque L e U são matrizes triangulares, o que permite resolver os sistemas de forma sequencial, sem necessidade de inversão de matrizes.


1. Resolver Ly=b (Substituição para Frente)

Seja L uma matriz triangular inferior com 1s na diagonal:

L=(100211031321),b=(b1b2b3)

Resolvemos sequencialmente:

Mais genericamente:

yi=bij=1i1Li,jyj

2. Resolver Ux=y (Substituição para Trás)

Seja U uma matriz triangular superior:

U=(u11u12u130u22u2300u33),y=(y1y2y3)

Resolvemos de trás para frente:

Mais genericamente:

xi=1Ui,i(yij=i+1nUi,jxj)

Exemplo Numérico

Considere a decomposição:

L=(100210391),U=(231015002),b=(123)

Etapa 1: Resolver Ly=b

Logo,

y=(100)

Etapa 2: Resolver Ux=y

Logo,

x=(0.500)