Cancelamento catastrófico

Fonte: testwiki
Saltar para a navegação Saltar para a pesquisa
Gráfico de ((1+x)-1)/x calculado em sistema de numeração do tipo 'double'. Idealmente o resultado seria 1, o gráfico mostra o efeito da perda de significância na operação (1+x) quando x é pequeno. Quando x se torna menor que o épsilon de máquina, a expressão se torna nula.

Cancelamento catastrófico (ou perda de significância ou ainda cancelamento subtrativo[1][2]) é um efeito que ocorre em operações envolvendo aritmética de ponto flutuante, sendo caracterizado por um aumento substancial do erro relativo nos resultados destas. O exemplo característico deste tipo de erro é quando há a subtração de dois números muito próximos.

Apresentação do problema geral

Seja x = (a - b) e X = (a - b), onde a = a(1 + Δa) e b = b(1 + Δb), e os valores Δa e Δb tidos como erros relativos de arredondamentos por armazenamento ou computações prévias. A partir dos dados, pode-se chegar a seguinte expressão[3]:

|xXx|=|aΔabΔbab|max(|Δa|,|Δb|)|a|+|b||ab|

Deste modo, o erro relativo é grande quando:

|ab|<<|a|+|b|

e ocorre quando tem-se o cancelamento catastrófico. Assim, só existe um cancelamento catastrófico quando existirem erros nos dados.

Exemplo

Considere os números racionais x e y com dez dígitos:

x=0,3721478693
y=0,3720230572

O resultado exato de sua subtração é dado por:

xy=0,0001248121

Se esta subtração for feita com apenas 5 dígitos na mantissa, os resultados obtidos serão:

f(x)=0,37215
f(y)=0,37202
f(x)f(y)=0,00013

O resultado desta operação de diferença em ponto flutuante é de:

f(x)f(y)=0,00013=0,13000×103

Vemos que mesmo possuindo cinco dígitos, os últimos três dígitos não têm significância alguma. Calculando-se o erro relativo:

|(f(x)f(y))(xy)(xy)|4%

O erro gerado acima possui um valor maior que o esperado.[4] Este tipo de erro é denominado cancelamento catastrófico, e pode ser evitado em várias situações.

Outro exemplo

Seja a função dada por

f(x)=1cosxx2

cuja aproximação de Taylor é dada por:

f(x)=1cosxx2=1216x2+O(x4)

Pelo critério de Leibniz[5] aplicado à série de taylor de f(x) dentro do intervalo -10-7≤ x ≤ 10-7, o valor de f(x) poderia ser aproximado por 0.5 com quatorze dígitos significativos. No entanto, o gráfico do resultado obtido usando uma precisão Double IEEE 754 é:

Cancelamento catastrófico 2
Cancelamento catastrófico 2

Para explicar tal fenômeno, consideremos x=1,1108 e uma precisão de 16 dígitos decimais, tem-se:

  • cosx=0,999999999999999988897769753748434595763683319091796875
Valor de ponto flutuante mais próximo com resposta exata para 16 casas decimais
  • 1cosx=1,11021016
Estimação imprecisa da resposta exata (6,05 . 10 -17)
  • 1cosxx2=0,9175
80% maior que a resposta exata (0,5)

Vemos que os 16 dígitos são insuficientes para aproximar o valor de f(x). A subtração em si é exata, mas produz resultado da ordem do erro de cos(x). Assim, a subtração supervalorizou a importância do erro anterior.

Porém, cabe ressaltar que na realidade o problema não está na subtração em si, mas no arredondamento anterior a ela. Logo, uma alteração na equação pode tornar o cálculo numericamente estável.

Por exemplo, se usarmos a identidade trigonométrica 1-cos(x)=2sen²(x/2) para reescrever f(x) na forma[3]:

f(x)=12(sen(x2)x/2)2

e x=1,1108, chega-se a f(x)=0,5 , que é o resultado que esperaríamos encontrar.

Teorema da perda de precisão[6]

Considere x e y números positivos, normalizados em ponto flutuante com representação binária, com x > y e

qrp
2p1yx2q

Então, no mínimo p e no máximo q dígitos binários são perdidos na subtração de x por y.[7]

Exemplo

Considere a expressão abaixo:

yxsenx

