Cálculo de
: o objetivo é calcular
pela série de Taylor até ordem
em torno de zero:
(a) Escreva um programa para rodar no MatLab para obter a aproximação para
de acordo com a expressão (1). O valor de
e o número de termos da serie,
, são dados de entrada deste programa.
Observe que o cálculo do fatorial:
, necessário na série de Taylor, pode ser feito de modo a evitar o ocorrência de overflow. É facil evitar o overflow, desde que se observe que o termo (
) pode ser escrito como:
, onde o termo
! já está calculado, pois a série está sendo avaliada a partir do primeiro termo. (Um erro comum no uso da fórmula de Taylor para o cáalculo de
é escrever “procedimentos” para avaliar o fatorial: o valor de
é uma dado de entrada e a saída é
. Nestes casos, há ocorrência de overflow).
Evitando o overflow a série de Taylor pode ser calculada com tantos termos quanto se queira. Qual seria um critério de parada para se interromper o cálculo da série, que não seja a comparação com o valor real de
?
(b) Teste seu programa com vários valores para
: positivos, negativos, (
e
distante de zero) e, para cada valor de
, teste o cálculo da série com vários valores para o número de termos:
. Analise os resultados obtidos.
Observe que o cálculo do fatorial:
Evitando o overflow a série de Taylor pode ser calculada com tantos termos quanto se queira. Qual seria um critério de parada para se interromper o cálculo da série, que não seja a comparação com o valor real de
(b) Teste seu programa com vários valores para
Passo 1
O enunciado pede um programa em MatLab que aproxime
pela série de Taylor em torno de zero
devendo evitar overflow no cálculo de
usando a relação recursiva
Também se pede um critério de parada que não use o valor exato de
e, em seguida, testar para vários
(positivos, negativos, próximos e distantes de zero) e vários valores de
, analisando o comportamento do erro.
Passo 2
Vamos escrever duas versões do programa. A primeira recebe
e
fixos; a segunda implementa um critério de tolerância interna.
Versão simples (
):
function s = exp\_taylor(x,n)
s = 1; % soma parcial, termo k=0
term = 1; % termo anterior, \(x^0/0! = 1\)
for k = 1 : n
term = term * x / k; % recursão: \(x^k/k! = (x^{k-1}/(k-1)!)*(x/k)\)
s = s + term;
end
end
Versão com critério de tolerância (
):
function [s,k] = exp\_taylor\_tol(x,tol,maxn)
s = 1;
term = 1;
k = 1;
while k <= maxn && abs(term) > tol
term = term * x / k;
s = s + term;
k = k + 1;
end
end
Passo 3
Um critério de parada que dispensa o valor exato de
é usar a magnitude do último termo adicionado. Por exemplo, escolher uma tolerância
e interromper quando
Isso garante que todos os termos remanescentes têm contribuição menor que
. Em prática, define-se
(ou outra precisão desejada) e um teto
para evitar laços infinitos.
Passo 4
Testes
Escolhemos e
. Para cada
calculamos em duas versões: fixando
em
e usando o critério de tolerância. Comparámos com
Escolhemos
exp(x)
do MatLab para obter o erro absoluto. Exemplos de resultados:x
n : erro
n : erro
n
n
x
n : erro
n : erro
n : erro
n
n
n
x
n : erro
n : erro
n : erro
n
n
n
x
-
n : erro
n : erro
n
n
x
n : erro
n : erro
n
n
Usando o critério
, o número de iterações
ficou sempre próximo de
mais alguns termos adicionais.
Passo 5
Análise dos resultados
Para valores pequenos de (por ex.
ou
) bastam poucas iterações para atingir alta precisão. À medida que
cresce, o número de termos necessários cresce aproximadamente até que
, pois a razão entre termos sucessivos é
, que só fica abaixo de
quando
. Para
negativo observa-se comportamento semelhante em função de
, mas como a série alterna em sinal o erro absoluto decresce um pouco mais rápido nos primeiros termos.
O critério de tolerância mostra-se eficaz para interromper a soma assim que o acréscimo deixa de ser relevante, sem necessidade de conhecer de antemão.
Para valores pequenos de
O critério de tolerância mostra-se eficaz para interromper a soma assim que o acréscimo deixa de ser relevante, sem necessidade de conhecer
Resposta
(a) Programa em MatLab
function [s,k] \(= exp_taylor_tol\)(x,tol,maxn)
s \(=1\); % soma parcial, termo k\(=0\)
term \(=1\); % \(x^0\)/\(0\)!
k \(=1\);
while k <\(=\) maxn && abs(term) > tol
term \(=\) term * x / k;
s \(=\) s \(+\) term;
k \(=\) k \(+1\);
end
end
Critério de parada sugerido:
(b) Testes mostram que o erro absoluto decresce rapidamente com
e que o número de termos necessários cresce aproximadamente com
. Para
bastam poucas iterações; para
grande há necessidade de mais termos, sempre obedecendo o critério de tolerância para garantia de precisão.