Simples
Exemplos de Cálculo NuméricoVamos 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.
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.
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.
Faça os programas que calculem sin(x), cos(x)
e ln(x).
Prof. Takeshi Kodama
Ultima Alteração: 04 de novembro de 1996