Use o botão abaixo para reportar erros ou dar sugestões.

Cálculo Numérico - Versão Python

2.9 Exemplos selecionados de cancelamento catastrófico


Exemplo 2.9.1. Considere o seguinte processo iterativo: x(1) = 1 3 (2.154) x(n+1) = 4x(n) - 1,n = 1, 2, (2.155)

Observe que x(1) = 1 3, x(2) = 4 1 3 - 1 = 1 3, x(3) = 1 3, ou seja, temos uma sequência constante igual a 1 3. No entanto, ao calcularmos no computador, usando o sistema de numeração double, a sequência obtida não é constante e, de fato, diverge. Faça o teste em Python, colocando:

>>> x = 1/3; x

e itere algumas vezes a linha de comando:

>>> x = 4*x-1; x

Para compreender o que acontece, devemos levar em consideração que o número 1 3 = 0,3¯ possui um representação infinita tanto na base decimal quanto na base binária. Logo, sua representação de máquina inclui um erro de arredondamento. Seja ϵ a diferença entre o valor exato de 1 3 e sua representação de máquina, isto é, x̃(1) = 1 3 + ϵ. A sequência efetivamente calculada no computador é: x̃(1) = 1 3 + ϵ (2.156) x̃(2) = 4x(1) - 1 = 4 1 3 + ϵ - 1 = 1 3 + 4ϵ (2.157) x̃(3) = 4x(2) - 1 = 4 1 3 + 4ϵ - 1 = 1 3 + 42ϵ (2.158) (2.159) x̃(n) = 1 3 + 4(n-1)ϵ (2.160)

Portanto o limite da sequência diverge,

lim x|x̃(n)| = (2.161)

Qual o número de condicionamento desse problema?

Exemplo 2.9.2. Observe a seguinte identidade

f(x) = (1 + x) - 1 x = 1 (2.162)

Calcule o valor da expressão à esquerda para x = 10-12, x = 10-13, x = 10-14, x = 10-15, x = 10-16 e x = 10-17. Observe que quando x se aproxima do ϵ de máquina a expressão perde o significado. Veja a Figura 2.1 com o gráfico de f(x) em escala logarítmica.


PIC

Figura 2.1: Gráfico na função do Exemplo 2.9.2.



PIC

Figura 2.2: Gráfico de 1 + 1 n n em função de n em escala linear-logarítmica variando de 100 até 1018. Veja o Exemplo 2.9.3.


Exemplo 2.9.3. Neste exemplo, estamos interessados em compreender mais detalhadamente o comportamento da expressão

1 + 1 nn (2.163)

quando n é um número grande ao computá-la em sistemas de numeral de ponto flutuante com acurácia finita. Um resultado bem conhecido do cálculo nos diz que o limite de (2.163) quando n tende a infinito é o número de Euler:

lim n 1 + 1 nn = e = 2,718281828459... (2.164)

Sabemos também que a sequência produzida por (2.163) é crescente, isto é:

1 + 1 1 1 < 1 + 1 2 2 < 1 + 1 3 3 < (2.165)

No entanto, quando calculamos essa expressão no Python, nos defrontamos com o seguinte resultado:






n 1 + 1 n n n 1 + 1 n n





1 2,0000000000000 102 2,7048138294215
2 2,2500000000000 104 2,7181459268249
3 2,3703703703704 106 2,7182804690957
4 2,4414062500000 108 2,7182817983391
5 2,4883200000000 1010 2,7182820532348
6 2,5216263717421 1012 2,7185234960372
7 2,5464996970407 1014 2,7161100340870
8 2,5657845139503 1016 1,0000000000000
9 2,5811747917132 1018 1,0000000000000
10 2,5937424601000 1020 1,0000000000000





Podemos resumir esses dados no gráfico de 1 + 1 n n em função de n, veja a Figura 2.9.

Observe que quando n se torna grande, da ordem de 1015, o gráfico da função deixa de ser crescente e apresenta oscilações. Observe também que a expressão se torna identicamente igual a 1 depois de um certo limiar. Tais fenômenos não são intrínsecos da função f(n) = (1 + 1n)n, mas oriundas de erros de arredondamento, isto é, são resultados numéricos espúrios. A fim de pôr o comportamento numérico de tal expressão, apresentamos abaixo o gráfico da mesma função, porém restrito à região entre 1014 e 1016.

