Você está na página 1de 7

Fórmula de Taylor e Aproximação de Derivadas

Paulo J. S. Silva
12 de setembro de 2017

1 Fórmula de Taylor
A fórmula de Taylor fornece uma aproximação polinomial local cada vez melhor de uma função (muitas
vezes) diferenciável à medida que calculamos as suas derivadas. Ela é um pilar fundamental do Cálculo
Numérico pois nos ensina como aproximar funções complicadas por funções mais simples.
Como uma pequena introdução, vejamos a definição de derivada de uma função real em um ponto x:

f ( x + h) − f ( x )
f ′ ( x ) = lim .
h →0 h
Uma outra forma de encarar essa definição é observar que ela nos ensina a aproximar a função f perto de
x por uma função linear. Isso é facilmente visto manipulando um pouco a expressão acima:

f ( x + h) − f ( x )
f ′ ( x ) = lim ⇐⇒
h →0 h
f (y) − f ( x )
f ′ ( x ) = lim ⇐⇒
y→ x y−x
f (y) − f ( x ) − f ′ ( x )(y − x )
0 = lim .
y→ x y−x

Nessa última expressão temos o denominador indo para 0. Normalmente divisões por valores pequenos
tendem a gerar valores muito grandes a não ser que o denominador seja menor ainda. Assim a expressão
acima nos diz não somente que

lim f (y) − f ( x ) − f ′ ( x )(y − x ) = 0,


y→ x

Mas que essa expressão vai a zero "mais rapidamente"do que y pode ir para x.
Ou seja f ( x ) − f ′ ( x )(y − x ) pode ser usada como uma boa aproximação de f (y) e essa aproximação vai
se tornando cada vez melhor a medida que y está próximo de x. Tipicamente isso é escrito como

f (y) = f ( x ) + f ′ ( x )(y − x ) + o (|y − x |).

A notação o (|y − x |) representa uma função que vai para zero mais rapidamente que |y − x |, ou seja que

o (|y − x |)
lim = 0,
y→ x |y − x |

e que representa o erro que é feito a se usar a aproximação linear f ( x ) + f ′ ( x )(y − x ) no lugar de f (y).
Outro resultado relacionado é o teorema do valor intermediário
f (y) − f ( x )
∃z ∈ ( x, y), f ′ (z) = .
y−x

1
Mas uma vez podemos reorganizar as contas de maneira a ver esse resultado como uma fórmula alternativa
de calcular o f (y):
∃z ∈ ( x, y), , f (y) = f ( x ) + f ′ (z)(y − x ).
Ou seja, se soubermos como encontrar o z, podemos calcular f (y) conhecendo apenas f ( x ) e f ′ (z). Dife-
rente da fórmula anterior, que apenas aproximava f (y), essa fórmula é exata. Mas o preço que se paga por
isso é o fato que não conhecemos z, apenas sabemos que ele está no intervalo ( x, y).
Essas duas fórmulas podem ser generalizadas de maneira a obter mais informação se tivermos as nossa
disposição derivadas de ordem mais altas. Essas são as fórmulas de Taylor, que vocês viram nos cursos de
cálculo, e que reproduzimos a seguir.

Teorema (Fórmula de Taylor). Seja f : R → R uma função e x um número real no qual as


derivadas f ′ ( x ), f ′′ ( x ), . . . , f (n) ( x ) existem. Então, se definirmos o polinômio (conhecido como
polinômio de Taylor)

f ′′ ( x ) f (n) ( x )
Pn (y) = f ( x ) + f ′ ( x )(y − x ) + ( y − x )2 + . . . + (y − x )n ,
2! n!
vale que
f (y) − Pn (y)
lim = 0.
y→ x (y − x )n
Outra forma de escrever isso é

f (y) = Pn (y) + o (|y − x |n ).

Já a variação desse resultado associada ao teorema do valor médio é apresentado abaixo. Nela é possível
ver de forma mais explícita o erro.

Teorema (Fórmula de Taylor com resto de Lagrange). Seja f : R → R uma função e x, y dois
números reais. Se as derivadas f ′ , f ′′ , . . . , f (n+1) estão todas definidas no intervalo [ x, y], então
existe z ∈ ( x, y) tal que
f ( n +1) ( z )
f (y) = Pn (y) + ( x − y ) n +1 .
( n + 1) !

Os dois resultados acima podem ser generalizados para funções de mais de uma variável, em particular
se f : Rn → R e J f ( x ) é a matriz jacobiana de f , ou seja a matriz definida por

∂ fi (x)
J f ( x )ij = , i = 1, . . . , m, j = 1, . . . , n,
∂x j

vale
f (y) = f ( x ) + J f ( x )(y − x ) + o (||y − x ||).
Aproximações de ordem mais alta também são possíveis, mas não vamos usá-las em nosso curso.

