




























Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Apostila de Cálculo Numérico - Por: <br>Marcelo Gameiro Munhoz <br>Antonio Cesar Germano Martins <br>
Tipologia: Notas de estudo
1 / 36
Esta página não é visível na pré-visualização
Não perca as partes importantes!





























1
2
4
5
Sinal Dígitos
Figura 2.1 - Representação de números inteiros.
Para um número real qualquer (inteiro ou não inteiro) é utilizada a representação de ponto flutuante , que é dada pela expressão: F 0 B 1(0.d 1 d2d3 ...d0 0 1 F (^) t F 0 B 4) b e onde: 0.d 1 d2 d3 ...d0 0 1 F (^) t é uma fração na base b , também chamada de mantissa , com 0 F 0 A 3dF 0 A 3 (^) i b-1 , para todo i = 1,2,3,...,t , sendo t o número máximo de dígitos da mantissa que é determinado pelo comprimento de palavra do computador; e é um expoente que varia em um intervalo dado pelos limites da máquina utilizada. Esse tipo de representação é chamada de ponto flutuante pois o ponto da fração “flutua” conforme o número a ser representado e sua posição é expressa pelo expoente e. A figura 2.1 ilustra essa representação.
Sinal posição do ponto = expoente e dígitos = mantissa
Figura 2.2 - Representação de números reais.
Alguns exemplos da representação de ponto flutuante pode ser visto na tabela a seguir:
Número na base decimal Representação em ponto flutuante mantissa base Expoente 1532 0.1532F 0 B 4 104 0.1532 10 4 15.32 0.1532F 0 B 4 102 0.1532 10 2 0.00255 0.255F 0 B 4 10 -2^ 0.255 10 - (^10) 0.10F 0 B 4 102 0.10 10 1 (^10) 0.1010F 0 B 4 24 0.1010 2 4
Na linguagem C é possível especificar a representação que deve ser usada para os números a serem armazenados em uma dada variável. Para números inteiros (representação de ponto fixo) existem duas palavras chaves para declarar uma variável: int e long. A diferença entre essas duas representações é o número de dígitos a ser usado. No caso do int , utiliza-se 15 dígitos binários e mais um dígito para o sinal, ou seja, 16 bits que é igual a 2 bytes. Portanto, uma variável declarada com int pode armazenar números de –32768 (=-2 15 ) a +32767 (=2 15 -1). Já a palavra chave long corresponde a representação de ponto fixo com 32 bits (31 dígitos binários para o número mais um dígito para o sinal), ou seja, 4 bytes. Neste caso, uma variável declarada como long pode armazenar números de – 2.147.483.648 (= -2 31 ) a 2.147.483.647 (=2 31 -1).
7
No caso da representação de ponto flutuante, também existem duas palavras: float e double. A palavra float corresponde a representação com base binária ( b=2 ), número máximo de dígitos igual a 24 ( t=24 ) e expoente entre –126 e 127. Portanto, uma variável declarada como float pode armazenar números reais entre ~10-38^ e ~10 38. Já a palavra chave double apresenta um
número máximo de dígitos igual a 53 ( t=53 ) e expoente entre –1022 e 1023, ou seja, varáveis declaradas como double podem armazenar números entre ~10-307^ a ~10 307.
8
O erro cometido ao se calcular o valor de , 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 apostila. 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 na introdução deste capítulo para o cálculo de , 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. Vamos considerar um outro tipo de problema prático que pode surgir ao realizarmos determinadas operações. Digamos que precisamos calcular o valor de e x. Mais uma vez, iremos utilizar uma máquina digital (calculadora ou computador). Como esse equipamento irá realizar essa operação? Sabemos que a exponencial é uma função que pode ser representada por uma série infinita dada por:
(3.3)
e 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 ex. Neste caso, faremos um truncamento dessa série, e o erro gerado no valor de e x^ é chamado de erro de truncamento.
Vamos supor que queremos calcular o valor de - e^3. Como vimos anteriormente, ao calcularmos o valor de , teremos que realizar um arredondamento, que leva ao um resultado aproximado de , ou seja, existe um erro de arredondamento associado ao resultado. Para calcularmos o valor de e^3 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 e e 3 apresentará um erro que é proveniente dos erros nos valores de e e 3 separadamente. Em outras palavras, os erros nos valores de e e 3 se propagam para o resultado de - e^3. 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 o 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.
10
Nós vimos nas seções anteriores que ao manipularmos os números de maneira prática, estaremos sempre trabalhando com erros, devido a diversos fatores. Vamos agora examinar os erros mais comuns que aparecem quando um computador manipula os números. O primeiro tipo de erro que está presente na forma como computadores trabalham com números corresponde aos erros de arredondamento e truncamento. Como citado anteriormente, esses erros estão presentes pois os computadores precisam representar os números com uma quantidade finita de algarismos. Vamos supor, para simplificação, um computador com uma representação de ponto flutuante na base decimal ( b=10 ) e uma mantissa de 4 algarismos ( t=4 ). A fim de representarmos em ponto flutuante nesse computador, por exemplo, o número 734,68, teríamos que trunca-lo para 0,7346F 0 B 4 103 ou arredonda-lo para 0,7347F 0 B 4 103. Portanto, no truncamento, estaríamos
cometendo um erro de 0,8F 0 B 4 10 -1^ e no arredondamento, um erro de 0,2F 0 B 4 10 -1^. Podemos generalizar esse exemplo e dizer que, em uma representação de ponto flutuante na base b e mantissa de t algarismos, os erros de truncamento serão dados por:
(3.4)
onde o número em questão foi representado na forma x=fF 0 B 4 (^) x b e. E os erros de arredondamento serão dados por:
(3.5)
Portanto, para uma representação numérica com t=24 ou t=53 (como no caso da maioria dos computadores) esse erro é muito pequeno. Apesar de pequeno, é importante lembrar que ele se propagará nas operações aritméticas realizadas pelo computador. Vamos tomar como exemplo a soma dos números 6563 (= 0,6563F 0 B 4 104 ) e 3,375 (= 0,3375F 0 B 4 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,6566F 0 B 4 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 será 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á necessário 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ão mais 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 (existem diversos algoritmos para se realizar essa conversão, mas não vamos entrar nesse detalhe aqui), obtemos como resposta:
(0,1) 10 = (0,0001100110011...) 2 (3.6)
onde representamos com um subscrito a base em que esse número está escrito. 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. Você verá que esse número não é igual a 100!
11
No exemplo usado na introdução desta apostila, vimos que ao tentar calcularmos a corrente elétrica de um circuito simples contendo apenas uma bateria, um resistor e um diodo, já nos deparamos com um problema matemático de difícil solução. Esse problema corresponde ao cálculo do valor da corrente i que satisfaz a equação
(4.1)
Em outras palavras, precisamos resolver ou encontrar o zero da função acima. Neste capítulo iniciaremos o estudo de métodos numéricos que nos permitirão resolver problemas como esse.
Dada uma função f(x) , dizemos queF 0 6 1é raiz, ou zero de f se e somente F 0 6 1f( )=0. Graficamente, os zeros de uma função f(x) correspondem aos valores de x em que a função intercepta o eixo horizontal do gráfico, como mostrado na figura 4.1. Figura 4.1 - Interpretação gráfica do zero de uma função.
A função g(x) da figura 4.1 tem 5 raízes no intervalo [ a , b ]: x 1 , x 2 , x 3 , x 4 , x 5. 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 a seguir:
Porém, nem sempre é possível se encontrar analiticamente a raiz de uma função, como nos casos a seguir:
Nestes casos precisamos de um método numérico para encontrar uma estimativa para a raiz da função estudada, ou seja, um valor tão aproximado quando se deseje. Tais métodos devem envolver as seguintes etapas: (a) Determinação de um intervalo em x que contenha pelo menos uma raiz da função f(x) , ou seja, isolamento das raízes ;
13
(b) Calculo da 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 (consulte um dicionário para verificar o significado de iterativo ), 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. Alguns aspectos comuns a qualquer processo iterativo, são:
Para encontrarmos as raízes ou zeros de uma função iremos utilizar métodos numéricos iterativos. Como já mencionado, o primeiro passo para se resolver um processo iterativo corresponde a obtenção de uma estimativa inicial para o resultado do problema. No caso de zeros de funções, usamos a operação chamada de isolamento de raízes , que veremos na seção seguinte.
Para determinarmos o número e a localização aproximada de raízes de uma função, a fim de obtermos uma estimativa inicial a ser usada nos processo iterativos, podemos examinar o comportamento dessa função através de um esboço gráfico. Por exemplo, seja uma função f(x) tal que:
f( x ) = g( x ) - h( x ) (4.2)
As raízes de f(x), são tais que:
g( x ) – h (x ) = 0 (4.3) ou ainda: g( x ) = h (x ) (4.4)
14
x 1 2 3 4 f(x) -3.20 -1.81 0.10 2.
Pelo teorema de Bolzano, concluímos que existe pelo menos uma raiz real no intervalo [2,3].
O método da dicotomia ou bissecção é a forma mais intuitiva de se obter a raiz de uma função. Seja uma função f(x) contínua em um intervalo [ a,b ], eF 0 6 1uma raiz de f(x ) isolada neste intervalo através de um dos métodos descritos no item anterior. Inicialmente, subdividimos este intervalo em suas duas metades, ou seja: Verificamos se a raiz está contida na primeira ou na segunda metade do intervalo inicial, usando o teorema de Bolzano. Ou seja, se a função f(x) mudar de sinal entre a e saberemos que a raiz está nessa primeira metade do intervalo [ a , b ]. Caso a função f(x) mude de sinal entre e b , a raiz deverá estar na segunda metade do intervalo original. Em seguida repetimos o processo para aquela metade que contém a raiz de f(x) : dividimos o intervalo ao meio e verificamos em qual metade está a raiz. Podemos continuar repetindo esse processo indefinidamente. A estimativa da raizF 0 6 1em cada etapa será o ponto médio do intervalo em estudo onde sabemos que existe uma raiz. E, como todo processo numérico, é importante estimarmos o erro nesse resultado obtido. No caso do método da bissecção, o erro na estimativa será dado pela metade do comprimento do intervalo em estudo. A seguir, uma ilustração desse processo, onde os sinais acima do eixo horizontal representam o sinal da função:
16
Exemplo: Encontre uma estimativa para a raiz de:
com um erro menor ou igual a 0,050.
Os gráficos de e x^ e de - x são:
Através da interseção mostrada no grafíco, podemos concluir que a raiz de f(x) F 0 C E[-1,0]. Utilizando o método da dicotomia, temos:
17
Podemos estar satisfazendo (1) e, entretanto, f(x 0 ) pode ser muito maior que zero. Assim, em certos casos pode-se usar a seguinte condição:
F 0 A 3erro estipulado (4.6)
Tanto o critério (4.5), quanto o critério (4.6), podem levar a um número muito grande de iterações. Uma maneira de se contornar este problema é tomar como um critério de parada adicional, um certo número de iterações máximo.
Como, no método da bisseção, em cada passo, dividimos o intervalo por 2, temos:
(4.7)
onde k é o número de iterações e [ a (^) o , bo ] é o intervalo inicial que isola a raiz da função.
Dado o seguinte critério de parada:
(4.8)
onde F 0 6 5 é o erro estipulado, temos que:
(4.9)
De (4.9) em (4.7):
(4.10)
Re-arranjando os termos em (4.10):
(4.11)
Tomando o log de ambos os lados de (4.11):
(4.12)
e usando as propriedades do log segue que:
(4.13)
19
O método da iteração linear é um processo iterativo que apresenta vantagens e desvantagens em relação ao método da bissecção. Seja uma função f(x) contínua em um intervalo [ a,b ] que contenha uma raiz de f(x). O Método de Iteração Linear inicia- se reescrevendo a função f(x) como,
f(x) =F 0 6 A(x) – x (4.14)
Essa forma de escrever f(x) é bastante útil. No ponto x que corresponde à raiz de f(x) , isto é, f(x) = 0 , teremos que:
f(x) =F 0 6 A(x) – x =0 (4.15) F 0 6 A(x) = x (4.16)
ou seja, no ponto x que corresponde à raiz de f(x) , ao substituirmos o valor de x na função F 0 6 A(x) , teremos como resultado o próprio valor de x. Portanto, a raiz de f(x) será o ponto fixo de F 0 6 A(x) , ou seja, o valor que ao ser substituído em F 0 6 A(x) retorna o próprio valor de x. Por exemplo, a função f(x) = x^2 - x – 2 pode ser reescrita como, f(x) = x 2 – 2 – x =F 0 6 A(x) – x , onde F 0 6 A(x) = x 2 – 2. Essa função tem como ponto fixo o valor x=2 , pois F 0 6 A(2) = 2 2 – 2 = 2. E esse é exatamente o valor da raiz de
f(x) , pois f(2) = 2^2 – 2 – 2 = 0. Portanto, para encontrarmos a raiz de f(x) , podemos encontrar o valor numérico que ao substituirmos em F 0 6 A(x) retorna o próprio valor de x. Para encontrarmos esse valor de x , vamos utilizar um processo iterativo, onde começamos a calcular o valor de F 0 6 A(x) com um valor inicial de x , e recalculamos repetidamente o valor de F 0 6 A(x) sempre usando o resultado de uma dada iteração como a nova estimativa de x , ou seja, fazendo:
(4.17)
onde, k é a ordem da iteração em que estamos ( k = 0, 1, 2, 3, 4, ...). A função F 0 6 A(x) é chamada de função de iteração. Pode-se notar que dada uma função f(x) existem diversas funções de iteração que podem ser usadas no processo.
Exemplo: Encontre algumas funções de iteração a partir de f ( x ) = x^2 + ln( x ) - x +1.
ou então, ou ainda,
20