Para compreendermos melhor por que existe um limiar N que, quando atingido torna a expressão do exemplo acima identicamente igual a 1, observamos a sequência de operações realizadas pelo computador:

n 1n 1 + 1n (1 + 1n)n (2.166)

Devido ao limite de precisão da representação de números em ponto flutuante, existe um menor número representável que é maior do que 1. Este número é 1+eps, onde eps é chamado de épsilon de máquina e é o menor número que somado a 1 produz um resultado superior a 1 no sistema de numeração usado. O épsilon de máquina no sistema de numeração double vale aproximadamente 2,22 × 10-16. Em Python podemos obter o épsilon de máquina com o seguinte comando numpy:

>>> eps = np.finfo(float).eps  
>>> print(eps)  
2.22044604925e-16  
>>> 1+eps == 1  
False  
>>> 1+eps  
1.0000000000000002

Quando somamos a 1 um número positivo inferior ao épsilon de máquina, obtemos o número 1. Dessa forma, o resultado obtido pela operação de ponto flutuante 1 + n para 0 < n < 2,22 × 10-16 é 1.

Portanto, quando realizamos a sequência de operações dada em (2.166), toda informação contida no número n é perdida na soma com 1 quando 1n é menor que o épsilon de máquina, o que ocorre quando n > 5 × 1015. Assim, (1 + 1n) é aproximado para 1 e a última operação se resume a 1n, o que é igual a 1 mesmo quando n é grande.

Um erro comum é acreditar que o perda de significância se deve ao fato de 1n ser muito pequeno para ser representado e é aproximando para 0. Isto é falso, o sistema de ponto de flutuante permite representar números de magnitude muito inferior ao épsilon de máquina. O problema surge da limitação no tamanho da mantissa. Observe como a seguinte sequência de operações não perde significância para números positivos x muito menores que o épsilon de máquina:

n 1n 1(1n) (2.167)

compare o desempenho numérico desta sequência de operações para valores pequenos de n com o da seguinte sequência:

n 1 + n (1 + n) - 1. (2.168)

Finalmente, notamos que quando tentamos calcular 1 + 1 n n para n grande, existe perda de significância no cálculo de 1 + 1n. Para entendermos isso melhor, vejamos o que acontece no Python quando n = 7 × 1013:

>>> n=7e13; print("%1.15e" % n)  
7.000000000000000e+13  
>>> n=7e13; print("%1.20e" % n)  
7.00000000000000000000e+13  
>>> print("%1.20e" % (1/n))  
1.42857142857142843451e-14  
>>> y=1+1/n; print("%1.20e" % y)  
1.00000000000001421085e+00

Observe a perda de informação ao deslocar a mantissa de 1n. Para evidenciar o fenômenos, observamos o que acontece quando tentamos recalcular n subtraindo 1 de 1 + 1n e invertendo o resultado:

>>> print("%1.20e" % (y-1))  
1.42108547152020037174e-14  
>>> print("%1.20e" % (1/(y-1)))  
7.03687441776640000000e+13

Exemplo 2.9.4 (Analogia da balança). Observe a seguinte comparação interessante que pode ser feita para ilustrar os sistemas de numeração com ponto fixo e flutuante: o sistema de ponto fixo é como uma balança cujas marcas estão igualmente espaçadas; o sistema de ponto flutuante é como uma balança cuja distância entre as marcas é proporcional à massa medida. Assim, podemos ter uma balança de ponto fixo cujas marcas estão sempre distanciadas de 100g (100g, 200g, 300g, ..., 1Kg, 1,1Kg,...) e outra balança de ponto flutuante cujas marcas estão distanciadas sempre de aproximadamente um décimo do valor lido (100g, 110g, 121g, 133g, ..., 1Kg, 1,1Kg, 1,21Kg, ...) A balança de ponto fixo apresenta uma resolução baixa para pequenas medidas, porém uma resolução alta para grandes medidas. A balança de ponto flutuante distribui a resolução de forma proporcional ao longo da escala.