2 Aproximações de derivadas
Nessa seção consideramos que as funções tem tantas derivadas quanto forem necessárias para a discussão.
Uma primeira aplicação da fórmula de Taylor é a aproximação de derivadas. Muitas vezes o cômputo
de uma derivada pode ser um trabalho muito tedioso de programação, como pode ocorrer quando a função
tenha uma fórmula muito complexa. Um caso extremo é quando a função f não é de fato conhecida (não
há uma fórmula explícita para ela). Isso ocorre por exemplo se a função puder apenas ser avaliada por um
programa de computador do qual não temos acesso ao código fonte ou através algum experimento físico.

2
Em situações assim podemos nos perguntar se é possível calcular aproximações da derivada de f apenas
avaliando a função. A fórmula de Taylor nos dá imediatamente uma opção
f (y) − f ( x )
f ′ (x) ≈ ,
y−x
para y próximo a x. Se denotarmos diferença y − x por ϵ, temos
f ( x + h) − f ( x )
f ′ (x) ≈ ,
h
para h pequeno.
Para vermos que essa fórmula é valida, vamos considerar a fórmula de Taylor com resto de Lagrange.
Sabemos que deve existir z ∈ ( x, x + h) tal que
f ′′ (z) 2
f ( x + ϵ) = f ( x ) + f ′ ( x )h + h .
2
Agora, como f ′′ é contínua (vamos considerar que f é três vezes diferenciável), seu módulo atinge máximo
próximo a x, vamos chamar de L f ′′ esse máximo. Podemos então concluir que

f ( x + h) − f ( x ) f ′′ (z)
f ′ (x) = − h ⇐⇒
h 2
f ( x + h) − f ( x )
f ′ (x) = + δx ,
h
em que |δx | ≤ ( L f ′′ /2)h.
Confirmamos assim que a fórmula para aproximar a derivada que vimos antes é válida e sabemos ainda
mais o erro que pode acontecer, que foi chamado de δx , é aproximadamente ( L f ′′ /2)h, indo para zero tão
rapidamente quanto h.
Um problema dessa fórmula é que ela pode passar a impressão de que quanto menor h melhor será a
aproximação obtida. Porém ao a implementarmos no computador não conseguimos calcular exatamente
f ( x ) ou f ( x + h), ou mesmo a divisão. O máximo que conseguimos calcular é algo que está perto desses va-
lores, no melhor caso com precisão relativa limitada pelo epsilon da máquina (ϵmac ). Ou seja se chamarmos
de f¯ a função que de fato calculamos vamos, no melhor dos casos, obter valores tais que

| f¯( x ) − f ( x )| ≤ ϵmac L f
| f¯( x + h) − f ( x + h)| ≤ ϵmac L f ,
aqui L f denota um limitante superior para os valores de f no intervalo de interesse.
Vamos retomar o tipo de análise que fizemos acima para achar uma expressão para o erro que leve em
consideração os erros gerados pela representação no computador. Já sabemos que não temos os valores
exatos calculados, temos apenas os valores aproximados cujos os erros máximos para os valores exatos
foram estimados acima. Usando essas estimativas vemos que existem γx e γx+h , com valor absoluto menor
ou igual a ϵmac L f , tais que

f ( x ) = f¯( x ) + γx
f ( x + h) = f¯( x + h) + γx+h .
Podemos substituir esses valores na estimativa que tínhamos para erro.

f ( x + h) − f ( x )
f ′ (x) = + δx ,
h
f¯( x ) + γx − f¯( x + h) − γx+h
= + δx
h
f¯( x ) + f¯( x + h) γx − γx+h
= + + δx .
h h

3
A primeira parcela é justamente a aproximação de derivada que conseguimos calcular no computador,
ignorando o erro introduzido pela divisão. Assim o erro entre o que conseguimos calcular e a derivada real
é
γx − γx +h
+ δx .
h
Retomando os limitantes que temos sobre o módulo de cada um dos termos na expressão acima concluímos
que o erro é menor ou igual a
ϵmac L f L f ′′ h
2 + .
h 2
Observe que o primeiro termo dessa expressão, que vem do erro de trabalharmos no computador, na ver-
dade aumenta a medida que h diminui. Já o segundo termo, que vem da expansão de Taylor, diminui
com h. Logo agora já não é claro que devemos tomar h o menor possível. De fato deve haver um h de
compromisso, que minimiza a expressão acima. Usando o que aprendemos em cálculo, que o ponto de
mínimo com respeito a h deve ser um ponto no qual a derivada se anula, vemos que desejamos escolher h
obedecendo a
4L f ϵmac
h2 = .
L f ′′
Ou seja, queremos escolher h de modo que

Lf √
|h| = 2 ϵmac .
L f ′′

Agora fica difícil continuar sem conhecer pelo menos aproximações para os valores L f e L f ′′ . Mas de

qualquer forma a expressão acima já nos ensina que devemos escolher h proporcional a ϵmac . Muitas
vezes o valor final usado é exatamente esse, como no código abaixo.

In [52]: # Calcula uma aproximação de derivada de f no ponto x usando a fórmula de diferença.


function dif(f, x, h=sqrt(eps(1.0)))
return (f(x + h) - f(x)) ./ h
end

# Função para teste e sua derivada.


f(x) = sin(x) + cos(x)
df(x) = cos(x) - sin(x)

