Baixe o app para aproveitar ainda mais
Prévia do material em texto
Licenciatura em Física – EaD MAT094 Cálculo Numérico - 2011 Prof. R Claudino – UNIFEI Em seqüência aos cursos de Cálculo 1, 2 e 3, estudamos em Cálculo Numérico uma variedade de métodos numéricos para a resolução de determinados problemas, para os quais soluções analíticas não podem ser obtidas. Ementa: 1. Erros 1.1 Representação de números. 1.2 Erro absoluto e erro relativo. 1.3 Erros de arredondamento e truncamento. 1.4 Análise de erros. 2. Zeros de Funções reais 2.1 Isolamento das raízes. 2.2 Refinamento. 2.3 Comparação entre métodos 3. Resolução de Sistemas de Equações Lineares 3.1 Métodos Diretos. 3.2 Métodos Iterativos. 4. Aproximação de Funções Reais de uma Variável Real 4.1 Interpolação. 4.2 Método dos mínimos quadrados. 5. Integração Numérica 5.1 Fórmulas de Newton-Cotes. 5.2 Quadratura Gaussiana. 6. Resolução Numérica de Equações Diferenciais Ordinárias 6.1 Problemas da valor inicial. 6.2 Equações de ordem superior. 6.3 Problemas de valor de contorno. Objetivos do Curso: Os principais objetivos do curso são: Apresentar diversos métodos numéricos para a resolução de diferentes problemas matemáticos. Pretende-se deixar bem claro a importância desses métodos, mostrando: o a essência de um método numérico; o a diferença em relação a soluções analíticas; o as situações em que eles devem ser aplicados; o as vantagens de se utilizar um método numérico; o e as limitações na sua aplicação e confiabilidade na solução obtida. Melhorar a familiarização e “intimidade” do aluno com a matemática, mostrando seu lado prático e sua utilidade no dia-a-dia. Rever conceitos já vistos, exercitá- los e utilizá-los de maneira prática; Apresentar maneiras práticas de se desenvolver e utilizar métodos numéricos. Isso significa mostrar como usar esses métodos numéricos na calculadora e em um computador. Treinar o aluno a aprender outros métodos numéricos por própria conta. No seu dia-a-dia profissional, ele pode se deparar com um problema cuja solução depende de um método numérico que não foi visto no curso. Portanto, ele deverá ser capaz de encontrar a literatura pertinente, estudar o método e aprender a sua utilização de maneira conceitual e prática (usando um aplicativo computacional) por conta própria. Bibliografia: - Ruggiero, Márcia A. G.; Lopes, Vera L. R.; Cálculo Numérico: aspectos teóricos e computacionais; 2ªed; Makron Books; 2005. - Sperandio, Décio; Mendes, João T.; Monken e Silva, Luz H.; Cálculo Numérico: características matemáticas e computacionais dos métodos numéricos; Prentice Hall; 2003. Cálculo Numérico aula 01 Introdução A natureza é extremamente complexa. Para tentar entendê-la, criam-se modelos que seguem leis mais simples do que a realidade, dando resultados aproximados. Essas leis, que procuram simular a natureza, são, em geral, expressas matematicamente. As formulações matemáticas, embora simplificações do que se passa na realidade, ainda assim, com freqüência, são muito complexas para serem resolvidas analiticamente. É comum uma lei física ser expressa por uma equação diferencial cuja solução exata não é possível de ser obtida. Uma integral definida, mesmo que não seja muito complexa em sua formulação, pode não ser analiticamente resolvida. Mesmo um cálculo da raiz quadrada de um número, aparentemente simples, pode exigir operações que transcendam as contas elementares. Para essas situações temos no Cálculo Numérico um conjunto de ferramentas ou métodos usados para se obter uma solução aproximada. Os métodos numéricos buscam soluções aproximadas para essas formulações. Além disso, nos problemas reais, os dados com que se trabalha são medidas e, como tais, não são exatos. Ao resolver um problema numericamente, o mais comum é o pesquisador, ou profissional, utilizar um pacote computacional. Porém, ele terá que tomar uma série de decisões antes de resolver o problema. E para tomar essas decisões, é preciso ter conhecimento de métodos numéricos: o Pela utilização ou não de um método numérico (existem métodos numéricos para se resolver este problema?); o Escolher o método a ser utilizado, procurando aquele que é mais adequado para o seu problema. Que vantagens cada método oferece e que limitações eles apresentam; o Saber avaliar a qualidade da solução obtida. Para isso, é importante ele saber exatamente o que está sendo feito pelo computador ou calculadora, isto é, como determinado método é aplicado. Supondo estar diante de um problema que exige uma solução numérica, em princípio com a ajuda de um computador e, ainda precisar resolvê-lo sem contar com um método “já conhecido” veremos que a resolução envolve várias etapas, esquematizadas na figura a seguir, já incluída a etapa relacionada ao emprego de métodos numéricos. Inicialmente, é necessário construir um modelo matemático do problema em questão em que um conjunto de variáveis relevantes são incorporadas ao modelo ao passo que outras variáveis são desprezadas, o que pode acarretar incertezas. Na etapa de resolução, o método numérico permite obter uma solução aproximada para o problema; os erros que surgem desta aproximação precisam ser controlados. Por sua vez, na implementação computacional do método numérico, o número finito de dígitos com que o computador trabalha acarreta outros erros. Finalmente, a análise dos resultados obtidos poderá levar a uma modificação da implementação computacional, do método numérico ou do modelo matemático, dependendo da identificação da origem dos erros cometidos. Em resumo, os erros na resolução de um problema têm origem variada: o modelagem: é necessário escolher variáveis e adequar equações. o método numérico: aproximação. o implementação computacional: representação dos números. Neste curso, somente os erros que se originam do método numérico e da implementação computacional serão tratados. Os erros correspondentes às aproximações associadas aos métodos numéricos serão discutidos no contexto específico de cada método numérico é apresentado. Inicia-se o curso com a discussão dos erros que surgem na implementação computacional, associados à representação dos números. Cálculo Numérico aula 02 1. Erros A noção de erro está presente em todos os campos do Cálculo Numérico, e passa por considerações quanto a: o Dados: cada medida realizada é um intervalo e não um número; o Incerteza: cada medida propaga sua incerteza nas operações matemáticas; o Aproximações: os métodos de cálculo em si são aproximações e, o Representação numérica: o computador representará os números reais com um número finito de dígitos, sendo forçado a aproximá-los quando os números reais exigirem mais dígitos do que ele está preparado para usar, por exemplo, o número π. 1.1 Representação de números. Para realizarmos de maneira prática qualquer operação com números, nós precisamos representá-los em uma determinada base numérica. O que isso significa? Vamos tomar como exemplo o número √2 . A fim de calcularmos, por exemplo, o valor de √2−1 , precisamos escrever o número √2 de alguma outra forma, caso contrário não é possível realizar essa operação. Podemos escrevê-lo na base decimal, por exemplo, que é a base mais usada na história da humanidade (graças a nossa anatomia). O valor de √2 na base decimal pode ser escrito como: 1,41 ou 1,4142 ou ainda 1,41421356237. Qual é a diferença entre essas várias formas de representar √2 ? A diferença é a quantidade de algarismos significativos usados em cada representação. Agora podemos realizar a operação proposta: √2−1 = 0.41 ou 0.4142 ou ainda 0.41421356237 Conforme o número de algarismos significativos adotados na nossa representação. Em uma máquina digital, como uma calculadora ou um computador, os números não são representados na base decimal. Eles são representados na base binária,ou seja, usam o número 2 como base ao invés do número 10. Como na base decimal existem 10 algarismos diferentes (0, 1, 2 ,3, 4, 5, 6, 7, 8, 9), na base binária existem somente 2 números: 0 e 1. Portanto, a base binária é usada porque essas máquinas utilizam sinais elétricos, sendo o 0 correspondente a ausência de sinal e o número 1 a presença do sinal elétrico. No computador o armazenamento dessa informação (0 ou 1) corresponde ao bit = binary digit, que por sua vez concatenados em blocos de oito formarão o byte que é a unidade de medida para espaço de armazenamento. Representação de um número na base dois Escrever um número inteiro em binário, isto é, na base dois usada nos computadores, não apresenta problema. Cada posição digital representará uma potência de dois, da mesma forma que nos números decimais, cada posição representa uma potência de dez. Assim, 23.457 significa: 2×104 + 3×103 + 4×102 + 5×101 + 7×100. Na base dois, o número 110101 representa: 1×25 + 1×24 + 0×23 + 1×22 + 0×21 + 1×20 = (53)10 Os números com parte fracionária, da mesma forma, podem ser representados, usando-se potências negativas de dez, na base dez e de dois, na base dois. Exemplos: 456,78 = 4×102 + 5×101 + 6×100 + 7×10-1 + 8×10-2 e, 101,101 = 1×22 + 0×21 + 1×20 + 1×2-1 +0×2-2 + 1×2-3 = (5,625)10 Sabe-se que, na base dez, para se multiplicar um número pela base, isto é, por dez, basta deslocar a vírgula uma casa para a direita. O mesmo ocorre com qualquer base, em particular com a base dois. Para multiplicar um número por dois, basta deslocar a vírgula uma casa para a direita. 7 = 111 14 = 1110 28 = 11100 3,5 = 11,1 Mostra-se que: 0,8 = 0,1100110011001100... 0,4 = 0,01100110011001100... 1,6 = 1,1001100110011... 1,2 = 1,001100110011... Conversão: Decimal Binário e Binário Decimal Números Inteiros A conversão do número inteiro, de decimal para binário, será feita da direita para a esquerda, isto é, determina-se primeiro o algarismo das unidades ( o que vai ser multiplicado por 20 ) , em seguida o segundo algarismo da direita ( o que vai ser multiplicado por 21 ), etc. A questão chave é observar se o número é par ou ímpar. Em binário, o número par termina em 0 e o ímpar em 1. Assim determina-se o algarismo da direita, pela simples divisão do número por dois; se o resto for 0 (número par) o algarismo da direita é 0; se o resto for 1 (número ímpar) o algarismo da direita é 1. Por outro lado, é bom lembrar que, na base dez, ao se dividir um número por dez, basta levar a vírgula para a esquerda. Na base dois, ao se dividir um número por dois, basta levar a vírgula para a esquerda. Assim, para se determinar o segundo algarismo, do número em binário, basta lembrar que ele é a parte inteira do número original dividido por dois, abandonado o resto. Vamos converter 25 de decimal para binário. Para conversão de binário para decimal, de número inteiro, basta somar os algarismos multiplicados pela respectiva potência de 2, não esquecendo que da direita para a esquerda as potências começam em zero. Seja, por exemplo o número binário (1000101)2 que escrevendo sua forma polinomial temos: (1001101)2 = 1×26 + 0×25 + 0×24 + 1×23 + 1×22 + 0×21 + 1×20. Efetuadas as operações indicadas resulta: 1×64 + 0×32 + 0×16 + 1×8 + 1×4 + 0×2 + 1×1 = = 64 + 0 + 0 + 8 + 4 + 0 + 1 = (77)10 Parte Fracionária do Número A conversão da parte fracionária do número será feita, algarismo a algarismo, da esquerda para a direita, baseada no fato de que se o número é maior ou igual a 0,5 - em binário aparece 0,1 - isto é, o correspondente a 0,5 decimal. Assim, 0,6 será 0,1_ _ ..., ao passo que 0,4 será 0,0_ _ ... Tendo isso como base, basta multiplicar o número por dois e verificar se o resultado é maior ou igual a 1. Se for, coloca-se 1 na correspondente casa fracionária, se 0 coloca-se 0 na posição. Em qualquer dos dois casos, o processo continua, lembrando-se, ao se multiplicar o número por dois, a vírgula move-se para a direita e, a partir desse ponto, estamos representando, na casa à direita, a parte decimal do número multiplicado por dois. Vamos ao exemplo, representando, em binário, o número 0,625. 0,625 x 2 = 1,25 logo a primeira casa fracionária é 1 Resta representar o 0,25 que restou ao se retirar o 1 já representado. 0,25 x 2 = 0,5 logo a segunda casa é 0 Falta representar o 0,5 0,5 x 2 = 1 logo a terceira casa é 1 0,62510 = 0,1012 Quando o número tiver parte inteira e parte fracionária, podemos calcular cada uma, separadamente. Tentando representar 0,8 verifica-se que é uma dízima. 0,8 = 0,110011001100.... Da mesma forma, 5,8 = 101,11001100... , também uma dízima. E consequentemente, 11,6 = 1011,10011001100... também, bastaria deslocar a vírgula uma casa para a direita, pois 11,6 = 2 × 5,8 . A conversão da parte fracionária de binário para decimal segue a mesma forma empregada para a parte inteira, ou seja, basta somar o produto dos algarismos pela respectiva potência de 2, porém lembrando que os expoentes serão menores que zero exemplo: (0,11001)2 = 1×2-1 + 1×2-2 + 0×2-3 + 0×2-4 + 1×2-5 Efetuando as operações teremos o resultado na base 10: (0,11001)2 = 1× (1/2) + 1× (1/4) + 0× (1/8) + 0× (1/16) + 1× (1/32) = = 1×0,5 + 1×0,25 + 0×0,125 + 0×0,0625 + 1×0,03125 = 0,78125(10) Cálculo Numérico aula 03 1. Erros 1.1 Representação de números (continuação) Ponto fixo e ponto flutuante Em todos os exemplos de números apresentados, a posição da vírgula está fixa, separando a casa das unidades da primeira casa fracionária. Entretanto, pode-se variar a posição da vírgula, corrigindo-se o valor com a potência da base, seja dez ou dois, dependendo do sistema que se use. Façamos, mais uma vez, analogia com o sistema decimal: 45,31 corresponde a 4×101 + 5×100 + 3×10-1 +1×10-2 Esse mesmo número poderia ser escrito como sendo 4,531 × 101 ou 0,4531 × 102 ou 453,1 × 10-1 etc. Chama-se a isso ponto flutuante (floating point), pois no lugar de se deixar sempre a posição da vírgula entre a casa das unidades e a primeira casa decimal, flutua-se a posição da vírgula e corrige-se com a potência de dez. Com a base dois pode-se fazer exatamente a mesma coisa, escrevendo-se o mesmo número 110101 como sendo 110,101×23 ou 1,10101×25 ou 0,0110101×27 ou outras formas. Claro que os expoentes das potências também poderão ser escritos na base dois, onde (3)10 = (11)2 e (7)=(111)2, e assim por diante, ficando: 110,101 × (10)11 ou 1,10101× (10)101 ou 0,0110101× (10)111. Forma normalizada Forma normalizada é a que apresenta o número com um único dígito, diferente de zero, antes da vírgula; no caso de 45,31 seria: 4,531 × 101. Enquanto na base dois, o número 110101 seria 1,10101×25 ou, escrevendo-se o próprio expoente da base, 5, também na base dois: 1,10101×2101. A apresentação da base 2 está sendo mantido na forma decimal, 2expoente, e não na binária “10 expoente”, porque ela não precisará ser representada, por ser implícita. Para o número apresentado na forma normalizada, como 4,531 × 101, na base 10, chama-se mantissa ao número 4,531 e de expoente ao número 1. E para o número 1,10101×2101, na base dois, chama-se mantissa ao número 1,10101 e expoente ao número 101 deste exemplo. Seguem-se outros exemplos: o 1110,01 ou 1,11001 × 23 ou 1,11001 × 211 , que corresponde a 14,25 o 0,0011 ou 1,1 × 2-3 ou 1,1 × 2-11 , que corresponde a 0,1875 o 0,1001 ou 1,001 × 2-1 , que corresponde a 0,5625 Pode-se observar que, para se representar um número real, é necessário armazenar a mantissa e o expoente, sendo dispensável representar o "1,", por estar sempre presente, sendo, também desnecessário, armazenar o “2” que é a base do sistema. Para se definir a maneira como o computador (e igualmente uma calculadora) armazenará o número real em ponto flutuante, é preciso definir o número debits que ele usará para representar a mantissa e o número de bits para o expoente. Suponha-se que um determinado computador reserve 1 byte, isto é, 8 bits, para representar os números reais. Admita-se que usa o primeiro bit para sinal do número, três bits seguintes para o expoente e os últimos quatro bits para o restante da mantissa. bit 0 bit 1 bit 2 bit 3 bit 4 bit 5 bit 6 bit 7 sinal exp exp exp mant mant mant mant O bit 0 indica o sinal do número: 0 positivo ou 1 negativo. Os bits 1, 2 e 3 constituem o expoente e precisam representar tanto expoentes positivos quanto expoentes negativos. Com esses três bits, há 8 possibilidades: 000, 001, 010, 011, 100, 101, 110, 111, que representariam números de 0 até 7. Isso não serviria, pois precisamos de expoentes negativos, além dos positivos. Deram-se aos expoentes 000 e 111 significados especiais, a serem tratados daqui a pouco. Admita-se que o número 3, isto é, 011 represente o expoente zero. Os anteriores representarão os expoentes negativos e os posteriores os expoentes positivos. Dessa maneira, o número que representa o expoente será o número em binário menos três, conforme tabela a seguir. bits 001 010 011 100 101 110 valor 1 2 3 4 5 6 expoente -2 -1 0 1 2 3 É importante observar que num número diferente de zero, normalizado na base 2, a mantissa sempre começará por 1. Assim sendo, não há necessidade de se representar o (1, ) pois isso ficaria implícito, bastando representar os dígitos que aparecem depois da vírgula. Sendo m o número de bits representados da mantissa, o número representado terá, sempre, m+1 dígitos. Observe os exemplos a seguir: na base 10: na base 2: normalizado: nº binário: mant+exp representação 3,5 11,1 1,11 x 21 1,1100 x 21 01001100 2,75 10,11 1,011 x 21 1,0110 x 21 01000110 7,5 111,1 1,111 x 22 1,1110 x 210 01011110 -7,25 -111,01 -1,1101 x 22 -1,1101 x 210 11011101 -0,375 -0,011 -1,1000 x 2-2 -1,1000 x 2-10 10011000 Como se pode ver, o maior número positivo que pode ser representado nesse computador com a seqüência de 8 bits (ou 1 byte), é 01101111, que corresponde a 1,1111 × 2110 = 1,1111 × 23, isto é: 1111,12 ou 15,510. O menor número positivo seria: 00010000, que corresponde a 1,0000 × 2-2 , isto é: 0,2510. Aqui há uma observação a ser feita. Lembremo-nos que os expoentes 000 e 111, não foram considerados, até agora; eles teriam tratamento especial. Todos os números estão na forma normalizada, isto é: ( ± 1,_ _ _ …. x 2exp ). Usa-se o expoente 000, quando se quer indicar que o número não está normalizado, ficando o 000 como o menor expoente, isto é, -2 , no nosso exemplo. A mantissa passa a ser 0, _ _ _ _ onde, depois da vírgula, estão os dígitos da mantissa, só que, agora, sem a precedência do (1, ) , como era antes. Assim, temos a precedência de (0, ), e neste caso, não teremos, mais, m+1 dígitos significativos, como tínhamos quando os números eram normalizados. Exemplos: representação corresponde a: número binário na base decimal 00001111 0,1111 x 2-2 0,001111 0,234375 00001110 0,1110 x 2-2 0,001110 0,21875 00000100 0,0100 x 2-2 0,0001 0,0625 00000001 0,0001 x 2-2 0,000001 0,015625 O último exemplo é o menor número positivo nessa representação, correspondendo a 1 x 2-6 . O número 00000000 representa + 0 e o número 10000000 representa - 0, devendo ambos ser reconhecidos como iguais nas comparações. O expoente 111 é reservado para representar mais infinito, com zero na frente (01110000) e menos infinito com 1 na frente (11110000), em ambos os casos a mantissa sendo 0000. O mesmo expoente 111 é ainda utilizado para caracterizar indeterminação, 11111000. As demais combinações com o expoente 111 não são válidas, sendo desconsideradas (not a number). Nesse exemplo que estamos explorando, o número real é representado em 8 bits, sendo 1 para o sinal, 3 para o expoente e 4 para a mantissa, não sendo representado o 1, que antecede os 4 bits. E quando a mantissa não cabe nos 4 bits ? Somos obrigados a arredondar a mantissa para que ela caiba nos 4 bits. Assim, vamos perder precisão no número e ele não mais representará, exatamente, o número desejado. Como exemplo, vamos tentar representar, nesse nosso computador hipotético, o número 9,375. 9,375 = 1001,011 = 1,001011 x 23 Mas só existem bits para 4 dígitos, sobrando 0,000011 x 23 É feito o arredondamento ! Assim, se a parte abandonada é inferior à metade da última unidade representada, ela é abandonada, se for superior à metade, soma-se 1 à última unidade. Só havendo 4 bits, armazenam-se os 4 primeiros bits após o 1, isto é: 0010. Seria abandonado 11 após o último zero. Isso representa 0,11 da última unidade, que é maior que a metade da última unidade. Logo, soma-se 1 à última unidade, que fica sendo 1 e não zero. Portanto: 1,001011 x 23 = 1,0011 x 23 Este número não é mais 9,375 e sim 9,5. Perdemos precisão! Na verdade, esse computador não sabe representar 9,375 e, ao tentar fazê-lo, representa 9,5. Ele não tem bits suficientes para fazer uma representação melhor. Se quiséssemos representar 9,125 = 1001,001 = 1,001001 x 23 , a quantidade a ser abandonada, após os 4 bits, seria 01, o que representa 0,01 da última unidade representada. Isso é menor que metade dessa unidade e, portanto, será simplesmente abandonada, sem alterar o último bit representado. Portanto: 9,125 = 1001,001 = 1,001001 x 23 = 1,0010 x 23 = 1001. Esse número vale 9 e não 9,125. Resumindo, é feito o arredondamento na última casa (bit) representado. Quando o que restar for maior que metade da última unidade, soma-se 1 a essa unidade; quando for menor que metade da última unidade, essa parte restante é abandonada. E quando for exatamente igual à metade ? Por exemplo, vamos tentar representar 9,25, nesse computador hipotético. 9,25 = 1001,01 = 1,00101 x 23 . Sobra 1 após os quatro bits, isto é, sobra exatamente a metade da última unidade. Neste caso, observa-se o bit anterior. Se for zero, mantêm o zero, se for 1, soma-se 1 a esse bit. No exemplo o último bit é zero, logo assim permanece: 9,25 = 1001,01 = 1,00101 x 23 = 1,0010 x 23 = 1001 = 9. Se fôssemos representar 10,75 = 1010,11 = 1,01011 x 23 . Sobra 1 após os quatro bits, isto é, sobra exatamente a metade da última unidade. O bit que resta segue um bit 1. Neste caso, soma-se 1 a este bit, ficando com: 1,0110 x 23 = 1011 = 11 (onze). Como se vê, ora se aumenta o número, ora se diminui. Isso evita que, no caso de grande número de aproximações, haja tendência num certo sentido, buscando-se equilibrar os aumentos com as diminuições. Usamos, até agora, a hipótese de representar o número real em 8 bits. Na realidade, usam-se mais bits, nessa representação. A norma IEEE 754, publicada em 1985, procurou uniformizar a maneira como as diferentes máquinas representam os números em ponto flutuante, bem como devem operá-los. Tal norma estabeleceu padrões para os USA e demais países integram seus interesses, a serem seguidos por fabricantes de equipamentos computacionais e desenvolvedores de programas básicos para uniformizar seu funcionamento independendo de local, cultura ou industria. Essa norma define dois formatos básicos para os números em ponto flutuante: o formato simples, com 32 bits e o duplo com 64 bits. O primeiro bit é para o sinal: 0 representa número positivo e 1 representa número negativo. No formato simples o expoente tem 8 bits e a mantissa tem 23 bits; no formato duplo, o expoente tem 11 bits e a mantissa 52 bits. No formato simples, o menor expoente é representado por 00000001, valendo -126, e o maior expoente é representado por 11111110, valendo +127. Em ambos os casos, o expoente vale o número representado em binário menos 127. No formato duplo, o menor expoente é representado por 00000000001, valendo -1022, e o maior expoente é representado por 11111111110, valendo +1023. Em ambos os casos, o expoente vale o número representado embinário menos 1023. Em ambos os formatos, a norma IEEE 754 prevê o chamado underflow gradual, permitindo obter números bem mais próximos de zero. Para isso, como mostrado no exemplo hipotético, o expoente representado por 000…000 representa o menor expoente, "-126" no formato simples e "–1022" no formato duplo, e a mantissa deixa de ser normalizada. Dessa maneira podemos representar, como menor número positivo: o no formato simples: 0 00000000 00….01 isto é: 2-126 x 2-23 = 2-149 o no formato duplo: 0 00000000000 00….01 isto é: 2-1022 x 2-52 = 2-1074 No formato simples, o zero possui, ainda, duas representações 0 00000000 000...00 , correspondendo a mais zero e 1 00000000 000...00 , correspondendo a menos zero, ambas iguais em qualquer operação de comparação. Mais infinito é representado por 0 11111111 000...00 e menos infinito por 1 11111111 000...00 . Indeterminado é representado por 1 11111111 100...00 . As demais combinações não são válidas, sendo consideradas "not a number". Dessa maneira, o intervalo de números representáveis será: o no formato simples: números negativos: de -[2, 2-23] x 2127 a –2-149 zero números positivos: de 2-149 a [2, 2-23] x 2127 . obs.: [2, 2-23] representa o intervalo: de 1,00...00 até 1,11...11 o no formato duplo: números negativos: de - [2, 2-52] x 21023 a –2-1074 zero números positivos: de 2-1074 a [2, 2-52] x 21023 . Valor verdadeiro do número armazenado Vimos que ao se tentar armazenar o número 0,8 em ponto flutuante, o número será arredondado, tendo seu valor alterado. Assim, sabendo-se que 0,8 = 0,1100110011001100.... = 1,100110011001100... x 2-1 e que, em precisão simples, terem os 23 bits após a vírgula, qual será o verdadeiro valor armazenado ? Vamos calcular: 0,8 → 1,10011001100110011001100110011001100... x 2-1 onde em vermelho estão os bits depois do vigésimo terceiro. Como os bits que serão abandonados representam mais do que a metade da última unidade, soma-se 1 ao vigésimo terceiro bit, obtendo-se: 0,8 → 1,10011001100110011001101 x 2-1 > 0,8 Será armazenado um número maior que 0,8, neste caso. Chamando esse valor armazenado de A, tem-se: A - 0,8 = (1,0 - 0,110011001100...) x 2-1 x 2-23 = = (1,0 - 0,8) x 2-24 = 0,2 x 2-24 = 1,19209... x 10-8 A = 0,8000000119209... Neste caso, tem-se um número ligeiramente maior que 0,8. E se quiséssemos armazenar 1,8 ... o que seria, de fato, armazenado? 1,8 = 1,1100110011001100... → 1,11001100110011001100110 x 20 = B B será ligeiramente menor que 1,8 pois foi abandonado 0,011001100... x 2-23 = 0,4 x 2-23 1,8 - B = 0,4.2-23 = 4,76837..10-8 B = 1,79999995232... Tem-se um número ligeiramente menor que 1,8. O importante disso tudo é ver que, em binário, o número é formado pela soma de potências de dois: potências positivas e negativas. Quando um número não pode ser formado por um número finito dessas potências, como é o caso de 0,8, ele se torna no que em decimal se chama dízima, necessitando de infinitos bits para representá-lo. Como, em ponto flutuante, temos um número finito de bits, o número será arredondado, para caber nesse número de bits. Daí o erro em sua representação. O arredondamento pode ser para mais ou para menos, como acabamos de ver. Tudo depende do valor a ser abandonado. Se esse valor for maior que metade da unidade representada pelo último bit, arredonda-se para cima, somando-se 1 ao último bit representado. Se esse valor for menor que metade da unidade representada pelo último bit, arredonda-se para baixo, eliminando-se os bits a partir do vigésimo quarto. No caso de precisão dupla, onde se tem 52 bits após a vírgula, o erro no arredondamento será menor: 0,8 = 1,100110011001100110011001100110011001100110011001100110011... x 2-1 A parte a ser abandonada é maior que metade da unidade, pois é 0,1001100... Logo, arredonda-se para cima, somando-se 1 ao última bit: 0,8 = 1,1001100110011001100110011001100110011001100110011010 x 2-1 = A A - 0,8 = (10 - 1,100110011...) x 2-1 x 2-52 A - 0,8 = (2 - 1,6).2-53 = 4,44089...10-17 A = 0,8000000000000000444089... Cálculo Numérico aula 04 1. Erros Vamos supor o seguinte problema: como calcular o valor de 2 ? Provavelmente, a primeira resposta que vem a mente de qualquer pessoa que nasceu no século XX será: utilizando uma calculadora ou um computador. Indiscutivelmente, essa é a resposta mais sensata e prática. Porém, um profissional que utilizará o resultado fornecido pela calculadora para uma atividade como projetar, construir ou manter pontes, edifícios, máquinas, dispositivos eletrônicos, etc., não pode aceitar o valor obtido antes de fazer alguns questionamentos (pelo menos uma vez na sua vida profissional!). Quando calculamos, por exemplo, o valor de 2 em uma calculadora ou em um computador, o que realmente estamos fazendo? Em outras palavras, o que a calculadora fez para obter o resultado? E mais ainda: qual é a confiabilidade do resultado que obtemos? 1.2 Erro absoluto e erro relativo. Essa pergunta faz sentido, pois 2 é um número irracional, isto é, não existe uma forma de representá-lo com um número finito de algarismos. Portanto, o número apresentado pela calculadora é uma aproximação do valor real de 2 , já que ela não pode mostrar infinitos algarismos. E quão próximo do valor real está o resultado mostrado? Vamos definir a diferença entre o valor real da grandeza que queremos calcular e o valor aproximado que efetivamente calculamos como sendo o erro, ou seja: erro = valor real – valor aproximado Quanto menor for esse erro, mais preciso será o resultado da operação. Essa definição corresponde ao erro absoluto de um cálculo. Porém, se estivermos lidando com números muito grandes, o erro pode ser grande em termos absolutos, mas o resultado ainda será preciso. E o caso inverso também pode ocorrer: um erro absoluto pequeno, mas um resultado impreciso. Por exemplo, digamos que o resultado de uma operação nos forneça o valor 2.123.542,7 enquanto o valor real que deveríamos obter é 2.123.544,5. O erro absoluto neste caso é 1,8. Comparada com o valor real, essa diferença (o erro) é bem pequena, portanto, podemos considerar o resultado preciso. Em outro caso, digamos que o resultado da operação seja 0,234 e o resultado esperado era 0,128. Desta vez o erro será igual a 0,106 , porém o resultado é bastante impreciso. A fim de evitar esse tipo de ambigüidade, podemos criar uma nova definição. Podemos definir o erro relativo, que corresponde ao quociente entre o erro absoluto e o valor aproximado da grandeza a ser calculada, ou seja: aproximado valor aproximado valor - real valorerro = O erro relativo é uma forma muito mais geral de se avaliar a precisão de um cálculo efetuado. Nos exemplos, teremos um erro relativo de 0,0000008 ou 0,00008% no primeiro caso e um erro relativo igual a 0,83 ou 83% no segundo. Como vimos na seção anterior, ao se tentar representar um número real em ponto flutuante, normalmente, ele é arredondado, de modo a poder ser escrito no número finito de bits onde precisa ser armazenado. Dessa forma, é, automaticamente, introduzido um erro e ele não mais representa o número desejado. Ainda assim, é possível determinar o maior erro relativo possível dessa representação. Vamos admitir que, no nosso sistema, a mantissa seja representada em m bits. Seja o número a, que representado na forma normalizada seria: 1,b x 2c . Vamos admitir que c esteja dentro dos limites dessa representação, caso contrário teríamos overflow. Entretanto, a mantissa b precisa caber no número previsto de bits, reservados para a mantissa. Isso pode levar à necessidade de arredondar a mantissa b, introduzindo erro. Considere, por exemplo, que o número a seja : a = 1,101010110100101… x 2 c e que m, número de bits da mantissa, seja 5. Teríamos que escrever a como sendo: 1,10101 x 2c , abandonando 0,000000110100101... x 2c, queseria o erro introduzido. O erro de a será, portanto: Erroa = 0,0110100101… x 2c-5 , onde 5 é o valor de m, número de bits da mantissa. O erro relativo será: Ea = Erroa / a , isto é: 0,0110100101… x 2c-5 / 1,101010110100101… x 2c Ea = 0,0110100101… x 2-5 / 1,101011110100101… O erro relativo será máximo, quando tivermos o maior numerador e o menor denominador, isto é: Ea (max) = 0,01111111….. x 2-5 / 1,0000000… Lembrando que 0,0111112…. < 0,510 , tem-se: Ea (max) < 0,5 x 2-5, onde 5 está representando m, número de bits da mantissa. Portanto, Ea (max) < 2 –(m+1) . Assim, o número de bits da mantissa condiciona a precisão com que se pode trabalhar. A expressão do erro máximo, só é válida na região normalizada, pois na região não normalizada, bem próxima a zero, pelo underflow gradual, fica reduzida a precisão dos números que passam a não ter mais m+1 dígitos significativos, preço necessário para se obter valores mais próximos do zero. O número de bits do expoente indica a faixa de variação dos números possíveis, indicando os limites, fora dos quais haverá overflow ou underflow. 1.3 Erros de arredondamento e de truncamento. O erro cometido ao se calcular o valor de 2 , por exemplo, é apenas um tipo de erro que pode surgir ao se resolver um problema real. Outros tipos de erros também podem aparecer devido a outros tipos de problemas ou limitações. A solução matemática de um determinado problema envolve diversas etapas, como discutido na introdução desta disciplina. A solução do problema se inicia com a criação de um modelo matemático do sistema em questão. Esse modelo sempre apresentará aproximações e limitações. Além disso, na grande maioria das vezes, dados experimentais serão utilizados para se obter a solução. Como toda medida experimental apresenta uma incerteza, a solução do problema será influenciada pelas mesmas. Portanto, logo de início, existem diversos fatores que introduzem incertezas na solução numérica do problema. Esse tipo de erro é chamado de erro inicial. O problema discutido para o cálculo de 2 , que se refere a inevitável limitação na representação de números irracionais (por exemplo), introduz erros no resultado. Esse tipo de erro é chamado de erro de arredondamento. Outro exemplo, já discutido de erro de arredondamento refere-se à conversão de números, como 0,4 para a representação binária, e o valor verdadeiro armazenado. Vamos ilustrar, considerando a máquina hipotética que armazena números reais utilizando 1 bit para o sinal do número, 3 bits para o expoente e 8 bits para a mantissa: 0,4 = 0,011001100110... = 1,100110011001100... x 2-2 Como a mantissa tem só 8 bits desprezamos: 0,000000001001100... x 2-2 Porém, é preciso arredondar o último termo somando 1 pois é maior que a metade do último termo: 0,4 = 1,100110011001100... = 1, 10011010 x 2-2 Dessa forma, temos outro número representado pois: 1, 10011010 x 2-2 = 0,400390625 E o erro de arredondamento será: Erro = 0,000390625 Vamos considerar outro tipo de problema prático que pode surgir ao realizarmos determinadas operações: considere o cálculo do valor de xe . Mais uma vez, iremos utilizar uma máquina digital (calculadora ou computador). Porém: Como esse equipamento irá realizar essa operação? Sabemos que a exponencial é uma função que pode ser representada por: ... !n x... ! x ! x ! xxe n x +++++++= 432 1 432 Como a exponencial é uma série infinita, na prática é impossível calcular seu valor exato. Portanto, mais uma vez, teremos que fazer uma aproximação, que levará a um erro no resultado final de xe . Neste caso, faremos um truncamento dessa série, e o erro gerado no valor de xe é chamado de erro de truncamento. Para ilustrar, considere um cálculo da exponencial empregando apenas os 4 primeiros termos da série, isto é: ! x ! xxex 32 1 32 +++≅ Desprezando os termos de potência maiores do que 4, ou seja, truncamos a série no termo de potência de ordem 3. Vamos calcular essa aproximação de xe para x = 2. Obtemos: 3333362 ,e = , que é um valor com erro de truncamento bem significativo quando comparado com o valor 3890672 ,e = obtido numa máquina (calculadora ou computador) que armazena uma quantidade maior de termos da série. Cálculo Numérico aula 05 1. Erros Vamos supor que queremos calcular o valor de 52 e− . Como visto anteriormente, ao calcularmos o valor de 2 , teremos que realizar um arredondamento, que leva ao um resultado aproximado de 2 , ou seja, existe um erro de arredondamento associado ao resultado. Para calcularmos o valor de 5e teremos que fazer um truncamento, que também irá gerar um erro no resultado obtido. Portanto, o resultado da operação de subtração entre 2 e 5e apresentará um erro que é proveniente dos erros nos valores de 2 e 5e separadamente. Em outras palavras, os erros nos valores de 2 e 5e se propagam para o resultado de 52 e− . Podemos concluir então que, ao se resolver um problema numericamente, a cada etapa e a cada operação realizada, devem surgir diferentes tipos de erros gerados das mais variadas maneiras, e estes erros se propagam e determinam um erro no resultado final obtido. A propagação de erros é muito importante, pois, além de determinar o erro final de uma operação numérica, ela também determina a sensibilidade de um determinado problema ou método numérico. Se uma pequena variação nos dados de entrada de um problema levar a uma grande diferença no resultado final, considera-se que essa operação é mal- condicionada, ou seja, existe uma grande propagação de erros nessa operação. Por outro lado, se uma pequena variação nos dados de entrada leva a apenas uma pequena diferença no resultado final, então essa operação é bem-condicionada. 1.4 Análise de erros Vamos agora examinar os erros mais comuns que aparecem quando um computador manipula os números. O primeiro tipo de erro corresponde aos erros de arredondamento e truncamento que está presente na forma como computadores lidam com números, pois precisam representar os números com uma quantidade finita de algarismos. Vamos supor, para simplificar o exemplo, um computador hipotético com uma representação de ponto flutuante na base decimal (b=10) e uma mantissa de 4 algarismos (m=4). Para representarmos em ponto flutuante nesse computador, por exemplo, o número 734,68 : teríamos que truncá-lo para: 0,7346×103 ou arredondá-lo para: 0,7347×103. Portanto, no truncamento, estaríamos cometendo um erro de 0,8×10-1 e no arredondamento, um erro de 0,2×10-1. Podemos generalizar esse exemplo e dizer que, em uma representação de ponto flutuante na base b e mantissa de m algarismos, os erros de truncamento serão dados por: erro < baseexpoente – nº algarismos mantissa ou, meberro −< E os erros de arredondamento serão dados por: meberro −< 2 1 Portanto, para uma representação numérica com m = 23 ou m = 52 (como padronizado para a maioria dos computadores) esse erro é muito pequeno. É importante lembrar que apesar de pequeno, esse erro se propagará nas operações aritméticas realizadas pelo computador. Vamos tomar como exemplo a soma dos números 6563 (= 0,6563×104) e 3,375 (= 0,3375×101) no nosso computador fictício de mantissa com 4 algarismos. A soma desses dois números corresponde a 6566,375. Como nosso computador pode representar com apenas 4 algarismos, o resultado dessa operação será 0,6566×104 = 6566. Ou seja, apesar de partirmos de dois números exatos, o resultado da soma não será exata. Mais uma vez, para um computador real, esse erro é pequeno, porém, se um número muito grande de operações for realizado e se existir a necessidade de se obter um resultado bastante preciso, será preciso se levar em consideração esse tipo de erro para avaliar o resultado obtido. Existe mais um tipo de erro que aparece quando computadores manipulam números. Esse erro se refere à conversão de números de uma base para a outra. O tipo de conversãomais comum é da base decimal (usada por humanos) para a base binária (usada por computadores) e vice-versa. Um exemplo bastante peculiar é o número 0,1. Ao convertermos esse número da base decimal para a base binária (já fizemos essa conversão em exercícios), obtemos como resposta: 0,1 = 0,0001100110011...2 Portanto, notamos que, ao se converter o número 0,1 da base decimal para a base binária, obtemos um número com infinitos algarismos! Como esse número não pode ser representado pelo computador, ele será truncado, introduzindo um erro na sua representação. Uma forma interessante de constatar esse problema é escrevendo um pequeno programa que calcule o valor de ∑ = 10000 1 10 i , Processando, você verá que esse resultado não é 1000, más encontraremos: 999,902893066406. Para a análise dos erros nas operações aritméticas de com ponto flutuante, temos em foco problemas com o seguinte enunciado: Num sistema de aritmética de ponto flutuante de três dígitos (que é outra forma de dizer que a máquina armazena os números em uma mantissa de 3 algarismos) qual seria o resultado da operação (0,835 × 103 ) × (0,689 × 102) × (0,787 × 105)? O valor exato dessa operação seria: 0,452772905 × 1010. A máquina efetuará cada operação e, para cada resultado, ela registra na memória o valor truncado ou arredondado, de acordo com o processo programado na mesma. Usando o truncamento temos: Na primeira multiplicação que tem como valor exato: 0,575315 × 105, armazenamos: 0,575 × 105 Em seguida esse valor é multiplicado por 0,787×105, resultando exatamente 0,452525 x 1010, e registrado na memória o valor 0.452 . 1010. Na primeira operação já subsiste um erro que será levado para a segunda operação onde novo erro será cometido. Note a diferença entre o resultado exato: 0,452772905 × 1010 e o resultado sem truncamento após a segunda operação: 0.452 . 1010 É fundamental que se conheça a limitação da máquina para que se tenha confiança no resultado final da operação. Imagine que os valores iniciais sejam as arestas de um paralelepípedo e que a operação represente o volume do mesmo. Até que ponto é confiável o resultado? Estimativa de erros nas operações aritméticas de ponto flutuante Sejam x e y os valores absolutos exatos de dois números e x’ e y’ os valores absolutos arredondados ou truncados num sistema aritmético de ponto flutuante. De acordo com a definição de erro absoluto, temos: x = x’ + ex e, y = y’ + ey Para um número n, en = n - n’ torna-se o erro absoluto, enquanto o erro relativo será: En = en/n’. Estimando os erros nas operações: Adição x + y = (x’ + ex) + (y’ + ey) = (x’ + y’) + (ex + ey) Erro absoluto (ead): ex+y = ex + ey Erro relativo (Ead): )'y'x( 'yE )'y'x( 'xE )'y'x( 'y 'y e )'y'x( 'x 'x e )'y'x( )ee( )'y'x( e E yx yxyxyx yx + ⋅+ + ⋅= + ⋅+ + ⋅= + + = + = ++ Portanto, Ex+y = Ex × [x’/(x’ + y’)] + Ey ×[y’/(x’ + y’)] Subtração x - y = (x’ + ex) - (y’ + ey) = (x’ - y’) + (ex - ey) Erro absoluto (esub): ex-y = ex - ey Erro relativo (Esub): )'y'x( 'yE )'y'x( 'xE )'y'x( 'y 'y e )'y'x( 'x 'x e )'y'x( )ee( )'y'x( e E yx yxyxyx yx − ⋅− − ⋅= − ⋅− − ⋅= − − = − = −− Portanto, Ex-y = Ex × [x’/(x’ - y’)] - Ey ×[y’/(x’ - y’)] Multiplicação x × y = (x’ + ex) × (y’ + ey) = (x’ × y’) + (x’ × ey) + (y’ × ex) + (ex × ey) como (ex × ey) é muito pequeno, pode-se escrever: x × y = (x’ + ex) × (y’ + ey) = (x’ × y’) + (x’ × ey) + (y’ × ex) Erro absoluto (emult): ex×y = (x’ × ey) + (y’ × ex) Erro relativo (Emult): Ex×y = ex×y/(x’× y’) = [(x’ × ey) + (y’ × ex)]/(x’×y’) = = (x’ × ey)/(x’×y’) + y’ × ex)/(x’×y’)= ey/y’ + ex/x’ Portanto, Ex×y = ex/x’ + ey/y’ = Ex + Ey Divisão ( ) ( ) ⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛ + × + = + + = 'y ey )e'x( e'y e'x y x y x y x 1 1 Analisando ⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛ + 'y ey1 1 como ...xxx )x( +−+−≈ + 321 1 1 , onde 'y e x y= obtemos, 'y e 'y e y y −≈ ⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛ + 1 1 1 , abandonando-se os termos em x2 , x3... fica, 'y'y ee 'y'y e'x 'y e 'y 'x 'y e 'y e'x y x yxyxyx × × − × × −+=⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛ −× + = 1 e finalmente, 'y'y e'x 'y e 'y 'x y x yx × × −+≈ , pois (ex × ey) é muito pequeno Erro absoluto (ediv): 'y'y e'xe'y 'y'y e'x 'y ee yxyxy/x × ×−× = × × −≈ Erro relativo (Ediv): ( ) yx yx yx y/x EE'y e 'x e 'y/'x 'y'y e'xe'y E −=−= ⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛ × ×−× = Exemplos de avaliação dos erros em aritmética de ponto flutuante: 1. Calcular o erro absoluto e o erro relativo ao ser efetuado o cálculo de x+y×z num sistema de aritmética de ponto flutuante de 4 dígitos, sendo x = 0.65237 × 106; y = 0.23465 × 102 e z = 0.367891 × 104 Adotando o truncamento, pois temos apenas 4 posições para armazenamento. O valor real de x+y×z é 0,65237 × 106 + 0,08632562315 × 106 = 0,73869562315 × 106. Ao efetuar o cálculo, a cada operação se faz a aproximação para os 4 dígitos do sistema. Assim, y’×z’ = 0,0863 x 106 e x’ + y’×z’ = 0,7386 × 106. Erro absoluto cometido: 0,73869562315 × 106 – 0,7386 × 106 = 0,000039562315 × 106 = 0,3956 × 102. Erro relativo: Eop = eop/ (x’ + y’×z’) = 0.39562315 × 102/0.7386 × 106 = 0.5357 × 10-4. 2. Considere x = 0.5124 × 104, y = 0.123 × 102 e z = 0.8867 × 103. Para um sistema aritmético de ponto flutuante com 3 dígitos, calcule os erros absoluto e relativo ocorridos nas operações, usando o processo de arredondamento. Vamos calcular: a) x + y b) z × x c) 2 × x Calculando os erros absolutos: - pelo arredondamento de cada número em função do tamanho da mantissa: x = 0,5124 x 104, considerando os 3 dígitos: x’ = 0,512 × 104 (apenas truncamos) ex = x – x’ = 0,5124 × 104 – 0,512 × 104 = 0,0004 × 104 = 0,400 × 101. Ex = ex/x’ = 0,4000 × 101/0,512 × 104 = 0,781 × 10-3. y = 0,123 × 102, considerando os 3 dígitos: y’ = 0,123 × 102 ey = y – y’ = 0 e Ey = ey/y’ = 0. z = 0,8867 × 103, considerando os 3 dígitos: z’ = 0,887 × 103 (com arredondamento), ez = z – z’ = 0,8867 × 103 – 0,887 × 103 = -0,0003 × 103 Ez = ez/z’ = -0,3/0,887 × 103 = -0,338 × 10-3. Efetuando agora os cálculos, temos: a) x + y ex+y = ex + ey = 0,4000 × 101 + 0 = 0,4000 × 101. Ex+y = Ex × [x’/(x’+y’)] + Ey × [y’/(x’+y’)] = = 0,781×10-3× [(0,512×104)/(0,512×104+0,123×102)] + 0 × [(0,123×102)/(0,512×104+0,123×102)]= = 0.781×10-3 × [0.512 × 104/(0.512 × 104 + 0.123 × 102)] = 0.779 x 10-1. b) z × x ez×y = (z’×ey) + (y’×ez) = 0,887×103 × 0 + 0,123×102× -0,3 = -0,369×101 Ez×y = Ez + Ey = -0,338 × 10-3 + 0 = -0,338 × 10-3 c) 2 × x e2x = 2 × ex = 2 × 0,400 × 101 = 0,8000 × 101 e, E2x = 2 × Ex = = 2 × 0,781 ×10-3 = 0.156 × 10-2. Cálculo Numérico aula 06 2. Zeros de funções reais Dada uma função f(x), dizemos que α é raiz, ou zero de f se e somente f(α)=0. Graficamente, os zeros de uma função correspondem ao ponto x em que a função intercepta o eixo do gráfico, como mostrado no exemplo abaixo: A função g(x) acima tem 5 raízes no intervalo [a,b]: x1, x2, x3, x4, x5. As raízes de uma função podem ser encontradas analiticamente, ou seja, resolvendo a equação f(x) = 0 de maneira exata, como mostrado nos exemplos abaixo: 1) 3−= x)x(f x = 3 é raiz, pois f(3) = (3) – 3 = 0 2) 4 3 8 −= x)x(g x = 3/2 é raiz, pois g(3/2) = (8/3)⋅(3/2-4 = 0 3) 652 +−= xx)x(h x1 = 2 é raiz, pois h(2) = (2)2 -5(2) + 6 = 0 e x2 = 3 é raiz, pois h(3) = (3)2 -5(3) + 6 = 0 Porém, nem sempre é possível encontrar analiticamente a raiz de uma função, como nos exemplos a seguir: 1) 12 23 +−+= xxx)x(f 2) xe)x(sen)x(g += 3) )xln(x)x(h += Nestes casos precisamos de um método numérico para encontrar uma estimativa para a raiz da função estudada. Um método numérico para se encontrar os zeros de uma função deve envolver as seguintes etapas: i) Determinar um intervalo em x que contenha pelo menos uma raiz da função f(x), ou seja, isolar as raízes;ii) Calcular a raiz aproximada através de um processo iterativo até a precisão desejada. Existe um grande número de métodos numéricos que são processos iterativos. Como o próprio nome já diz, esses processos se caracterizam pela repetição de uma determinada operação. A idéia nesse tipo de processo é repetir um determinado cálculo várias vezes, obtendo-se a cada repetição ou iteração um resultado mais preciso que aquele obtido na iteração anterior. E, a cada iteração utiliza-se o resultado da iteração anterior como parâmetro de entrada para o cálculo seguinte. Existem diversos aspectos comuns a qualquer processo iterativo, que iremos discutir abaixo: o Estimativa inicial: como um processo iterativo se caracteriza pela utilização do resultado da iteração anterior para o cálculo seguinte, a fim de se iniciar um processo iterativo, é preciso ter uma estimativa inicial do resultado do problema. Essa estimativa pode ser obtida de diferentes formas, conforme o problema que se deseja resolver; o Convergência: para obtermos um resultado próximo do resultado real esperado, é preciso que a cada passo ou iteração, nosso resultado esteja mais próximo daquele esperado, isto é, é necessário que o método convirja para o resultado real. Essa convergência nem sempre é garantida em um processo numérico. Portanto, é muito importante estar atento a isso e verificar a convergência do método para um determinado problema antes de tentar resolvê-lo; o Critério de Parada: obviamente não podemos repetir um processo numérico indefinidamente. É preciso pará-lo em um determinado instante. Para isso, devemos utilizar um critério, que vai depender do problema a ser resolvido e da precisão que desejamos obter na solução. O critério adotado para parar as iterações de um processo numérico é chamado de critério de parada. Para encontrarmos as raízes ou zeros de uma função iremos utilizar métodos numéricos iterativos. Portanto, teremos que abordar todos esses aspectos nos métodos que utilizaremos. Como mencionado acima, o primeiro passo para resolver um processo iterativo corresponde a obtenção de uma estimativa inicial para o resultado do problema. No caso de zeros de funções, essa operação é chamada de isolamento de raízes, que veremos na seção seguinte. 2.1 Isolamento das raízes Para determinarmos o número e a localização aproximada de raízes de uma função para obtermos uma estimativa inicial a ser usada nos processos iterativos, podemos examinar o comportamento dessa função através de um esboço gráfico ou de uma análise teórica. Método Gráfico Como já foi observado, determinar os zeros de f é equivalente a determinar as raízes da equação f(x) = 0. Tendo em vista esta observação o método gráfico consiste em: o Escrever f como uma diferença de funções g e h, ou sejam f = g – h onde possamos sem muito esforço esboçar os gráficos das funções g e h; o Usar f(x) = 0 ⇔ g(x) = h(x); o Esboçar, da melhor maneira possível, os gráficos de g e h e determinar por inspeção os intervalos onde estão os pontos de intersecção de g(x) e h(x), ou seja, os pontos xi onde g(xi) = h(xi) Exemplos: 1) Determinar os zeros da função 22 −+= xe)x(f x Solução: f(x) = 0 ⇔ 022 =−+ xex ⇔ 22 xex −= Assim temos xe)x(g = e 22 x)x(h −= , veja o gráfico: Portanto verificamos os zeros de f : x1 ∈ [ 2− ,0] e x2 ∈ [0, 2 ] 2) Determinar os zeros da função x)xln()x(f += Solução: f(x) = 0 ⇔ 0=+ x)xln( ⇔ x)xln( −= Assim temos )xln()x(h = e x)x(g −= , veja o gráfico: Portanto verificamos o zero de f : x ∈ [0,1] 3) Determinar os zeros da função xe)x(f x 1−= Solução: f(x) = 0 ⇔ 01 =− xex ⇔ xex 1= Assim temos x)x(g 1= e xe)x(h = , veja o gráfico: Portanto verificamos o zero de f : x ∈ [0,1] Uma vez mais salientamos que esboçar os gráficos de g e h da melhor forma possível facilitará a inspeção para determinar os intervalos onde estão os pontos de intersecção de g(x) e h(x). Cálculo Numérico aula 07 2.1 Isolamento das raízes O esboço gráfico nem sempre é a forma mais prática de se obter um intervalo que contém pelo menos uma raiz da função f(x). Muitas vezes é preciso se utilizar um método algébrico. Método Analítico Uma propriedade que pode ser usada para a localização de intervalos que contém a raiz consiste em: “se f(x) é uma função contínua no intervalo [a, b] e f(a).f(b) < 0 então existe pelo menos um valor r entre a e b que é zero de f(x)”. A propriedade acima afirma que f(a) ⋅ f(b) < 0 existirá obrigatoriamente uma raiz no intervalo [a, b]. É evidente que se f(a) ⋅ f(b) = 0, pelo menos um dos fatores f(a) e f(b) será uma raiz de f(x). Entretanto, se f(a) ⋅ f(b) > 0 não é garantida a não existência de raízes no intervalo [a, b]. Usando as informações e observando o gráfico acima, temos: o Intervalo [a1, b1], f(a1) < 0 e f(b1) > 0 ⇒ f(a1).f(b1) < 0 ⇒ existe pelo menos uma raiz no intervalo [a1, b1]. Observamos que r1 é a única raiz no intervalo [a1, b1]. o Intervalo [a2, b2], f(a2) = 0 e f(b2) < 0 ⇒ f(a2).f(b2) = 0. Neste caso a2 ou b2 é raiz. Como pode ser notado a2 é raiz de f(x). o Intervalo [a3, b3], f(a3) < 0 e f(b3) < 0 ⇒ f(a3) ⋅ f(b3) > 0. Embora o produto seja positivo, existem duas raízes no intervalo: r2 e r3. o Intervalo [b2, a3], f(b2) < 0 e f(a3) < 0 ⇒ f(b2) ⋅ f(a3) > 0 e no intervalo não existem raízes de f(x). A derivada da função é muito útil para reconhecer se no intervalo [a, b], tal que f(a) ⋅ f(b) < 0, existe mais de uma raiz. Se no intervalo a função é crescente temos f’(x) > 0 e, se a função for decrescente f’(x) < 0. Se o sinal da derivada não modificar no intervalo, então nesse intervalo existe uma e somente uma raiz ou zero. Para obter intervalos onde se localizam as raízes podemos construir uma tabela com valores atribuídos a x e calcular os valores correspondentes de f(x). Exemplos: i) seja a função: f(x) = x3 – 8x + 6 Calculando f(x) para alguns valores de x temos: x -5 -4 -3 -2 -1 0 1 2 3 4 5 f(x) -79 -26 3 14 12 6 -1 -2 9 38 91 sinal - - + + + + - - + + + A tabela pode ser construída com ajuda de uma planilha, da seguinte forma: o Nas células superiores, digamos C2, D2, ..., M2, foram digitados valores para x; o Na célula C3, foi inserida a fórmula f(x) = x3 – 8x + 6, digitando = C2^3 - 8*C2 + 6 e a seguir ENTER; o Selecionando C3, a fórmula foi copiada para as células D3, E3, ..., M3; o Na célula C4, foi digitado = SE (C3 < 0; "-"; "+") para serem exibidos os sinais de f(x); o A seguir, a fórmula de C4 foi copiada para as células D4, E4, ..., M4. Na tabela verifica-se que ocorre mudança de sinal nos intervalos: [-4, -3], [0, 1] e [2, 3] Como a função é polinomial do terceiro grau, teremos apenas 1 raiz em cada um dos intervalos. i) seja agora a função: g(x) = 50x3 – 65x2 + 26x – 3. Calculando f(x) para alguns valores de x temos: x -1 0 1 2 3 g(x) -144 -3 8 189 840 sinal - - + + + Observa-se na tabela apenas uma mudança de sinal no intervalo [0, 1]. Pode- se esperar que exista 1, ou 2 ou 3 raízes nesse intervalo. Devido à incerteza, vamos analisar os intervalos onde a função é estritamente crescente ou decrescente. Para isso, podemos derivar a função e fazer uma análise da mesma. Neste caso teremos: g’(x) = 150x2 – 130x + 26. Estudando a variação do sinal de g'(x): ... g’(x) é uma função do 2º grau, logo: ∆ = 1302 – 4.150.26 = 1300 ⇒ e obtemos, x1 ≅ (130 + 36,05)/300 = 0,554 e, x2 = (130 - 36,05)/300 = 0,31. Como, nessa função A > 0, teremos: o g’(x) > 0 (função crescente) para x < 0,31 ou x > 0,554 e, o g’(x) < 0 (função decrescente) para 0,31 < x < 0,554. Vamos completar a tabela com os valores de x e f(x) para 0,31 e 0,554, temos: (ainda contando com o auxilio da planilha ...) x -1 0 0,31 1 0,554 2 3 g(x) -144 -3 0,303 8 -0,044 189 840 sinal - - + + - + + Da nova tabela pode-se concluir que existe uma raiz emcada um dos intervalos [0, 0.31], [0.31; 0.554] e [0.554; 1]. Encerrando essa seção, observamos que na fase de isolamento de raízes podemos aliar os métodos, gráfico e analítico, para determinar os intervalos onde estão localizados os zeros da função. Em particular, se empregamos uma planilha para tentar esboçar gráficos de f(x), poderemos também aplicar o método analítico. Cálculo Numérico aula 08 2.2 Refinamento Existem vários métodos numéricos de refinamento de raiz. A forma como se efetua o refinamento é diferencia os métodos. Todos eles pertencem à classe dos métodos iterativos. Um método iterativo torna possível determinar um valor aproximado para o ou os zeros de uma função. Consiste em executar instruções, passo a passo tendo como base o resultado anterior, sendo que algumas dessas instruções são repetidas. O processo deve ser continuado até que se atinja um resultado próximo ao esperado ou cujo erro seja inferior a um valor conhecido. Seja uma função f(x) com uma raiz r no intervalo [a, b]. Uma raiz r’ é dita aproximada com a precisão ε, se (1) |r’ – r| < ε, ou (2) r’ ∈ [a, b] e b – a < ε. No primeiro caso, a raiz exata deve ser conhecida, o que geralmente não acontece. Para o segundo caso, r´ pode ser qualquer valor pertencente ao intervalo. Nos itens a seguir veremos alguns métodos para o refinamento das raízes. Método da Bissecção O princípio fundamental do método da bissecção consiste em localizar a raiz em um intervalo [x1, x2], onde a função é estritamente crescente ou estritamente decrescente, é considerar a raiz aproximada como o ponto médio desse intervalo, ou seja, a raiz será: 2 )( 21 xx + . Para que a raiz pertença a tal intervalo, nas condições citadas, devemos ter f(x1).f(x2) < 0. Nesta consideração o erro cometido será menor ou igual à metade da amplitude do intervalo [x1, x2]. Isto é: erro = ε < | x1, x2|. Veja figura: Para tornar o erro menor, pode-se dividir o intervalo em dois intervalos de amplitude igual à metade da amplitude do intervalo anterior. Para isso, tomemos 2 )( 21 3 xxx += . A raiz estará no intervalo ⎥⎦ ⎤ ⎢⎣ ⎡ + 2 )(, 211 xxx se 0) 2 )(()( 211 < + ⋅ xxfxf , ... caso contrário, ela estará no intervalo ⎥⎦ ⎤ ⎢⎣ ⎡ + 2 21 , 2 )( xxx Veja figura: A repetição do processo fará com que, a cada iteração o ponto médio do intervalo se aproxime cada vez mais da raiz. Assim, o processo deverá ser continuado até que se obtenha uma aproximação com erro inferior ao solicitado. Como o processo é iterativo (repetições de cálculos) podemos usar a planilha para facilitar os cálculos. Vejamos exemplos práticos: 1) considere a função: f(x) = 5x2 + ln |2x – 3| - 3 Vamos pesquisar os zeros, considerando um erro menor ou igual a 0,001. Inicialmente, empregando o editor gráfico da planilha vamos plotar o gráfico da função: Podemos empregar os métodos para isolamento das raízes, más observando o gráfico, podemos notar que existem duas raízes: uma no intervalo [-1, 0] e outra no intervalo [0, 1]. Utilizaremos o intervalo [0, 1] para empregar o método da bissecção para encontrar uma aproximação para a raiz pertencente a esse intervalo. Empregando a planilha, siga as instruções: i) identificando as colunas: – usaremos as células indicadas: ii) especificando os conteúdos das células: o x1 em C10 – digite o limite inferior do intervalo (no caso, 0); o (x1+x2)/2 em D10 – ponto médio do intervalo. Digite = (C10 + E10)/2 e, ENTER. (Lembre-se que para exibir as referências às células você pode clicar na célula.) o X2 em E10 – digite o limite superior do intervalo (no caso, 1) o f(x1) em F10 – digite, = 5*C10^2 + ln(ABS(2*C10 – 3)) – 3 e, ENTER. A função ABS calculará o valor absoluto de 3x – 2. o f((x1+x2)/2) e f(x2), respectivamente em G10 e H10: copie a fórmula da célula F10. o no cálculo da raiz em I10: digite: =SE(J10>=K10;"continua";D10). Esta coluna indicará até onde deve ser dado continuidade ao processo. O primeiro número após o texto "continua" será a raiz com erro menor ou igual à precisão solicitada, que no caso é 0,001. o O erro será calculado em J10: digite: =ABS(ABS(C10)-ABS(D10)). Nesta coluna você irá obter a amplitude do intervalo. Como estamos usando o ponto médio do intervalo o erro máximo cometido será a metade da amplitude do intervalo [xi, xi+1]. o Em K10 digite o valor da precisão indicada no enunciado, no caso: 0,001. o Para a próxima iteração: em C11 digite: =SE(F10*G10<0;C10;D10). o Em D11 : copie a fórmula da célula D10. o E em E11 digite: =SE(F10*G10<0;D10;E10). As fórmulas das células C11 e E11, farão com que sejam escolhidos os limites inferior e superior do novo intervalo. o Nas células: F11, G11, H11 e I11 copie as fórmulas das células F10, G10, H10 e I10. o Reduzindo o intervalo, que é o erro, em J11 digite: = J10/2 o E para anotar a precisão em K11 - digite: = K10. Copie as fórmulas das células C11 a K11 para as células inferiores... Selecione todas as células e arraste para as células inferiores. iii) concluindo, veja como ficam os valores calculados ao usar a planilha: Na célula I19 temos a raiz aproximada da equação com erro inferior a 0,001, em 10 iterações. Note que: “o número de algarismos após a vírgula deve se igual ao número de algarismos após a vírgula exibido na previsão do erro (0,001). Desta forma, a raiz da equação resolvida é 0,713 se usado o processo de truncamento ou 0,714 se usado o processo de arredondamento. O mesmo algoritmo pode ser usado para obter a aproximação da raiz no intervalo [-1, 0]. Neste caso basta substituir os valores 0 e 1 das células C10 e E10 por –1 e 0, respectivamente. E para usar novamente essa planilha para outra funções, basta copiar o conteúdo do intervalo de células C10 até K11 para outra região na planilha, digamos a partir da célula C30 e recomeçar o trabalho modificando a função digitada nas células F10, G10 e H10. Esse é nosso procedimento para o próximo exemplo... 2) considere agora a função: f(x) = ex +x2 - 2 ... empregando o método gráfico conseguimos isolar dois intervalos dos zeros dessa função, veja a ilustração: Portanto verificamos os zeros de f : x1 ∈ [ 2− ,0] e x2 ∈ [0, 2 ] Vamos calcular o valor aproximado para a raiz x2 que está no intervalo [0, 2 ], adotando uma precisão de 0,0001. Veja a solução: Obtemos a raiz x2 = 0,70702 com erro inferior à precisão desejada de 0,0001 em 14 iterações. Cálculo Numérico aula 09 2.2 Refinamento Método de Newton-Raphson Seja f(x) uma função cujas raízes devem ser determinadas com uma precisão menor ou igual a certo valor ε dado. O método consiste em uma série de aproximações do zero de f(x) usando como raiz aproximada o zero da equação da reta tangente à curva f(x), ou seja, a interseção da tangente com o eixo horizontal. Para uma visualização, considere um ponto xn+1 que é obtido traçando-se a tangente ao gráfico da função f(x) no ponto (xn, f(xn)), a intersecção da reta tangente com o eixo horizontal fornece a nova aproximação xn+1. Vide figura: A equação da reta tangente à curva f(x) no ponto (x0, y0), onde y0 = f(x0), é: y – f(x0) = f’(x0).(x – x0). Se a intersecção da tangente intercepta o eixo horizontal no ponto de abscissa x = x1, teremos y = f(x1) = 0. Substituindo os valores (x1, 0) na equação da tangente: 0 – f(x0) = f’(x0).( x1 – x0) - f(x0) = f’(x0). x1 – f’(x0).x0 f’(x0).x1 = f’(x0). x0 - f(x0) Dividindo todos os termos por f’(x0) resulta: x1 = x0 - f(x0)/f’(x0) Como cada raiz é função da raiz anterior podemos escrever a equação acima sob forma de uma função que pode ser indicada na forma: g(x) = x – f(x)/f’(x) Algebricamente, o algoritmo (ou procedimento) consiste em: (1º passo) definir a função g(x) = x – f(x)/f’(x) (2º passo) escolhe-se um valor qualquer x0 para x (3º passo) calcula-se a raiz x1, fazendo x1 = g(x0)Se | x0 – x1| < ε, então x1 é uma raiz aproximada de f(x), o que finaliza o processo pois já foi encontrada a raiz com a aproximação desejada. Caso contrário, continua o processo fazendo x2 = g(x1) e assim se prossegue até xn = g(xn-1) quando | xn - xn-1| < ε. Exemplos Vejamos como construir esse algoritmo na planilha para determinar uma aproximação para cada zero de uma dada função. 1) Tomemos a função f(x) = x2 – 2,15x – 9,37, da qual se pretende determinar os zeros com aproximação inferior a 0,001. A derivada de f(x) é: f’(x) = 2x – 2,15. 1º passo: “determinar a função g(x) = x – f(x)/f’(x)” Temos então: g(x) = x – (x2 – 2,15x – 9,37)/(2x – 2,15). 2º passo: “escolher um valor qualquer x0 para x” i) localizar os intervalos de raízes através do método gráfico: Observamos a existência de duas raízes: x1 próxima de –2 e x2 próxima de 4. Determinemos inicialmente a raiz x2. ii) vamos escolher um “valor x0” que esteja mais próximo de x2 que de x1. Nota: se o número estiver mais próximo de x1 que de x2, será obtida a raiz x2. Tomemos por exemplo x0 = 3. Usando a planilha... As células indicadas na figura abaixo servirão para referências. Você pode usar qualquer outro conjunto de células. Lembre-se que ao usar uma fórmula, não há necessidade de digitar a identificação da célula, basta clicar sobre a mesma que automaticamente a célula será exibida na fórmula. 3º passo: “calcular raiz x1, fazendo x1 = g(x0), etc.” i) Identificar os elementos envolvidos, vide figura: ii) preencher as células: o Célula K2 – digite o valor atribuído a x0., conforme indicado no 3º passo: 3 o Célula L2 – digite = K2 - (M2)/(2*K2-2,15). Você estará calculando g(3). o Célula M2 – digite a fórmula =K2^2 - 2,15*K2-9,37. Você estará calculando f(3). o Célula N2 – digite a fórmula =SE(ABS(L2-K2)>O2;"continua";L2). Você estará indicando a raiz quando a mesma satisfizer a condição erro < ε, que no caso ε = 0,001. o Célula O2 – digite o valor do limite do erro, ou seja, o valor de ε que é 0,001. o E agora as iterações: o Célula K3 – digite a fórmula = L2. Você copiará o valor de g(xi – 1) considerado como a próxima raiz. o Célula O3 – digite a fórmula = O2. Você copiará o valor do erro para a próxima célula. A vantagem de se copiar o valor da célula O2 é que bastará substituir o valor do erro desejado na célula O2 que o mesmo será exibido nas demais células da coluna O. o Selecione as células L2, M2 e N2 e copie as fórmulas para as células L3, M3 e N3, respectivamente. o Selecione agora as células K3, L3, M3, N3 e O3 e copie as formulas para as células para as linhas 4 a 11. Concluindo: o primeiro valor exibido na coluna N, após o último “continua” é a raiz aproximada com erro inferior a ε. Veja como ficou a execução do algoritmo: IMPORTANTE: na raiz deve-se considerar a mesma quantidade de algarismos após a vírgula que os apresentados no limite ε do erro aceitável. Você pode usar o processo de arredondamento ou de truncamento. Portanto uma das raízes da função f(x) = x2 – 2,15x – 9,37 com erro inferior a 0,001 é 4,319, resultado este obtido na célula N5, em 3 iterações. Vamos calcular agora a outra raiz x1 Selecione as células de J1 a O11. Copie as células (use Ctrl + C) e, clicando na célula J15 cole o conteúdo copiado (use Ctrl + V). Substitua o conteúdo da célula K16 por um valor próximo da outra raiz x1. , no caso, o número 3 exibido na célula K2 por 0. Vejamos a execução do algoritmo: Veja que na célula N20, vide figura acima, é exibido o valor dessa outra raiz, ou seja, x1 = -2,169 também com erro inferior a 0,001, em 4 iterações. Podemos usar este mesmo algoritmo para calcular as raízes de qualquer equação. Basta substituir os conteúdos das células K2, L2, M2, N2 e O2. 2) considere agora a função: f(x) = 5x2 + ln |2x – 3| - 3 Pretende-se determinar os zeros com aproximação inferior a 0,001. A derivada de f(x) é: f’(x) = 10x + 2/(2x-3). 1º passo: “determinar a função g(x) = x – f(x)/f’(x)” Temos então: g(x) = x – (5x2 + ln |2x – 3| - 3)/( 10x + 2/(2x-3)). 2º passo: “escolher um valor qualquer x0 para x” i) vamos localizar os intervalos de raízes através do método analítico: Temos duas raízes: podemos escolher x1 próxima de - 0,5 e x2 próxima de 0,5. Determinemos inicialmente a raiz x1. ii) vamos escolher um “valor x0” mais próximo de x1, x0 = -0,5. Na planilha... 3º passo: “calcular raiz x1, fazendo x1 = g(x0), etc.” i) Identificando os elementos envolvidos ... ii) preenchemos as células ... Vejamos a execução do algoritmo: Determinamos a raiz x1 = - 0,563, da função f(x) = 5x2 + ln |2x – 3| - 3, com erro inferior a 0,001 em 2 iterações. Vamos agora calcular a outra raiz: x2 Aplicando o algoritmo a partir do valor inicial x0 = 0,5 obtemos: Ou seja, a raiz x2 = 0,713, da função f(x) = 5x2 + ln |2x – 3| - 3, é obtida com erro inferior a 0,001 em 3 iterações. Cálculo Numérico aula 10 2.2 Refinamento Método da Secante Este processo para determinação de aproximações das raízes de uma função f(x) é semelhante ao método de Newton-Raphson. Nele, a equação da reta tangente é substituída pela equação da secante que corta a curva da função em dois pontos cujas abscissas definem um intervalo onde está contida a raiz. Tomemos, por exemplo, o gráfico: No gráfico, r é a raiz de f(x). Tomemos os pontos de abscissas x = x0 e x = x1 e tracemos a secante S1. A equação da secante que passa pelos pontos (x0, f(x0)) e (x1, f(x1)) é )xx( xx )x(f)x(f)x(fy 1 01 01 1 −⋅⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛ − − =− Podemos considerar como primeira aproximação para a raiz de f(x) o valor x2 que corresponde à abscissa do ponto onde a secante corta o eixo horizontal. Para este ponto x = x2 e y = 0. Substituindo os valores na equação da secante, resulta: ⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛ − − ⋅−=⇔−⋅⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛ − − =− )x(f)x(f xx)x(fxx)xx( xx )x(f)x(f)x(f 01 01 11212 01 01 10 Por x2 e x1 tracemos a secante S2. A interseção da secante com o eixo horizontal, cuja abscissa é x = x3, é a segunda aproximação para a raiz de f(x). Conforme deduzido, ⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛ − − ⋅−= )x(f)x(f xx)x(fxx 1 12 223 2 Continuando o processo, a aproximação de ordem n será: ⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛ − − ⋅−= − − + )x(f)x(f xx)x(fxx nn nn nnn 1 1 1 O processo deve continuar até que | xn + 1 – xn | < ε. Vamos usar a planilha para implementar um algoritmo que permite determinar tais raízes. Como exemplo, vamos determinar os zeros da função f(x) = ln |x| – e-3x com erro inferior a 0,0001. Passo 1 – vamos plotar a função para poder tomar dois pontos para determinação da equação da secante: Um cuidado a ser tomado na escolha dos pontos para se obter a primeira secante. o Seja, por exemplo, uma função cujas raízes são r1 e r2, tais que r1 < r2. Na determinação da raiz r2, ao escolher as abscissas x0 e x1 para o traçado da secante, deve-se fazê-lo de modo que a secante intercepte o eixo horizontal em um ponto x2 tal que x2 > r1. o Para determinação de r1, a escolha de x0 e x1 deve ser tal que a secante corte o eixo horizontal em um ponto de abscissa x2 tal que x2 < r2. Este procedimento evita a divergência do processo. Passo 2 – Identificação das colunas. Identifique as colunas conforme indicado na figura abaixo. Passo 3 – Preenchimento das células. o Preencha as células A7 e B7 com quaisquer valores para x no intervalo de definição da função: digamos 2 e 4, respectivamente. o Na célula C7 – digite =B7-E7*(B7-A7)/(E7-D7): é o cálculo da aproximação xn+1 para a raiz. o Na célula D7 – digite =LN(ABS(A7)) - EXP(-3*A7): é o cálculo do valor de f(x), onde x é o conteúdo da célula A7. o Nas células E7 e F7: copie a fórmula da célula D7. o Na célula G7 – digite =SE(ABS(C7-B7)>=H7;"continua";C7): na coluna G, seleciona-se a aproximação para a raiz com a previsão de erro. o A raiz será o primeiro númeroapós a indicação “continua”. o Na célula H7 – digite o valor da estimativa para o erro. o Na célula A8 – digite =B7 para copiar o valor xn. o Na célula B8 – digite =C7 para copiar o valor de xn+1. o Selecione as células D7, E7, F7, G7 e copie as fórmulas para as células D8, E8, F8, G8. o Na célula H8 – digite =H7 para copiar o valor do erro. o Selecione as células A8 até H8: copie as fórmulas paras as células abaixo até a linha 24. Veja como ficou a tabela: A raiz da equação é então 1,0445 com erro inferior a 0,0001 em 12 iterações. Note que o número de dígitos após a vírgula deverá ser igual ao número de dígitos após a vírgula apresentados no erro. Outra observação é que a repetição das cópias da linha 8 no exemplo, poderia ir até a linha 19, pois uma vez que alcançamos a raiz dentro da precisão desejada, alcançamos o zero da função em f(xn) e conseqüentemente temos o indicativo de divisão por zero (#DIV/0!) 3 iterações (ou linhas na planilha) depois ... Em um aplicativo computacional, estabelecemos o encontro da raiz (coluna G) como critério de parada: uma vez alcançada encerra-se o processamento e se apresenta o resultado. Em complemento ao algoritmo acima, podemos acelerar a convergência se conhecemos um intervalo onde se localiza a raiz, por exemplo, usando o método gráfico na função obtemos: Temos um zero no intervalo: x ∈ [1.0, 1.2]. E ao indicar esse intervalo como [xn – 1 , xn] para os valores iniciais, obtemos: Uma resposta em apenas 3 iterações com a precisão desejada. 2.3 Comparação entre métodos Uma comparação entre métodos deve levar em consideração vários critérios entre os quais: garantia de convergência, rapidez de convergência e esforço computacional. Observamos que o único dado que os exemplos vistos fornecem para se medir a rapidez de convergência é o número de iterações efetuadas e, como constatamos tudo dependerá dos valores com que se iniciam a execução do método. E para ilustrar a comparação vamos determinar a raiz de uma função aplicando os três métodos após determinar um intervalo que contenha uma raiz: Seja a função )xcos(e)x(f x −= − 2 : Aplicando o método analítico obtemos: O intervalo que contem a raiz será x ∈ [1, 2] vamos determinar seu valor com uma precisão de 0,0001 (ou 10-4) . Aplicando o método da bissecção obtemos: E agora aplicando o método de Newton: Finalmente com o método da secante: Como observamos, o método de Newton-Raphson é o mais rápido se consideramos o meio do intervalo inicial, x = 1.5, e os outros dois foram mais lentos embora determinassem a raiz dentro da precisão esperada. A desvantagem seria obter a derivada da função em estudo, e aí o método da secante apresenta uma facilidade em sua implantação, mesmo com algumas iterações a mais, se comparado com o método de Newton-Raphson. Concluindo, temos que observar que o sucesso na utilização de qualquer dos métodos estará associado ao isolamento adequado das raízes e também na escolha de intervalos mais precisos para ter valores iniciais mais próximos do valor do zero da função. Cálculo Numérico aula 11 3. Resolução de Sistemas de Equações Lineares Um sistema linear consiste em um conjunto de n equações lineares envolvendo m variáveis (xi). Uma equação linear é aquela que só apresenta termos que são proporcionais às variáveis (termos do tipo ai⋅xi), isto é, não apresenta nenhuma função aplicada a variável xi, como xn, ln(x), cos(x), como ilustrado abaixo envolvendo m variáveis (x1, x2, x3,...,xm): a1⋅x1 + a2⋅x2 + a3⋅x3 +... + am⋅xm = b Um sistema linear quadrado é aquele em que o número de variáveis é igual ao número de equações (m=n). Portanto, um sistema linear quadrado pode ser escrito na forma: a11⋅x1 + a12⋅x2 + a13⋅x3 +... + a1n⋅xn = b1 a21⋅x1 + a22⋅x2 + a23⋅x3 +... + a2n⋅xn = b2 a31⋅x1 + a32⋅x2 + a33⋅x3 +... + a3n⋅xn = b3 . . . an1⋅x1 + an2⋅x2 + an3⋅x3 +... + ann⋅xn = bn Resolver um sistema linear significa encontrar os valores numéricos das variáveis x1 , x2 , x3 ,..., xn que satisfazem todas as equações do sistema. Duas perguntas fundamentais devem ser feitas em relação a um sistema linear: o Existe solução para o sistema linear? o Em caso afirmativo, será que ela é única? Cada sistema linear estudado deve ser analisado para se obter respostas para essas perguntas. Três casos são possíveis: o O sistema não possui nenhuma solução (sistema impossível); o O sistema possui uma solução (sistema possível e único); o O sistema possui infinitas soluções. É preciso manter em mente essas três possibilidades de comportamento de um sistema linear a fim de evitar surpresas e poder interpretar a solução de um problema. Sistemas de equações lineares aparecem com bastante freqüência na resolução de problemas práticos envolvendo as mais variadas situações. Estima-se que aproximadamente 75% dos problemas científicos envolvem a resolução de um sistema de equações linear. Os métodos usados na resolução de sistemas lineares podem ser de dois tipos: diretos ou iterativos. o Métodos diretos são aqueles que, a menos de erros de arredondamento, fornecem a solução exata do sistema linear, caso ela exista. o Métodos iterativos são equivalentes àqueles vistos no cálculo de zeros de funções reais: a partir de uma estimativa inicial, repetimos determinado cálculo diversas vezes, utilizando sempre a estimativa da etapa anterior como estimativa para a etapa seguinte. 3.1 Métodos diretos No Ensino Médio e Fundamental, bem como na disciplina Álgebra Linear, foram discutidos métodos diretos para resolução de sistemas lineares. Entre estes métodos, encontram-se: 1) Regra de Cramer onde xi = det(Mi)/det(M) onde M é a matriz formada pelos coeficientes das variáveis e Mi é a matriz obtida ao substituir a coluna correspondente aos coeficientes da variável xi pelos termos independentes. 2) Inversão de matrizes, método este que consiste em transformar o sistema na equação matricial A.X = B, onde A é a matriz formada pelos coeficientes das variáveis, B é a matriz (vetor coluna) formada pelos termos independentes. Na solução faz-se X = A-1.B. 3) Escalonamento de matrizes, que consiste em transformar a matriz dos coeficientes em uma matriz triangular (aij = 0 quando i > j). Resolução de sistemas lineares triangulares Seja um sistema linear de variáveis x1, x2, x3,...,xn sendo aij⋅ o coeficiente da variável xj na equação i. Um sistema, assim definido, é dito sistema linear triângulo se para todo aij com i < j, tem-se aij = 0. Veja um sistema triangular genérico: a11⋅x1 + a12⋅x2 + a13⋅x3 +... + a1n-1⋅xn-1 + a1n⋅xn = b1 a22⋅x2 + a23⋅x3 +... + a2n-1⋅xn-1 + a2n⋅xn = b2 a33⋅x3 +... + a3n-1⋅xn-1 + a3n⋅xn = b3 . . . an-1n-1⋅xn-1 + an-1n = bn-1 ann⋅xn = bn O sistema triangular é de fácil solução, pois basta calcular o valor da variável xn na última equação e, em seguida, substituir o valor encontrado na penúltima equação. Segue-se o processo usando os valores encontrados anteriormente para a equação anterior até chegar à primeira equação e aí obter o valor de ⋅x1. Isto é: Da última equação obtém-se: xn = bn/ann Da penúltima equação an-1,n-1xn-1 + an-1,nxn = bn e usando o valor de xn, teremos: xn – 1 = [bn-1 - an-1,nxn]/an-1,n-1. Sucessivamente se obtém xn–2 ,..., x2, x1, onde x1 = [b1 – (a12x2 +...+ a1,n-1xn-1 + a1nxn)]/a11. Pode-se resolver o sistema manualmente, porém, como a solução admite uma seqüência lógica, podemos usar uma planilha ou um aplicativo para resolvê-lo. Vamos usar uma planilha, observe a seqüência: 1) Construa uma tabela com os coeficientes das variáveis e os termos independentes conforme indicado: 2) Na célula J10 digite: =H10/G10 para calcular o valor da variável x1. Lembre- se que para exibir o valor da célula basta clicar na mesma. 3) Na célula J11 digite: =(H11-G11*J10)/F11 para calcular o valor de x2. 4) Na célula J12 digite:
Compartilhar