Seguindo nesta analogia, o fenômeno de perda de significância pode ser interpretado como a seguir: imagine que você deseje obter o peso de um gato (aproximadamente 4Kg). Dois processos estão disponíveis: colocar o gato diretamente na balança ou medir seu peso com o gato e, depois, sem o gato. Na balança de ponto flutuante, a incerteza associada à medida do peso do gato (sozinho) é aproximadamente 10% de 4Kg, isto é, 400g. Já a incerteza associada à medida da uma pessoa (aproximadamente 70Kg) com o gato é de 10% do peso total, isto é, aproximadamente 7Kg. Esta incerteza é da mesma ordem de grandeza da medida a ser realizada, tornado o processo impossível de ser realizado, já que teríamos uma incerteza da ordem de 14Kg (devido à dupla medição) sobre uma grandeza de 4Kg.

Exercícios resolvidos


ER 2.9.1. Deseja-se medir a concentração de dois diferentes oxidantes no ar. Três sensores eletroquímicos estão disponíveis para a medida e apresentam a seguintes respostas:

v1 = 270[A] + 30[B],v2 = 140[A] + 20[B]ev3 = 15[A] + 200[B] (2.169)

as tensões v1, v2 e v3 são dadas em mV e as concentrações em milimoll.

a)
Encontre uma expressão para os valores de [A] e [B] em termos de v1 e v2 e, depois, em termos de v1 e v3. Dica: Se adbc, então a matriz A dada por
A = a b c d (2.170)

é inversível e sua inversa é dada por

A-1 = 1 ad - bc d - b - c a . (2.171)
b)
Sabendo que incerteza relativa associada às sensibilidades dos sensores 1 e 2 é de 2% e que a incerteza relativa associada às sensibilidades do sensor 3 é 10%, verifique a incerteza associada à medida feita com o par 1 - 2 e o par 1 - 3. Use [A] = [B] = 10milimoll. Dica: Você deve diferenciar as grandezas [A] e [B] em relação aos valores das tensões.

Solução. Em ambos casos, temos a seguinte estrutura:
S11 S12 S21 S22 A B = v1 v2 (2.172)

De forma que

A B = S11 S12 S21 S22 -1 v1 v2 = 1 S11S22 - S12S21 S22 -S12 -S21 S11 v1 v2 (2.173)

Portanto [A] = S22v1 - S12v2 S11S22 - S12S21 (2.174) B = - S21v1 + S11v2 S11S22 - S12S21 (2.175)

Usando derivação logarítmica, temos 1 [A] [A] S11 = - S22 S11S22 - S12S21 (2.176) 1 [A] [A] S12 = - v2 S22v1 - S12v2 + S21 S11S22 - S12S21 = -[A] B S22 S11S22 - S12S21 (2.177) 1 [A] [A] S21 = S12 S11S22 - S12S21 (2.178) 1 [A] [A] S22 = v1 S22v1 - S12v2 - S11 S11S22 - S12S21 = [A] B S12 S11S22 - S12S21 (2.179)

e 1 B B S11 = v2 - S21v1 + S11v2 - S22 S11S22 - S12S21 = B [A] S21 S11S22 - S12S21 (2.180) 1 B B S12 = S21 S11S22 - S12S21 (2.181) 1 B B S21 = - v1 - S21v1 + S11v2 + S21 S11S22 - S12S21 = -B [A] S11 S11S22 - S12S21 (2.182) 1 B B S22 = - S11 S11S22 - S12S21 (2.183) (2.184)

E o erro associado às medidas pode ser aproximado por 1 [A]δ[A] = 1 [A] [A] S11 δS11 + 1 [A] [A] S12 δS12 + 1 [A] [A] S21 δS21 + 1 [A] [A] S22 δS22 (2.185) = 1 det S S22δS11 + [A] BS22δS12 + S12δS21 + [A] BS12δS22 (2.186)

Analogamente, temos: 1 [B]δ[B] = 1 det S [B] AS21δS11 + S21δS11 + B [A]S11δS21 + S11δS22 (2.187)

onde não se indicou |Sij| nem |[.]| pois são todos positivos.

Fazemos agora a aplicação numérica:
Caso do par 1-2:

det S = 270 30 140 20 = 1200 (2.188)
1 [A]δ[A] = 1 1200 20 × 270 × 2% + 20 × 30 × 2% + 30 × 140 × 2% + 30 × 20 × 2% (2.189) = 216 1200 = 0.18 = 18% (2.190) 1 [B]δ[B] = 1 1200 140 × 270 × 2% + 140 × 30 × 2% + 270 × 140 × 2% + 270 × 20 × 2% (2.191) = 426 1200 = 0.355 = 35.5% (2.192)

