1. Seja
f(x)=\sqrt{x^{2}+2}-\sqrt{x^{2}+1}
Descreve o algoritmo para calcular valor da função f(x) utilizando um sistema de ponto flutuante, tal que o erro relativo do resultado será da ordem do erro da representação.

Passo 1

O enunciado dá a função
f(x)=\sqrt{x^{2}+2}-\sqrt{x^{2}+1}
e pede: descrever um algoritmo para calcular f(x) num sistema de ponto flutuante de forma que o erro relativo do resultado seja da ordem do erro da representação (ou seja, da ordem do unit roundoff \,u).
Informações relevantes do enunciado: a função é dada para todo x\in\mathbb{R}; não foi imposta nenhuma restrição adicional sobre x. O objetivo é obter uma fórmula/algoritmo numericamente estável (pequeno erro relativo).

Passo 2

Por que o método direto pode ser ruim (no bom e velho português): calcular diretamente
\sqrt{x^{2}+2}\quad\text{e}\quad\sqrt{x^{2}+1}
e depois fazer a subtração pode causar cancelamento catastrófico quando |x| é grande. Vou explicar isso devagar.
O que é cancelamento: se dois números grandes e muito próximos são subtraídos, a diferença é pequena e muitas casas significativas se perdem devido ao arredondamento do ponto flutuante. Por exemplo, se a e b são representados com erro relativo da ordem de u e a\approx b, então a-b pode ter erro absoluto da ordem de u\cdot a, enquanto o valor exato de a-b poderia ser muito menor — isto faz o erro relativo explodir.
Aplicando ao nosso caso: para |x| grande temos
\sqrt{x^{2}+2}\approx |x|+\frac{1}{|x|},\qquad \sqrt{x^{2}+1}\approx |x|+\frac{1}{2|x|},
então a diferença é da ordem de 1/|x|. Subtrair dois termos da ordem de |x| para obter 1/|x| é exatamente o cenário de cancelamento.

Passo 3

A identidade algébrica que salva o dia (e que você deve decorar para fins de prova): multiplicar e dividir pela soma (conjugado) elimina a subtração problemática. Faço o passo a passo:
Começo com
f(x)=\sqrt{x^{2}+2}-\sqrt{x^{2}+1}.
Multiplico numerador e denominador pela soma:
f(x)=\frac{\big(\sqrt{x^{2}+2}-\sqrt{x^{2}+1}\big)\big(\sqrt{x^{2}+2}+\sqrt{x^{2}+1}\big)}{\sqrt{x^{2}+2}+\sqrt{x^{2}+1}}.
No numerador fica a diferença de quadrados:
\big(\sqrt{x^{2}+2}\big)^{2}-\big(\sqrt{x^{2}+1}\big)^{2}=(x^{2}+2)-(x^{2}+1)=1.
Portanto obtemos a identidade exata
f(x)=\frac{1}{\sqrt{x^{2}+2}+\sqrt{x^{2}+1}}.
Essa forma não envolve subtração entre dois grandes termos; ao contrário, a resposta é o inverso de uma soma de termos do mesmo sinal — muito melhor numericamente.

Passo 4

Como calcular \sqrt{x^{2}+c} de forma robusta num sistema de ponto flutuante?
Problema secundário: calcular x^{2} pode causar overflow se |x| for muito grande. Duas opções práticas e seguras:
  1. Usar a rotina padrão e confiável de bibliotecas chamada \mathrm{hypot}. A função
\mathrm{hypot}(a,b)=\sqrt{a^{2}+b^{2}}
é implementada nas boas bibliotecas de forma a evitar overflow/underflow por escalamento interno. Assim podemos obter
\sqrt{x^{2}+2}=\mathrm{hypot}\big(x,\sqrt{2}\big),\qquad \sqrt{x^{2}+1}=\mathrm{hypot}\big(x,1\big).
  1. Se \mathrm{hypot} não estiver disponível, usar escalamento com |x|. Defina t=|x|. Se t=0 trate como caso especial (veja abaixo). Se t>0, escreva
\sqrt{x^{2}+1}=t\sqrt{1+\frac{1}{t^{2}}},\qquad \sqrt{x^{2}+2}=t\sqrt{1+\frac{2}{t^{2}}}.
Como \frac{1}{t^{2}} e \frac{2}{t^{2}} são números pequenos quando t é grande, a expressão \sqrt{1+\cdot} é bem condicionada e não sofre overflow no cálculo do quadrado de x. Note que multiplicar por t não resolve overflow se t em si já é do tamanho do overflow máximo; aí a melhor escolha é usar \mathrm{hypot} ou algum outro escalamento global (dividir por potências de 2 e depois restaurar). Para a maioria dos casos práticos, a fórmula com t\sqrt{1+\cdot} é suficiente e evita cancelamento.
Caso especial: se t=0 (ou |x| muito pequeno), a identidade também funciona; especificamente se x=0 a forma reduz a
f(0)=\frac{1}{\sqrt{2}+1}=\sqrt{2}-1,
mas não há problema em calcular diretamente \sqrt{2}-1.

