Simples Exemplos de Cálculo Numérico

Calcular o valor de ex para dado x

Vamos ver um exemplo de cálculo númerico, utilizando FORTRAN. Suponha que queremos calcular o valor da função exponencial, para dado x pela expanção de Taylor,

onde o valor de x é especificado via teclada na hora de executar o programa.

Escrevemos os comandos e expressões para executar o somatório acima de uma forma mais económica possível, evitando os cálculos repedidos. Também algumas considerações de bom senso precisam ser tomados. Naturalmente o somatório até n= não poderia ser feito na prática. Assim, precisamos introduzir um critério pragmático para

terminar a soma em algum valor de n=nmax . Aí, entra a questão de precisão númerica. A idéia geral é :

O valor do parametro pode ser escolhido de acordo com sua necessidade da precisão. Entretanto, tem um limite natural que é determinado a precisão própria do cálculo numerico que está send feito. Como vimos antes, usualmente um variável não inteiro tem precisão de 7 à 8 casas decimais (se está usando a precisão dupla, 13 à 15 casas decimais). Consequentemente, não teria sentido de escolher o valor de menor que 10-8 num programa de precisão simples.

Aqui em baixo, mostramos o programa. O arquivo de fortran tem normalmente 72 colunas por razão histórica ( até a decada 70, o programa de fortran é feito em cartões que tinham 80 colunas para ser perfurados. Os últimos 8 colunas foram utlizados para numerar os cartões). Hoje, os arquivos são guardados em disquetes ou discos e não teria mais esta limitação, mas o compilador ainda manter esta format pelo menos em default. Os primeiros 5 colunas são reservados para endereçamento dos comandos. Por exemplo, o comando que corresponde a Step 2, é conveniente ter um endereço pelo qual o programa controla o fluxo de cálculo como vemos em seguinte exemplo. O sexta coluna tem uma utlizção especial. Se existe qualquer letra ou numero neste coluna, é considerado a continuação do comando acima. Assim, os comandos mesmos só podem ser escritos de coluna 7 a 72. Em fortran, o espaço (blanck) é simplesmente desprezado.

Código em FORTRAN

10 20 30 40 50 60 70 123456789 123456789 123456789 123456789 123456789 123456789 123456789 12

READ(*,*) X
EXACT=EXP(X)
S=1.0
EPS=1.E-7
N=0
DSN=1.0
1 N=N+1
DSN=DSN*X/N
S=S+DSN
IF(ABS(DSN) .GT. EPS*ABS(S)) GO TO 1

ERRO=(S-EXACT)/EXACT

WRITE(*,100) X, EXACT, S,ERRO
STOP
100 FORMAT(F10.4,3E14.7)
END


Vamos tentar executar este programa. Primeiro, utilize seu editor de texto e crie um arquivo, por exemplo, EXPTST.FOR. Em geral, custuma-se usar a extensão (tres letras após de .) FOR para arquivos de programa-fonte em FORTRAN. Agora edite este arquivo EXPTST.FOR e escrever linha por linha os comandos acima, respeitando o limite dos colunas (de 7 a 72) para comandos. A seguir, explicamos os significados de cada comando.

1) A primeira linha é o comando para ler o numero x via teclado. Este comando tem a forma geral (sintax),

READ( n, m) x,y, . . . z

onde n é o número inteiro associado ao arquivo donde ler os dados x,y,...z. Neste exemplo, n é não é um numero, mas o símbolo *. Quando * é usado em vez de numero, o programa pausa para esperar a entrada dos dados via teclado. O segunte número m é o endereço no programa que especifica em que forma de dados estão escritos ( FORMAT statement). Neste exemplo, m é também *, significa que a formatação liver, e ler os dados de acordo como esta separados pelo um virgula (,) ou um (ou mais) espaços blancos. Outras formas de formatação dos dados vão ser explicados posteriormente.

2) Na segunda linha está sendo calculado o valor exato de ex utlizando a função exponencial embutido no compudador. Em programa FORTRAN, apenas alguns funções são embutidos no computador para ser usado diretamente. Em Tabela 1, listamos as funções embutidas de FORTRAN.