Espera-se que haja uma perda de significância para valores de x muito pequenos. Para solucionar esse problema, usa-se uma fórmula alternativa, escrevendo o seno em forma de série de Taylor:

senx=xx33!+x55!x77!+

Sendo assim, calculamos y por:

xsenx=x33!x55!+x77!+

Tendo valores muito pequenos de x, podemos usar uma série truncada, pois os termos de alta ordem acabam sendo desprezíveis. Usando o teorema da perda de precisão, e estabelecendo que a perda seja de no máximo um bit binário (q=1) na subtração acima, tem-se:

1senxx>21=12

Sendo sen(x) > 0, o valor de x calculado é:

|x|1,9; para q = 1

Por fim, a expressão x - sen(x) só pode ser utilizada para |x| ≥ 1,9. Naturalmente, o pior caso (o maior erro de arredondamento) ocorre em |x| = 1,9. Para outros valores de x, outra configuração deve ser utilizada para continuar evitando a perda de mais de um dígito binário. Todavia, faz-se necessário uma análise de erro de truncamento da série, para que este não seja elevado.

Cancelamento Catastrófico em avaliação de funções matemáticas

Inúmeras funções matemáticas são comumente avaliadas utilizando sub-rotinas específicas, onde pode ocorrer cancelamento catastrófico. Peguemos como exemplo a avaliação da função cosseno com x = 33278,21. Note que x possui 7 dígitos de precisão. O problema que ocorre na avaliação de cos(x) é devido às rotinas empregadas que usualmente utilizam um artifício denominado redução de ordem. Este consiste no uso das identidades trigonométricas:

cos(x+2nπ)=cos(x)
cos(x)=cos(πx)

Onde 0 ≤ x ≤ 2π, para simplificar os cálculos.

Calculando o argumento reduzido para x = 33278,21 utilizando 7 dígitos de precisão:

x=33278,2152962π=2,46

Assim, notamos que o resultado tem apenas 3 algarismos significativos. Ao calcularmos o cosseno:

cos(2,460000)=0,7765703

Este resultado pode fazer-nos concluir erroneamente que o número acima contém sete dígitos significativos. No entanto, temos que no máximo três dígitos são significativos. A rotina empregada no cálculo do cosseno não sabe que o número inicial (2,46) só tinha três dígitos de precisão e por isso calcula como se fosse 2,460000 com todos os algarismos sendo significativos.

Caso das Equações de Segundo Grau

Seja a equação do segundo grau:

ax2+bx+c=0

Para acharmos as raízes deste tipo de equação, utilizamos a fórmula de Bhaskara: x=b±b24ac2a.

Porém, para casos onde b2>>4ac , então b24ac|b|. Assim, ao tentarmos determinar a segunda raiz x2=b+b24ac2a. , tem-se um cancelamento catastrófico, pois f(b24ac) não é exata e a subtração leva a uma supervalorização do erro.

A inexatidão no cálculo da segunda raiz pode ser atenuada se modificarmos a expressão de maneira a evitar a subtração dos dois valores muito próximos. Assim, evitamos o cancelamento catastrófico realizando o cancelamento na própria expressão, antes de realizarmos as operações[3]:

b±b24ac=
=b+|b|14cb2
=b+|b|(12cb2+...)
b+|b|(12cb2)

Sendo b > 0, a segunda raiz pode ser determinada por: b±b24ac2acb

Outra fonte comum de erro é quando b24ac. Neste caso, no entanto, nenhum rearranjo algébrico pode evitar o problema. Uma alternativa para tentar melhorar a resposta é aumentar a precisão da solução.

Veja também

Ligações externas

Predefinição:Referências

  1. Predefinição:Citar livro
  2. Predefinição:Citar livro
  3. 3,0 3,1 3,2 Higham, Nicholas (2002). Accuracy and Stability of Numerical Algorithms (2 ed). SIAM. Cap 1, p. 19
  4. L.A.Sphaier, L.S.B.Alves. Representação de Números, Erros Numéricos e Aritmética Computacional. Disponível em www.sphaier.com
  5. Predefinição:Citar livro
  6. Predefinição:Citar web
  7. D. Kincaid and E. W. Cheney. Numerical Analysis: Mathematics of Scientific Computing. Brooks/Cole Publishing Company, Paci_c Grove, CA, 1990.