Notas de Cálculo Numérico Túlio Carvalho 6 de novembro de 2002 2 Cálculo Numérico Capítulo 1 Elementos sobre erros numéricos Neste primeiro capítulo, vamos falar de uma limitação importante do cálculo numérico. Veremos que qualquer informação quantitativa, e portanto representada por números, tem uma precisão limitada. Esta preocupação com os erros numéricos não deve entretanto ser exagerada a ponto de duvidarmos da resposta que uma tarefa realizada no computador pode dar. No m, saberemos como domar estes erros de modo a não comprometer a informação. Existem basicamente três fontes de erro no cálculo numérico. A primeira está na própria medida que fazemos da quantidade de interesse. Por exemplo, a régua escolar é um instrumento de medida de comprimentos que tem uma precisão de 0.5 milímetro e suas medidas não são exatas. O resultado de uma medição tem este erro (de 0.5mm), para mais ou para menos. E imaginando que este é um dado de entrada num programa de computador, também os dados de saída terão erro, que normalmente serão maiores que este (precisamente o erro relativo, que deniremos adiante, será maior ou igual ao erro de entrada). Temos ainda, estritamente no uso do computador, os erros gerados na conversão de números entre bases e nas operações aritméticas. Vamos ilustrar como estes últimos podem ocorrer. 1.1 Conversão de bases Representamos um número inteiro na base decimal através de uma seqüência de algarismos (e um sinal): 12346 e podemos lê-lo como 12346 = 6 × 100 + 4 × 101 + 3 × 102 + 2 × 103 + 1 × 104 , que é a soma de um número nito de termos, todos múltiplos de alguma potência (positiva) de 10. Os algarismos usados vão de 0 a 9. 3 4 Cálculo Numérico Generalizando, temos que um número na base b > 1 é representado por uma seqüência de algarismos de 0 a b − 1 que se traduzem como a soma de termos, todos múltiplos de alguma potência de b: an . . . a1 a0 = a0 × b0 + a1 × b1 + · · · + an × bn . Exemplos: Na base 3, 122 = 2 × 30 + 2 × 31 + 1 × 32 . Na base 2, 11 = 1 × 20 + 1 × 21 . Precisamos portanto de uma maneira de converter números entre as bases, pois com os algarismos queremos representar sempre a mesma idéia de número ou quantidade. Vamos denotar por (x)b o número x na base b. E vamos usar a base 10 como referência para nossos cálculos. Dado um número na base 10, como passá-lo para base b? Vejamos dois exemplos iniciais com inteiros (17)10 = 2 × 30 + 2 × 31 + 1 × 32 = (122)3 Como conseguir os algarismos 122 dado o número 17 na base 10? Observe a expressão entre os dois sinais de igualdade acima. Vemos que o resto da divisão de 17 por 3 é 2, o primeiro algarismo. A parte inteira da fração 17 3 é 5 e o resto é 2. Agora tome o novo dividendo como 5, o quociente da razão anterior. Temos 5 = 1 × 3 + 2, resto 2 é o algarismo que multiplica a potência seguinte 31 . O novo dividendo é 1 que, sendo menor que 3, já é o algarismo nal: 2 × 30 + 2 × 31 + 1 × 32 = (122)3 . Atenção e cuidado com a inversão dos coecientes/algarismos para formar o número na última igualdade! Deve estar claro que, no parágrafo anterior, podemos substituir os números ou mesmo as bases por outros, e continuaremos com um processo nito. Este processo é o algoritmo de conversão de inteiros. Algoritmo é uma seqüência de instruções que pode ser programada. Acima pode-se abstrair o algoritmo da situação descrita. O fundamento do algoritmo de conversão é o assim chamado algoritmo de divisão de Euclides. Exercícios 1. 2. 3. 4. 5. Escreva o algoritmo da conversão de inteiros da base 10 para base 2. Obtenha o número (17)10 na base 2, isto é, em binário. Faça o mesmo para os seguintes números: 18, 19, 30, 31. Escreva o algoritmo da conversão de inteiros da base 10 para base b > 1, b inteiro. Escreva o algoritmo de conversão de inteiros entre duas bases quaisquer. Vamos agora considerar o problema de conversão de um número real qualquer entre bases. Veja que um número qualquer na base b é dado por an · · · a1 a0 . a−1 a−2 · · · Cada ai é um algarismo. Por exemplo 1 1 = (0.333 . . .)10 , = (0.5)10 3 10 2 10 Como cada número é a soma de sua parte inteira e sua parte fracionária, e a parte inteira já foi analisada, vamos olhar apenas a parte fracionária, depois do ponto decimal, pois a parte inteira já foi analisada acima. Túlio Carvalho 5 Veja que para escrever 1/3 na base 10 precisamos de um número innito de algarismos, enquanto que para representar 1/2 na base dois só precisamos de um número nito. Aliás (1/2)2 = 1 × 2−1 = (0.1)2 . É aqui que entra o problema do computador, que só pode `guardar' na sua memória uma quantidade nita de algarismos. O armazenamento de um número no computador, através de sua representação binária, possui sempre o mesmo número de dígitos, que depende do equipamento, mas é sempre nito. Esta é uma fonte de erros, porque nem sempre a representação binária de um número é nita. O interessante e diferente agora é que, mesmo que um número tenha representação nita na base 10, ele não tem necessariamente uma representação nita na base 2. Vejamos como se converte um número fracionário da base 10 para a base 2: (0.25)10 = 1 = 1 × 2−2 = (0.01)2 22 A primeira igualdade é que precisamos generalizar. A idéia é usar que todo número entre 0 e 1 pode ser escrito como a soma da série de potências a−1 a−2 a−n + 2 + ··· + n + ··· 2 2 2 com ai ∈ {0, 1}, e partir desta série absolutamente convergente para obter o algoritmo que determina a seqüência de algarismos a−1 , a−2 , a−3 , · · · . O fato de podermos escrever qualquer número x ∈ [0, 1) nesta forma pode ser justicado usando a teoria de séries. Pegue x ∈ (0, 1), como descobrir a−1 ? Multiplicando x por 2, temos 2x = a−1 + a−2 + ··· 2 e tomando a parte inteira dos dois lados: a−1 = [2x]. Como 2x < 2, a−1 é 0 ou 1. Para saber a−2 , def tomamos a parte fracionária de ambos os lados: y = {2x} = 2x − a−1 . Este número é sempre menor que 1. a−2 é a parte inteira de 2y . Este processo continua indenidamente, ou até que y seja zero. Vejamos um exemplo. x = (0.2)10 . 2x = 0.4 < 1, logo a−1 = 0. Faça y = 2x − a−1 = 0.4. Atribua y a x: x := y 1 . Recomeçamos. 2x = 0.8 < 1, logo a−2 = 0, y = 0.8 e x := y . (3) (4) (5) x = 0.8, 2x = 1.6, a−3 = 1, y = 2x − a−3 , x := y x = 0.6, 2x = 1.2, a−4 = 1, y = 2x − a−4 , x := y x = 0.2, 2x = 0.4, a−5 = 0, y = 2x − a−5 , x := y e como ocorre a repetição de 0.2, temos que o processo vai se repetir indenidamente: a−5 = a−1 , a−6 = a−2 , a−7 = a−3 , . . . , a−n−4 = a−n . (0.2)10 tem a seguinte expressão na base 2 0.00110011 . . . Veja que é como uma dízima periódica, mas não é certo dizer dízima, pois esta palavra se refere à base 10. 1 O sinal := é a notação de `atribuição' que iremos usar. É uma operação distinta da igualdade. 6 Cálculo Numérico Vejamos outros exemplos de conversão. x = 0.125 x = 0.125, 2x = 0.25, a−1 = 0, y = 2x − a−1 , x := y x = 0.25, 2x = 0.5, a−2 = 0, y = 2x − a−2 , x := y x = 0.5, 2x = 1, a−3 = 1, y = 2x − a−3 , x := y e o processo termina porque a−n = 0, para n ≥ 4. Então (0.125)10 = (0.001)2 . Vamos obter os oito primeiros algarismos depois do ponto2 na base 2 para x = (0.126)10 : (1) (2) (3) (4) (5) (6) (7) (8) x = 0.126, 2x = 0.252, a−1 = 0, y = {2x} = 2x − a−1 , x := y x = 0.252, 2x = 0.504, a−2 = 0, y = {2x} = 2x − a−2 , x := y x = 0.504, 2x = 1.08, a−3 = 1, y = {2x} = 2x − a−3 , x := y x = 0.08, 2x = 0.16, a−4 = 0, y = {2x} = 2x − a−4 , x := y x = 0.16, 2x = 0.32, a−5 = 0, y = {2x} = 2x − a−5 , x := y x = 0.32, 2x = 0.64, a−6 = 0, y = {2x} = 2x − a−6 , x := y x = 0.64, 2x = 1.28, a−7 = 1, y = {2x} = 2x − a−7 , x := y x = 0.28, 2x = 0.56, a−8 = 0 e haveria mais para calcular. Também não sabemos se a seqüência termina ou continua indenidamente. Obtemos a aproximação (0.126)10 ≈ (0.00100010)2 . É importante notar que, assim como (0.126)10 > (0.125)10 temos (0.00100010 . . .)2 > (0.001)2 , ou seja, a propriedade da ordem dos números na reta não depende da base em que os representamos. O sinal de aproximação acima foi colocado porque limitamos nossos cálculos para a conversão do número dado: x = 0.126. É esta exatamente a segunda fonte de erros no computador. Ele estabelece: qualquer número que vou representar tem (digamos) 16 algarismos. Daí ele converte qualquer dado de entrada para um número, normalmente representado na base 2, com 16 algarismos. 6. Calcule os 8 primeiros algarismos, na base 2, de cada número dado na base 10: x = (1.1)10 ; x = (1.125)10 ; x = (0.1125)10 ; x = (4.93)10 . 7. Estenda o algoritmo de conversão de números fracionários para base 3, aplicando-o aos seguintes números (1/3)10 e (0.5)10 . Agora podemos estudar somas, diferenças, produtos e razões entre números na base 2. 2 Costumamos dizer `depois da vírgula', mas vamos sempre usar o ponto para marcar o início das potências negativas. Túlio Carvalho 1.2 7 Operações aritméticas A limitação no armazenamento de cada dado tem algumas conseqüências nas operações algébricas realizadas no computador. Por isto, para ver como elas funcionam no computador e como geram erros, convém denir o que é, para nossos propósitos, o computador: Denição 1. O sistema numérico de uma máquina é dado por uma base b > 1, um número de algarismos t, um expoente máximo M e um expoente mínimo m. Cada número representável na máquina é dado na forma ±0.d1 d2 . . . dt × bg e d1 ≥ 1 com m ≤ g ≤ M . Esta máquina é abreviadamente denotada por M(b, t, m, M ). Exemplo: Tome b = 10, t = 5, m = −10 e M Números representáveis na máquina: 0.12345 × 101 , = 10. A máquina é M(10, 5, −10, 10). 0.12121 × 10−10 , 0.12122 × 1010 . Números que só podem ser aproximados na máquina 0.122222, 1.22234, 1 . 3 π, Note as seguintes propriedades sobre os números representáveis da máquina (em valor absoluto): • existe um maior número positivo representável, • existe um menor número representável, e ele é maior que zero! No exemplo acima, o menor número representável é 0.1 × 10−10 e o maior é 0.99999 × 1010 . Para identicar um número, bastam seus t dígitos e seu expoente g . Os t dígitos são chamados mantissa do número: expoente 0. 12000 | {z } ×10 z}|{ 2 . mantissa Claro que na interação com a máquina, ela permite outras formas de dados de entrada, mas internamente ela os representa como denido acima. Por exemplo, o número cuja mantissa acabamos de salientar seria convenientemente digitado como 12 (uma dúzia), sendo depois convertido para a representação acima para qualquer uso futuro. Um número escrito à maneira da máquina tem semelhança com a notação cientíca, para a qual o padrão é a base 10 (veja como está escrita a velocidade da luz no seu livro de física). Esta maneira de representar os números internamente explica como são feitas as operações aritméticas. Denição 2. Considere uma máquina M(b, t, m, M ). Para efetuar a soma de dois números positivos, a máquina alinha os pontos, colocando os dois números com o expoente igual ao maior dos dois e soma as mantissas. 8 Cálculo Numérico • Para efetuar a subtração de x por y , x 6= y , a máquina alinha os pontos como na soma e subtrai como na aritmética dos reais a mantissa de x da de y . • Para efetuar a multiplicação de dois números, a máquina multiplica as mantissas e soma os expoentes. O sinal do resultado segue a regra dos sinais da aritmética usual. • Para efetuar a divisão de dois números x/y , a máquina divide a mantissa de x pela de y e subtrai o expoente de y do de x. O sinal do resultado segue a regra dos sinais da aritmética usual. Em todas as operações, se necessário, a máquina realinha o ponto de modo que a sua esquerda que zero e o primeiro dígito à direita do ponto, d1 , seja maior que zero. Depois de posicionado o ponto de modo que d1 > 0, a máquina trunca o resultado para t dígitos na mantissa. Vamos dar alguns exemplos, começando com a operação de soma na máquina M(b = 10, t = 5, −10, 10) 1 + 12 =? x = 0.1 × 101 , y = 0.12 × 102 x + y =0.01 × 102 +0.12 × 102 =0.13 × 102 que é mostrado no display como 13. Mas se fosse x = 1 e y = 120000, x + y =0.000001 × 106 +0.12 × 106 =0.120001 × 106 =0.12 × 106 , truncamento Note que aqui a operação não é exata como a aritmética dos reais. Multiplicação de x = 0.12 e y = 54.321 xy =(0.12 · 0.54321) × 102 =0.0651852 × 102 =0.65185 × 101 , truncamento. Nos exercícios abaixo, faça os cálculos numa máquina M(b = 10, t = 5, −10, 10). 1. Para x = 0.12 e y = 0.54321, calcule (xy)/x e compare com y. O que você pode concluir das operações na máquina? 2. No segundo exemplo, vimos que 1 + 120000 = 120000 na máquina. Para y = 1, existe x tal que x + y = y na máquina? 3. Dados x = 5 e y = 1 × 106 , calcule (x + x) + y e x + (x + y). Túlio Carvalho 9 4. Quando você digita 0 na máquina, qual valor pode ser usado como zero? Este é o valor que a máquina usa quando tem que calcular x − x. Para fazer estes exercícios numa calculadora, é necessário fazer a operação de truncamento à mão, porque a sua calculadora tem provavelmente mais do que 5 dígitos para representar os números (enquanto a nossa máquina tem t = 5). Existem algumas sosticações, como números com precisão dupla, que podem ser (e são) implementadas nas máquinas que usamos, mas o porquê da inexatidão das operações aritméticas é o truncamento. 1.3 Erros Vimos acima que as operações aritméticas na máquina são geralmente diferentes daquelas que ˜ , mas não o fazemos. De estamos habituados. Deveríamos denotá-las por outros símbolos: +̃, −̃,˜·, ÷ fato, elas se parecem com as operações usuais e pretendem imitá-las. Precisamos então quanticar o sucesso desta imitação, e para isto denimos os erros. Nosso objetivo é sempre fazer cálculos em que os erros não cresçam tanto de modo que os resultados (que são de fato aproximações) sejam conáveis. Denotemos o valor exato de um número por x e seu valor aproximado por x̄. Em geral x 6= x̄, especialmente se x̄ é obtido após uma série de operações aritméticas. O sucesso de um algoritmo está em administrar o módulo da diferença: |x − x̄|. Denição 3. número: O erro absoluto é a diferença entre o valor exato e o valor aproximado de um ea(x) = x − x̄. O erro relativo é o erro absoluto dividido pelo valor aproximado do número: er(x) = x − x̄ . x̄ Geralmente o valor exato x não é conhecido. Conhecemos x̄ e uma vez que saibamos ea(x) podemos dizer em que intervalo x está. É este o fundamento de uma aritmética computacional rigorosa, chamada aritmética intervalar. Usualmente trabalhamos com estimativas (cotas superiores) para ea(x). Convém ressaltar que as operações de subtração e divisão na denição de erro são exatas. Em primeiro lugar, vamos analisar o erro absoluto para dados de entrada, que suporemos exatos. Em seguida, veremos como as operações aritméticas produzem erros nos resultados. Como geralmente não sabemos o valor exato de um dado de entrada, convém obter o valor máximo que ea(x) ou er(x) podem ter, independente de x. Primeiro note que ea(x) = x̄er(x). Logo só precisamos obter um limitante superior para er(x) (isto é chamado estimar o erro relativo). Na máquina M(10, 5, −10, 10), note o seguinte 1 + 1 × 10−5 = 1 assim como 1 + 2 × 10−5 = 1, até 1 + 9 × 10−5 = 1. Logo, todo o intervalo de valores [1 − 9 × 10−5 , 1 + 9 × 10−5 ] é entendido pela máquina como 1. Calculando o erro relativo de qualquer x 10 Cálculo Numérico neste intervalo er(x) = x−1 1 e |er(x)| < 9 × 10−5 < 1 × 10−4 = 1 × 10−t+1 . Como a diferença entre y e ȳ , para qualquer y , só pode estar no último dígito da mantissa, y −5 −5 ȳ ∈ [1 − 9 × 10 , 1 + 9 × 10 ] na nossa máquina. Assim y −t+1 |er(y)| = − 1 < 1 × 10−4 = |1 × 10 {z } ȳ (9) em geral Concluindo, o erro relativo em cada dado de entrada está sempre no penúltimo algarismo da mantissa. Por isto se diz que a precisão da máquina, isto é, o número de dígitos signicativos exatos de um dado, é t − 1. Os erros absolutos e relativos crescem quando efetuamos operações. Pela denição das operações, no nal ocorre um truncamento, se necessário. Sabemos que o erro relativo de truncamento é, para qualquer dado, limitado a 10−t+1 . Desta forma, para calcular o erro absoluto da soma, temos que levar em conta os erros de cada fator e o erro devido à própria operação. Assim (10) ea(x + y) = x + y − (x̄+̃ȳ) em que x̄+̃ȳ é o resultado numérico da soma de x̄ e ȳ . Sabemos que (11) x̄+̃ȳ = x̄ + ȳ + eo(+)(x̄ + ȳ) em que eo(+) denota o erro (relativo) da soma. Como se pode notar pela Denição 2, os erros das operações têm origem no truncamento, portanto o erro relativo de qualquer operação vale no máximo 10−t+1 . Substituindo (11) em (10) vem que ea(x + y) = (x − x̄) + (y − ȳ) + eo(+)(x̄+̃ȳ) (12) = ea(x) + ea(y) + 10−t+1 (x̄+̃ȳ) . | {z } | {z } dos dados da operação Os dois primeiros termos, que convém denotarmos por e1 , são devidos aos erros absolutos dos dados x e y , enquanto o último termo provém da operação aritmética. O erro devido à operação é sempre da forma acima: 10−t+1 z , em que z denota o resultado da operação. Por outro lado, para cada operação, os erros absolutos provenientes de aproximações dos dados se propagam segundo as regras de diferenciação: • e1 da soma é a soma dos erros absolutos dos dados; • e1 da diferença é a diferença dos erros absolutos dos dados; • e1 do produto: e1 (xy) = x̄ea(y) + ȳea(x); • e1 do quociente: e1 (x/y) = x̄ ea(y)−ȳ ea(x) ȳ 2 Túlio Carvalho 11 Para obter o erro relativo, basta dividir o erro absoluto em cada fórmula pelo resultado da operação. Por exemplo e1 (xy) + eo(·)x̄˜·ȳ x̄˜·ȳ x̄ea(y) ȳea(x) + + eo(·) = x̄˜·ȳ x̄˜·ȳ =er(y) + er(x) + eo(·). er(xy) = (13) Nos cálculos com erros, termo que tem erro multiplicado por outro erro é desprezado. Eles são chamados termos de segunda ordem. Isto justica a última igualdade, porque nela usamos, por exemplo, ȳ/(x̄˜·ȳ) = 1/x̄, mas isto só vale aproximadamente, pois um possível truncamento ocorre em x̄˜·ȳ . 1. Tome dois dados x = 1234 e y = 1233 com erro relativo padrão de 10−4 na máquina M(10, 5, −10, 10). Calcule o erro relativo de x − y e expresse-o em porcentagem. Este problema é chamado de cancelamento subtrativo. 2. Calcule o erro relativo de z = 3x̄ e w = x̄ + x̄ + x̄. Note que 3 e x̄ já são números exatos na máquina. Como regra geral a ser seguida, sempre que for somar uma seqüência de números, convém colocá-los em ordem crescente, como ilustra o exercício: 3. Calcule o erro relativo nas seguintes operações, dados x = 5, y = 120000: x + x + y e y + x + x. A associatividade é da esquerda pra direita. 1.4 Instabilidade de algoritmos Os algoritmos fazem operações repetidas vezes. Pode acontecer de os erros das operações aritméticas se acumularem, provocando erros relativos grandes nos resultados. Veremos dois exemplos. R Exemplo 1. Cálculo de In = 01 xn ex−1 dx, para n = 1, 2, · · · . Integrando por partes In = 1 xn ex−1 0 Z −n 1 xn−1 ex−1 dx 0 = 1 − nIn−1 A fórmula In = 1 − nIn−1 é uma fórmula recursiva para o conjunto de integrais In , porque uma vez conhecido o valor de In−1 , podemos imediatamente calcular o valor de In . Ela fornece um algoritmo para calcular cada integral In . Num algoritmo, a execução de um conjunto de instruções (fórmulas, atribuições, etc) que se faz repetidas vezes é chamado laço ou iteração. Para começar, podemor calcular diretamente I1 = 1/e ∼ = 0, 367879 na máquina M(10, 6, −19, 20). 12 Cálculo Numérico Daí que I1 ∼ = 0, 367879 I2 ∼ = 0, 264242 I6 ∼ = 0, 127120 I7 ∼ = 0, 110160 I3 ∼ = 0, 207274 I4 ∼ = 0, 170904 I8 ∼ = 0, 118720 ∼ I9 = −0, 068480 I5 ∼ = 0, 145480 O resultado de I9 tem erro relativo maior que 100%, pois as integrais In são todas positivas, uma vez que o integrando é positivo. O fato de multiplicarmos por um número n > 1 uma aproximação aumenta o erro na próxima aproximação. De fato, o erro em I9 é da ordem de 9!10−7 = 0, 16. Podemos escrever a fórmula recursiva do algoritmo da seguinte maneira In−1 = 1 − In n e obter um algoritmo cujo erro diminui a cada iteração. No entanto precisamos de uma aproximação para n grande. Isto pode ser feito notando que Z In = 1 n x−1 x e Z dx ≤ 0 1 xn dx = 0 1 n+1 e portanto In → 0 quando n → ∞. Assim, tomando I2 0 ∼ = 0, podemos calcular I9 ∼ = 0, 091612 e além disto o erro diminui a cada iteração (começando pela cota 1/21). Exemplo 2. Cálculo de raízes de equações do segundo grau. A fórmula de Bhaskara para a solução de uma equação do segundo grau, ax2 + bx + c = 0, x= −b ± √ b2 − 4ac 2a dá um resultado ruim quando b é muito grande. Na máquina M(10, 6, −19, 20), para a = 1, b = 104 e c = 1, temos x1 = −b − √ b2 − 4ac ∼ = −104 2a e x2 = 0. Exatamente por causa do cancelamento subtrativo, temos em x2 um erro relativo de 100%. Podemos evitar o cancelamento subtrativo (veja exercício 1 da seção anterior), usando as seguintes fórmulas para as soluções: √ −b − sinal(b) b2 − 4ac x1 = 2a c x2 = ax1 Túlio Carvalho 13 em que a última relação decorre da fatoração ax2 + bx + c = a(x − x1 )(x − x2 ). No exemplo acima, temos a aproximação em M(10, 6, −19, 20) para x2 = 10−4 , que é bem melhor. Como regra geral, deve-se evitar operações aritméticas que produzam números grande demais ou muito próximos de zero. Nas operações recursivas (como no exemplo 1), evitar que o erro de uma iteração seja multiplicado por um número maior que 1.