# Função simples para calcular o erro relativo entre a aproximação e o valor exata
function erro_rel(aprox, exato)
return abs(aprox - exato) ./ abs(exato)
end

# Teste da aproximação
println("Valor exato da derivada: ", df(1), " - valor da aproximação: ", dif(f, 1))
println("Erro relativo na aproximação: ", erro_rel(dif(f, 1), df(1)))

Valor exato da derivada: -0.30116867893975674 - valor da aproximação: -0.30116869509220123


Erro relativo na aproximação: 5.363255086786758e-8

Nada mal, um erro próximo de 10−8 . Agora vamos ver o que aconteceria se tentássemos usar um h
muito pequeno, como parecia ser melhor antes de fazermos a análise mais sofisticada do erro.

In [53]: # Teste da aproximação


println("Valor exato da derivada: ", df(1), " - valor da aproximação: ", dif(f, 1, 1.0e-14))
println("Erro relativo na aproximação: ", erro_rel(dif(f, 1, 1.0e-14), df(1)))

4
Valor exato da derivada: -0.30116867893975674 - valor da aproximação: -0.2886579864025407
Erro relativo na aproximação: 0.04154048349668716

De fato o erro aumentou e muito. Podemos fazer melhor, podemos testar diferentes valores de h e
apresentar o gráfico dos erros relativos. Note que usamos o negativo do logaritmo na base 10 do erro para
que o gráfico apresente o número de casas decimais corretas em função de h.

In [54]: expoentes = linspace(-1, -15, 15)


h = 10.0.^expoentes
aproxs = dif(f, 1, h)

using PyPlot
plot(expoentes, -log10(erro_rel(aproxs, df(1))))
title("Número de casas corretas em função de h")
axis([-15, -1, 0, 8]);

Como vocês podem ver o número de casa corretas é maximizado em torno de 10− 8. Lembre ainda que
maximizar o número de casas corretas é equivalente a minimizar o erro. Mais importante, o gráfico acima
confirma a análise feita acima que sugere que o o erro começa diminuindo até um certo ponto quando
começa a aumentar.
Mas será que ainda é possível fazer melhor? Ou seja, será que é possível obter uma expressão para o
erro que seja mais precisa do que fórmula de diferença já apresentada?

5
A resposta para isso é afirmativa, a fórmula é conhecida como diferença centrada:

f ( x + h) − f ( x − h)
f ′ (x) ≈ .
2h
O nome vem do fato que a fórmula se baseia em calcular o o valor de f em dois pontos que tem exatamente
o x como centro.
Para analisar o porque essa fórmula é melhor do que a anterior, vamos analisar suas expansões de
Taylor.

f ′′ ( x ) f ′′′ (zh ) 3
f ( x + h) = f ( x ) + f ′ ( x )h + + h ,
2 6
f ′′ ( x ) f ′′′ (z−h ) 3
f ( x − h) = f ( x ) − f ′ ( x )h + − h ,
2 6
em que os números zh ∈ ( x, x + h) e z−h ∈ ( x, x − h). Subtraindo essas expressões e dividindo por 2h
temos
f ( x + h) − f ( x − h) f ′′′ (zh ) + f ′′′ (z−h ) 2
f ′ (x) = + h .
2h 12
Mais uma vez, denotando por L f ′′′ o máximo do valor absoluto de f ′′′ no intervalo [ x − h, x + h], podemos
afirmar que erro agora é limitado por
L f ′′′ 2
h .
6
Note que a fórmula de erro nos ensina o erro da diferença centrada vai para zero muito mais rapidamente
do que o erro da fórmula de diferença original já que a primeira é proporcional a h2 que é muito menor do
h para h pequena. Será que podemos confirmar isso empiricamente?

In [55]: # Calcula uma aproximação de derivada de f no ponto x usando a fórmula de diferença.


function dif_centrada(f, x, h=eps(1.0)^(1/3))
return (f(x + h) - f(x - h)) ./ (2*h)
end

aproxs = dif_centrada(f, 1, h)

using PyPlot
plot(expoentes, -log10(erro_rel(aproxs, df(1))))
title("Número de casas corretas da diferença centrada")
axis([-15, -1, 0, 12]);

6
Como imaginávamos, é possível atingir uma precisão mais alta, com mais de dez casas corretas ao invés
de ficar limitado a oito. Note também que o h ideal para a diferença centrada é menor do que o h ideal
da diferença comum. De fato uma análise cuidadosa semelhante a que fizemos antes diz que o h ideal é

proporcional a 3 ϵmac , que é aproximadamente 6 · 10−6 , como podemos ver abaixo.

In [56]: # h ideal é aproximadamente...


h = eps(1.0)^(1/3)
println("h ideal: ", eps(1.0)^(1/3))
# Teste da aproximação
println("Valor exato da derivada: ", df(1), " - valor da aproximação: ", dif_centrada(f, 1))
println("Erro relativo na aproximação: ", erro_rel(dif_centrada(f, 1), df(1)))

h ideal: 6.055454452393343e-6
Valor exato da derivada: -0.30116867893975674 - valor da aproximação: -0.3011686789343656
Erro relativo na aproximação: 1.790070602380168e-11

Você também pode gostar