Passo 5

Algoritmo prático e simples (prefira este se \mathrm{hypot} estiver disponível):
  1. Calcule t=\lvert x\rvert. (Usar \lvert\cdot\rvert evita tratar sinais.)
  2. Calcule
A=\mathrm{hypot}\big(t,\sqrt{2}\big)\quad\text{(ou }\sqrt{t^{2}+2}\text{ com \(\mathrm{hypot}\))},
B=\mathrm{hypot}\big(t,1\big)\quad\text{(ou }\sqrt{t^{2}+1}\text{ com \(\mathrm{hypot}\))}.
  1. Retorne
\hat f=\frac{1}{A+B}.
Se \mathrm{hypot} não estiver disponível, use este raminho alternativo seguro:
  1. Calcule t=\lvert x\rvert.
  2. Se t=0 retorne \hat f=\sqrt{2}-1.
  3. Caso contrário calcule
s_1=\sqrt{1+\frac{1}{t^{2}}},\qquad s_2=\sqrt{1+\frac{2}{t^{2}}}.
  1. Defina
A=t\,s_2,\qquad B=t\,s_1.
  1. Retorne
\hat f=\frac{1}{A+B}.
Esses passos evitam a subtração de números quase iguais e, salvo problemas extremos de overflow de t em si, produzem resultado com pequeno erro relativo.

Passo 6

Análise do erro (explicada devagar e sem formalismo pesado):
  • Suponha que a raiz quadrada/hypot retorna um valor com erro relativo da ordem de u (unidade de arredondamento). Então os valores calculados \hat A e \hat B satisfazem
\hat A = A(1+\delta_A),\qquad \hat B = B(1+\delta_B),
com |\delta_A|,|\delta_B|=\mathcal{O}(u).
  • A soma \hat S=\hat A+\hat B difere de S=A+B por um termo relativo também na ordem de u: \hat S = S(1+\delta_S) com |\delta_S|=\mathcal{O}(u) (a soma pode introduzir um pequeno erro absoluto, mas proporcional a S).
  • Ao tirar o inverso numericamente, o erro relativo adicional também é da ordem de u. Em resumo o processo inteira (duas raízes/hypot, soma, inverso) acumula erros que permanecem \mathcal{O}(u). Não ocorre cancelamento catastrófico porque não fizemos subtração entre dois grandes e quase iguais.
Conclusão da análise: o valor retornado \hat f satisfaz
\frac{\hat f - f}{f} = \mathcal{O}(u),
ou seja, o erro relativo do resultado é da ordem do erro da representação.

Passo 7

Exemplo numérico ilustrativo (para sentir a diferença):
Considere x=10^{8} (só para ver o estrago). Pela identidade:
f(x)=\frac{1}{\sqrt{x^{2}+2}+\sqrt{x^{2}+1}}\approx\frac{1}{2\cdot 10^{8}}=5\times 10^{-9}.
Se você fizer as raízes e subtrair diretamente com precisão de máquina típica ( u\approx 10^{-16}), o arredondamento nas duas raízes (cada uma da ordem de 10^{8}) pode destruir várias casas da diferença e produzir um resultado com erro relativo muito grande. O algoritmo com \mathrm{hypot} ou com o escalamento acima devolve um valor com erro relativo \mathcal{O}(u), isto é, uma boa aproximação de 5\times 10^{-9}.

Passo 8

Resumo prático e recomendações para prova/implementação:
  • Memorize a fatoração/conjugado que leva a
f(x)=\frac{1}{\sqrt{x^{2}+2}+\sqrt{x^{2}+1}}.
  • Na implementação, use \mathrm{hypot} para calcular \sqrt{x^{2}+c} sem overflow/underflow. Se não houver \mathrm{hypot}, implemente o escalamento por t=\lvert x\rvert e calcule t\sqrt{1+c/t^{2}}.
  • Trate t=0 como caso trivial (ou a identidade já funciona).
  • Com esses cuidados o erro relativo final fica na ordem de u.

Resposta

Algoritmo recomendado: calcular t=\lvert x\rvert; calcular A=\mathrm{hypot}(t,\sqrt{2}) e B=\mathrm{hypot}(t,1); devolver \displaystyle \hat f=\frac{1}{A+B}.
Se \mathrm{hypot} não existir: se t=0 devolver \sqrt{2}-1, senão calcular s_{1}=\sqrt{1+1/t^{2}}, s_{2}=\sqrt{1+2/t^{2}}, A=t\,s_{2}, B=t\,s_{1} e devolver \displaystyle \hat f=\frac{1}{A+B}.

Exercícios relacionados