Escolha um item dos exercícios 1 ou 2 e crie um código em Python ou MATLAB que resolva-o e que calcule a derivada através de diferenças finitas.
Passo 1
Beleza, o enunciado pede para a gente escolher um dos itens dos exercícios 1 ou 2 e criar um código em Python (ou MATLAB) que resolva o problema e, de quebra, calcule a derivada usando diferenças finitas. Isso cai em “Análise Numérica” na parte de “Derivadas Numéricas”. Para isso vamos precisar:
- Definir a função que queremos derivar.
- Entender as fórmulas de diferenças finitas (forward, backward e central).
- Implementar o código que aplica essas fórmulas e retorna as aproximações da derivada.
Passo 2
Vou escolher o Exercício 1, que diz (hipoteticamente):
“Seja . Calcule numericamente
usando diferenças finitas.”
A teoria:
“Seja
A teoria:
- Forward difference:
- Backward difference:
- Central difference (mais preciso):
Aqui
é o “passinho” que damos em
. Quanto menor
, teoricamente melhor, até pegar erros de máquina.
Passo 3
Vamos montar o código em Python. Primeiro, definimos a função e depois três funções que calculam cada fórmula de diferenças:
import numpy as np
# Função que queremos derivar
def f(x):
return x**2 + 3*x
# Derivada exata (para comparar)
def f_exata(x):
return 2*x + 3
# Fórmulas de diferenças finitas
def deriv_forward(x, h):
return (f(x + h) - f(x)) / h
def deriv_backward(x, h):
return (f(x) - f(x - h)) / h
def deriv_central(x, h):
return (f(x + h) - f(x - h)) / (2*h)
# Ponto onde vamos derivar
x0 = 1.0
# Testamos vários h
hs = [1e-1, 1e-2, 1e-3, 1e-4]
print("Aproximações para f'(1) com f(x)=x^2+3x")
for h in hs:
fwd = deriv_forward(x0, h)
bwd = deriv_backward(x0, h)
cen = deriv_central(x0, h)
exa = f_exata(x0)
print(f"h={h:.0e}: forward={fwd:.6f}, backward={bwd:.6f}, central={cen:.6f}, exata={exa:.6f}")
Passo 4
Explicando o que o código faz, passo a passo:
- Importamos o NumPy só por conveniência (mas nem usamos funções avançadas).
- Definimos
f(x)
e sua derivada analíticaf_exata(x)=2x+3
(só pra comparar o quão ruim ou bom são as aproximações). - Criamos três funções que implementam as fórmulas vistas acima.
- Escolhemos o ponto
. - Percorremos vários valores de
(de até ) e mostramos as aproximações de cada método, comparando com o valor exato, que é
Passo 5
Se você rodar esse script, vai ver algo tipo:
h=1e-1: forward=5.100000, backward=4.900000, central=5.000000, exata=5.000000
h=1e-2: forward=5.010000, backward=4.990000, central=5.000000, exata=5.000000
h=1e-3: forward=5.001000, backward=4.999000, central=5.000000, exata=5.000000
h=1e-4: forward=5.000100, backward=4.999900, central=5.000000, exata=5.000000
h=1e-2: forward=5.010000, backward=4.990000, central=5.000000, exata=5.000000
h=1e-3: forward=5.001000, backward=4.999000, central=5.000000, exata=5.000000
h=1e-4: forward=5.000100, backward=4.999900, central=5.000000, exata=5.000000
A gente percebe que a fórmula central converge mais rápido (já dá 5.000000 mesmo com
).
Resposta
Código em Python que resolve o Exercício 1 (função
, calcula
via diferenças finitas) conforme acima. Os resultados mostram que, para
pequeno, todas se aproximam de 5 (o valor exato), e a fórmula central é a mais precisa para mesmo valor de
.