Tabela 1 Funções Embutidas

Precisão simples Precisão dúpla
ex EXP(X) DEXP(X)
sin(x) SIN(X) DSIN(X)
cos(x) COS(X) DCOS(X)
x ABS(X) DABS(X)
SQRT(X) DSQRT(X)
sinh(x) SINH(X) DSINH(X)
cosh(x) COSH(X) DCOSH(X)
sin-1(x) ARSIN(X) DARSIN(X)
cos-1(x) ARCOS(X) DARCOS(X)
tan-1(x) ATAN(X) DATAN(X)
loge(x) ALOG(X) DLOG(X)
log10(x) ALOG10(X) DLOG10(X)
sign(x)=x/x SIGN(X) DSIGN(X)


3) Na terceira linha, uma variável que corresponde a soma da série (aqui chamada de S) está sendo atribuida o valor 1.0 na forma flutuante( O valor do primeiro termo do somatório em n). Em FORTRAN, quando não explicitada diferentemente, as variáveis que começam com letras de A até H e de O até Z são consideradas flutuantes, ou seja os dados armazenados nestes variáveis assumem a formatação flutuante. Em contraste, as variáveis que começam com as letras de I, J, K, L, M, N são tratadas como inteiros. Esta regra também aplica para os nomes de funções; por esta razão, a função logarithmica tem o nome ALOG, evitando começar com a letra L. A distinção entre variáveis flutuantes e inteiras não é a questão de o valor que eles assumem, mas refere a formatação de armazenamento de dados na memória, como foi mencionado. Assim, falando rigorosamente uma linha de comando exectável

S=1

seira diferente de escrever

S=1. ( ou S=1.0 )

de ponto de vista operacional interior. Apesar de o resultado é mesmo, no primeiro caso, o computador traz o constante inteiro 1 e converte na formatação flutuante e guarda na memória cuja nome atribuido é S. No segundo caso, o computador traz o constante flutuante 1.0000000 e copia o conteúdo binária em S. Quando usa a precisão dúpla, as constantes, por exemplo, 1.0 ou 3.53 devem ser escritas como 1.0D0 ou 3.53D0. Em particular, na precisão dúpla, é imortante usar a expressão

S=1.D0

no lular de S=1

pois, na segunga forma, o conteúdo de S não terá os todos decimais correspondente a precisão dúpla.

4) Na quarta linha, o valor do parametro (aqui chamado de EPS) que controla a precisão de convergência da série está especifcado. O modo de expressar um constante que tem a parte exponencial, tipo 3.5 x 105, escrevemos 3.5 E+05. Na programação de precisão dúpla, a constante que tem a parte exponencial deve ser escrita como 3.5D+05.

5) Nesta linha, o indice do somatório é inicializado.

6) Aqui, inicilizamos o valor de Sn=xn/n!, que pode ser calculado pela fórmula de recorrência, Sn=Sn-1 x (x/n). Obviamente S0=1. No programa acima, o fatorial do n e o potencio n do x, xn, são calculados sumultaneamente nesta combinação de Sn para cada etapa quando o indice n é aumenta. Poderia ter calculado n! e xn , separadamente mas isto pode causar overflow dos valores em cada quantidade. Isto é, os valores de n! ou xn cresem rapidamente e fcam maior que o valor máxio que uma memória armazenar. Por exemplo, o valor de n! daria ooverflow se n>34 em precisão simples. Dependendo do valor do x, a soma precisa ser extendida para n>34 frequentemente. Mas neste caso, o valor da divisão xn/n! pode não causar o overflow. Quando ocorre um overflow, a exeção de programa é interrompido. O overflow ocorre muito fácilmente se não tomar cuidado nas ordens de calcular as quantidades. Naturalmente existem casos em que o resultado de cálculo diverge intrinsecamente. Enretanto, para problemas em física, em geral, o resultado pode ser expresso em termos de números finitos, mesmo que os valores intermediários ficam muito grandes. Nestes casos, podemos evitar overflow, tomando cuidado de ordenamento de cálculos. Escolhe de unidade também é importante.

