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.
Transforma o PVC em um PVI e ajusta iterativamente a derivada inicial \( y'(0) \) usando:
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.
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 \]
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)
| x | Shooting (y(x)) | Dif. Finitas (y(x)) | Solução Analítica | Erro Relativo (%) |
|---|