Caso do par 1-3:

det S = 270 30 15 200 = 53550 (2.193)
1 [A]δ[A] = 1 53550 200 × 270 × 2% + 200 × 30 × 2% + 30 × 15 × 10% + 30 × 200 × 10% (2.194) = 1804,6 52550 0.0337 = 3.37% (2.195) 1 [B]δ[B] = 1 53550 15 × 270 × 2% + 15 × 30 × 2% + 270 × 15 × 10% + 270 × 200 × 10% (2.196) = 5895 53550 0.11 = 11% (2.197)

Conclusão, apesar de o sensor 3 apresentar uma incerteza cinco vezes maior na sensibilidade, a escolha do sensor 3 para fazer par ao sensor 1 parece mais adequada.

Exercícios


E 2.9.1. Considere as expressões:

exp(1μ) 1 + exp(1μ) (2.198)

e

1 exp(-1μ) + 1 (2.199)

com μ > 0. Verifique que elas são idênticas como funções reais. Teste no computador cada uma delas para μ = 0,1, μ = 0,01 e μ = 0,001. Qual dessas expressões é mais adequada quando μ é um número pequeno? Por quê?

Resposta. Quando μ é pequeno, e1μ é um número grande. A primeira expressão produz um ”overflow” (número maior que o máximo representável) quando μ é pequeno. A segunda expressão, no entanto, reproduz o limite 1 quando μ 0+.

E 2.9.2. Encontre expressões alternativas para calcular o valor das seguintes funções quando x é próximo de zero.

a)
f(x) = 1-cos(x) x2
b)
g(x) = 1 + x - 1
c)
h(x) = x + 106 - 103
d)
i(x) = 1 + ex -2        Dica: Faça y = ex - 1

Resposta. a) 1 2 + x2 4! + O(x4); b) x2 + O(x2); c) 5 10-4x + O(x2); d) 2 4 y + O(y2) = 2 4 x + O(x2)

E 2.9.3. Use uma identidade trigonométrica adequada para mostrar que:

1 - cos(x) x2 = 1 2 sen (x2) x2 2. (2.200)

Analise o desempenho destas duas expressões no computador quando x vale 10-5, 10-6, 10-7, 10-8, 10-9, 10-200 e 0. Discuta o resultado. Dica: Para |x| < 10-5, f(x) pode ser aproximada por 12 - x224 com erro de truncamento inferior a 10-22.

Resposta. A expressão da direita se comporta melhor devido à retirada do cancelamento catastrófico em x em torno de 0.

E 2.9.4. Reescreva as expressões:

e2x + 1 - exee2x + x2 - ex (2.201)

de modo que seja possível calcular seus valores para x = 100 utilizando a aritmética de ponto flutuante ("Double") no computador.

Resposta. Possíveis soluções são: e2x + 1 - ex = e2x + 1 - ex e2x + 1 + ex e2x + 1 + ex (2.202) = e2x + 1 - e2x e2x + 1 + ex = 1 e2x + 1 + ex (2.203)

e, de forma análoga: e2x + x2 - ex = x2 e2x + x2 + ex. (2.204)

E 2.9.5. Na teoria da relatividade restrita, a energia cinética de uma partícula e sua velocidade se relacionam pela seguinte fórmula:

E = mc2 1 1 - (vc)2 - 1 , (2.205)

onde E é a energia cinética da partícula, m é a massa de repouso, v o módulo da velocidade e c a velocidade da luz no vácuo dada por c = 299792458ms. Considere que a massa de repouso m = 9,10938291 × 10-31Kg do elétron seja conhecida com erro relativo de 10-9. Qual é o valor da energia e o erro relativo associado a essa grandeza quando v = 0,1c, v = 0,5c, v = 0,99c e v = 0,999c sendo que a incerteza relativa na medida da velocidade é 10-5?

Resposta. 4,12451228 × 10-16 J; 0,002%; 0,26654956 × 10-14 J; 0,002%; 4,98497440 × 10-13 J; 0,057%; 1,74927914 × 10-12 J; 0,522%.

Creative Commons License Este texto é disponibilizado nos termos da licença Creative Commons Atribuição-CompartilhaIgual 3.0 Não Adaptada (CC-BY-SA 3.0). Página gerada em 15/5/2019 às 15:24:50.

Informe erros ou edite você mesmo!