Além de overflow, existe underflow, em que o valor absoluto da variável fica menor que 10--39 em precisão simples. Dependendo da configuração do compilador, o underflow também causa o erro. Em contraste ao overflow, o underflow pode ser contornado mais fácilmente. Em muitos compiladores de FORTRAN, a variável que causou o underflow em geral toma o valor 0.0.

7) Aqui o ponto de retorno do loop para calcular os etapas de cada valor de n. Em geral, para tal posição de um programa, necessita o endereçamento (statement number) a ser referido nos outros pontos do programa. O número 1 na coluna 1 representa este endereçamento. O número de endereçamento pode ser de 1 a 99999, escrito qualquer lugar dentro do campo de colunas de 1 a 5.

8) Aqui, o valor do somatório até o valor de índice n está atualizado, adicionando o termo Sn para o valor anterior de Sn , isto é, Sn-1 . Em outras palavras, nesta linha é equivalente a fórmula de recorrência,

Sn = Sn-1 + Sn

Note que os valores Sn e Sn-1 estão associados uma única variável S neste programa. Cada vez o fluxo de exeção do programa passa neste comando, o valor do S fica atualizado, escrevendo em cima do valor da etapa anterior (overwrite). Naturalmente o valor anterior não é recuperavel se uma vez feito overwrite de ourtro valor.

9) Nesta linha, está sendo testado o critério da convergência. Como foi discutido antes, aqui adotamos um critério de convergência da série de tal forma que ver se o segundo termo na fórmula de recorrência

Sn = Sn-1 + Sn

é insignificativamente pequena comparado ao primeiro termo. O comando IF do FORTRAN tem seguintes syntax:


IF( expressão ) n1,n2,n3
IF-arithmética
IF( expressão lógica ) comando
IF-lógica

IF( expressão lógica ) THEN



comandos

.

.

ELSE

comandos

.

.


END IF

ou

Na primeira forma, o IF avalia o valor da expressão dentro da parentese, e se o valor for negativo, o fluxo de exeção do programa passa para o local do programa que tem o statemente number n1, se for zero para n2 e se for positivo para n3. Na segunda forma, o IF avalia o conteúdo dentro da parentese, a expressão lógica. Uma expressão lógica é composta de duas expressões separadas pelo separador lógico. Existe várias formas de separador lógica, os quais listamos algumas mais frequentemente usados:

Separador

Significado

.GT.

>

.LT.

<

.EQ.

=

.GE.

.LE.


O resultado da avaliação tem duas respostas, verdadeira ou falsa. Nesta forma de IF, se a resposta for verdadeira, então o programa executa o comando atráz do IF. Se for falsa, o programa não executa o comando e passa o fluso para o comando logo a seguir. No exemplo do programa aqui, enquanto se Sn> Sn, o fluxo do cálculo passa para o comando endereçado número 1, ou seja o comando N=N+1, e caso contrário, o fluxo passa para o comando em seguinte. O comando GO TO indica que quando este comando é executado, o fluxo passa para o local do programa indicado incondicionalmente. Na terceira forma, os comandos entre IF ate END IF é chamado de bloco de IF. Quando o resultado da avaliação da expressão lógica for verdadeira, o programa executa o bloco de comandos entre THEN até ELSE e sai do bloco de IF, ou seja a linha seguinte do END IF. Quando for falso, executa o bloco de comandos depós do ELSE e sair do bloco. Pode-se usar esta forma do IF sem a parte do ELSE. Neste caso, se a avaliação for falso, não executa nenhum comandos dentro do bloco e passa para linha seguinte do END IF. Uma vez usado a forma IF ( ....) THEN, o comando END IF é indispensável.

Mais que uma expressão lógica podem ser avaliadas ao mesmo tempo usando os separadores .AND. e .OR. Por exemplo, para vários situações de expressões lógicas A e B, os seguintes resultados ocorrem.

Expressão

A

B

Resultado

A .AND. B

falsa

falsa

falsa

A .OR. B

falsa

falsa

falsa

A .AND. B

verdadeira

falsa

falsa

A .OR . B

verdadeira

falsa

verdadeira

A .AND. B

verdadeira

verdadeira

verdadeira

