Problema de Bratu: Comparação de Métodos Numéricos

Prof. Doherty Andrade - www.metodosnumericos.com.br

Teoria
Código Python
Solução Interativa

Introdução

O problema de Bratu é uma EDO não linear clássica que aparece em problemas de combustão e transferência de calor. Sua forma padrão é: \[ y''(x) + \lambda e^{y(x)} = 0 \] com condições de contorno \( y(0) = y(1) = 0 \). onde:

O problema de Bratu é um caso clássico em equações diferenciais não lineares, frequentemente usado como teste para métodos numéricos. Ele aparece em problemas de combustão, teoria de reações químicas e transferência de calor.

Métodos Implementados

Com os métodos numéricos geramos a solução numérica e apresentamos a tabela e o gráfico.

1. Método do Shooting Não Linear

Transforma o PVC em um PVI e ajusta iterativamente a derivada inicial \( y'(0) \) usando:

  • Runge-Kutta de 4ª ordem para integração
  • Método de Newton para convergência

2. Método de Diferenças Finitas

Discretiza a equação usando aproximações por diferenças centrais: \[ \frac{y_{i+1} - 2y_i + y_{i-1}}{h^2} + \lambda e^{y_i} = 0 \] Resolve o sistema não linear resultante iterativamente.

3. Solução Analítica Aproximada

Para \( \lambda = 1 \), usamos uma expansão em série truncada: \[ y(x) \approx -0.5x(x-1) - 0.05x(x-1)^3 + 0.001x^2(x-1)^4 \]

Implementação Python Completa

import numpy as np
import matplotlib.pyplot as plt

def bratu_shooting(lambda_val, n=20, tol=1e-6, max_iter=100):
    h = 1.0 / n
    y = np.zeros(n+1)
    dy = np.zeros(n+1)
    TK = 1.0  # Chute inicial para y'(0)
    
    for _ in range(max_iter):
        y[0], dy[0] = 0.0, TK
        for i in range(1, n+1):
            # Implementação do RK4 aqui
            pass
        
        if abs(y[-1]) < tol:
            break
            
        # Ajuste de Newton para TK
    return y

def bratu_finite_difference(lambda_val, n=20, tol=1e-6, max_iter=1000):
    h = 1.0 / n
    y = np.zeros(n+1)
    
    for _ in range(max_iter):
        y_old = y.copy()
        for i in range(1, n):
            y[i] = (y[i+1] + y[i-1] + h**2 * lambda_val * np.exp(y_old[i])) / 2
        if np.max(np.abs(y - y_old)) < tol:
            break
    return y

# Exemplo de uso:
y_shooting = bratu_shooting(lambda_val=1.0)
y_fd = bratu_finite_difference(lambda_val=1.0)

Solução Interativa

Resultados do Método do Shooting

Resultados do Método de Diferenças Finitas

Comparação Numérica

x Shooting (y(x)) Dif. Finitas (y(x)) Solução Analítica Erro Relativo (%)