A .OR. B

verdadeira

verdadeira

verdadeira


10) Devido ao IF, este comando é executado só quando o critério de convergência da série for satisfeito. Assim, o valor do S deve ser o resultado final da soma. Para verificar que o programa está funciionando, comparamos este valor com o valor exata (no sentido númerico) calculado anteriormente usando a função embutida EXP(x). Para este fim, é conveniente calcular o erro relativo, (S-ex)/ex.


11) Aqui, imprimimos os resultados. O comando WRITE tem o syntax análogo de READ,

WRITE(n1,n2) x,y,...,z

onde n1 é o número de device onde escreve, n2 é o endereço do comando FORMAT, de acordo qual os dados x, y,..,z são arrumados. Neste exemplo, n1 é o simbolo *, significando o device é a tela. Caso em que os dados sejam imprimidos em arquivos, deve especificar o número atribuido ao arquivo. Para atrbuir o número, utlizamos o comando, OPEN cuja syntax é

OPEN(n1,FILE='nome do arquivo')

Este comando OPEN deve preceder antes do WRITE. O número n1 pode ser qualquer, mas para quem utlizar o FORTRAN Salford, é melhor evitar os números 1, 2, 5 e 6, pois neste compilador, estes números pelo default, já atribuidos para IO device tipo tela e impressora diretamente.

12) O comando STOP é para terminar a execução. Pode ser inserido em qualquer lugar onde voce deseja terminar a execução.

13) A penultima linha deste programa é o comando de FORMAT. Dentro do comando FORMAT, deve especificar como o campo é preenchido pelos números. Para cada dado, deve escolher um dos seguintes formas: Fn.m, En.m, In, An. Aqui, o número n indica o total de campos (incluindo o espaço para sinal, o ponto, e simbolo para exponenial).

Fn.m

Dado

Formato

Resultado

F7.2

b134.99

134.98732

F.9.3

bb134.987

F5.3

******

(b: espaço)

Aqui, na última linha, os asteriscos aparecem porque o campo total 5 é insuficiente para acomodar os digitos especificados. Assim, a formatação F deve ser utilizado para resultados quando tem um estimativo seguro os números. Em particular, quando o resultado é muito grande ou muito pequena, não é conveniente usar a formatação F.

En.m

Dado

Formato

Resultado

E14.5.

bb-0.19534E+05

-19534.61873

E14.7

-0.1953461E+05

E5.3

******

Nesta formatação, é importante que nm+7, onde 7 inclui 1(sinal)+1(zero no inicio)+1(ponto)+1(E) +3(tres casas para exponencial).


In

Dado

Resultado

I5

bb214

214

I7

bbbb214

I2

**

Neste format, se tentar impirmir um variável flutuante, causa um erro.

An

Este formato é utilzado para imprimir charateres.

Rodar o programa

Vamos experimentar o programa acima. Para o sistema de FORTRAN Salford, segue os procedimentos abaixo:

1) Verifique todas as linhas do programa.

2) Volte a tela do DOS. Tecle

dbos

e dê Enter.

3) O computador avisa que o compilador de FORTRAN Salford está carregado.

4) Tecle

ftn77 exptst /lgo

e dê Enter.

5) A tela está aguardando a entrada de um número para variável x via teclada. Tecle, por exemplo, 1 e dê Enter.

6) O computador executa o programa e imprime na tela, x, Exact, S e Erro, neste ordem. Verifique os dois números: S e Exact praticamente coincidem. O Erro deve ser a ordem de 10-8 como é de esperar.

Exercícios

  1. Teste outros números repetindo os processos 4) e 5) acima.
  2. Tente x=-10. Verificamos que o programa fornece o valor completamente errado.
  3. Descobra porque acontece o erro acima, imprimindo o termo a termo Sn Observe os digitos válidos do cada termo, levando em consideração da precisão do variável armazenado na memória do computador. Como evitar este problema?
  4. Faça a alteração do programa para curar este defeito.
  5. Faça os programas que calculem sin(x), cos(x) e ln(x).




    Prof. Takeshi Kodama

    Ultima Alteração: 04 de novembro de 1996