Subroutinas, Funções

Um recurso de organizar um código é uso de SUBROUTINE ou FUNCTION. O uso de FUNCTION é essencialmente igual a funões embutidas, tipo EXP ou SIN, so que cada usuário pode cirar de acordo com sua necessidade. A estrutura de uma função é

FUNCTION FUNC(x,y,..,z)

comandos

.

.

comandos

FUNC=expressão

RETURN

END

Aqui, FUNC é o nome da função que o usuário define. x,y,..,z são argumentos da função. A variável que tem o nome da função tem que ser atribuido um valor antes de retornar para o programa que chame esta função. Em baixo, mostramos um exemplo de uso de uma função.




Exemplo de uso de FUNCTION: Criar uma tabela dos valores de uma função

Open(7,FILE='F1.DAT')

DO X=0.,10.,.5

F=F1(X)

WRITE(7,*) X,F

END DO

STOP

END

FUNCTION F1(X)

IF(X.GT.0.) THEN

F1=X**2

ELSE

F1=X**3

RETURN

END

Neste exemplo, o programa principal calcula os valores de uma função


para vários valores de x, partindo de x=0 até x=10, com intervalo de 0.2. Os resultados são imprimidos no arquivo, F1.DAT. O comando OPEN cria o arquivo F1.DAT quando não existe. Caso já existe, os resultados são imprimidos dentro deste arquivo, apagando os dados que existiam antes. O comando DO aqui foi utlizado com índice não inteiro. A primeira parte do programa acima é chamado o programa principal (main). Em main, o uso da função F1(x) é exatamente igual a de funções embutidas.

Exercício

Transforme o programa de sinh-1(x) feito anteriormente em FUNCTION.

O FUNCTION é um subprograma, i.e., quando anexado ao programa principal, pode ser usado como as funções embutidas. Assim, o nome deste FUNCTION é tratado como um variável. Quando usa-se a precisão dupla, este nome também tem que ser declarado como precisão dúpla. Em baixo, mostramos a versão de precisão dúpla do programa acima.

DOUBLE PRECISION X,F, F1

Open(7,FILE='F1.DAT')

DO X=0.D0,,10.D0,.5D0

F=F1(X)

WRITE(7,*) X,F

END DO

STOP

END

DOUBLE PRECISION FUNCTION F1(X)

DOUBLE PRECISION X

IF(X.GT.0.D0) THEN

F1=X**2

ELSE

F1=X**3

RETURN

END

A declaração do tipo de variável tem que preceder qualquer outra comandos exectaveis. Lembre que a declaração só vale para cada subprograma. Assim, quando qualquer variável for declarado uma vez em algum subprograma, tem que ter as mesmas declarações em todos outros subprogramas que utlizam esta variável. Como explicamos, a diferente tipo de variável implica diferente modo de armazenamento de informação nas memórias, e o compilador aloca as variáveis nas memórias para cada subprograma independentemente. Por exemplo, digamos X não for declarado como precisão dúpla mas sim numa FUNCTION. Neste caso, na medida em que o fluxo de cálculo entra neste FUNCTION, o FUNCTION aloca a informação correspondente ao X utilzando 2 unidades da memória. Deste forma, o condeúdo do X pode invadir na memória na área de programa principal que já pode estar alocada para outro fim. Assim, quando existe a inconsistência entre declarações para uma variável, o resultado do cálculo fica completamente não confiável. Em alguns compiladores, a existência de incosistência pode ser detetada na hora de execução. Mas em gereal, tal checagem custa em tempo de CPU, reduzindo a velocidade de cálculo.

Além de FUNCTION, existe uma outra forma de subprograma chamado SUBROUTINE. O objetivo de uso de SUBROUTINE pode ser classificado como:

  1. Separar em blocos as partes do programa grande com o objetivo de organizar sua estrutura
  2. Empacotar em bloco um conjutno de procedimentos que é usado repetidamente num programa. Com o uso de SUPROUTINE, não precisa escrever os mesmos procedimentos vários vezes num programa.
  3. Empacotar em bloco um conjunto de procedimentos que tem a utilidade geral amplo.

Para demostrar, vamos construir um programa que calcula várias integrais das funções númericamente pelo metódo de Simpson,


Este fórmula vem da aproximação parabolica de uma função qualquer dentro de intervalo pequena. Se for suficientemente pequeno, podemos aproximar uma função f(x) por

f(x)f(x0)+a(x-x0)2+b(x-x0),

onde os coeficientes a e b podem ser determindado

pelas condições,

f(x)=f(x0)+a2b

tendo a=(f++f--2f0)/22, b=(f+-f-)/2, onde f0=f(x0),f=f(x). A integral da f(x) neste intervalo fica portanto,

A fórmula Symp1 é a soma das intervalos acima.

c Main

c A letra c na primeira coluna indica que esta linha é um comentário, sem afetar

c o programa

EXTERNAL F1,F2,F3

c O comando de declaração EXTERNAL é necessário para utilizar os nomes de

c subroutinas ou funcões como argumento de um subprograma.

CHARACTER*4 FN1,FN2,FN3

c Aqui, a declaração de CHARACTER para nomes de funções que

c são especificados pelo comando DATA. Ver depois.

OPEN(7,FILE='INTEG.DAT')

DATA A1/0.0/, B1/5.0/

DATA A2/3.0/, B2/10.0/

DATA A3/3.0/, B3/6.0/

DATA FN1/éXP'/,FN2/'SIN'/, FN3/'1/X'/

c O comando DATA é utilizado para registrar as constantes, seja númericos,

c seja não númericos ( charater ou lógico). Os dados tipo character devem ser

c escritos dentro de ' ' (aspas).

N=100

CALL SIMP(F1,A1,B1,N,S1)

c Uso de SUBROUTINE. Os argumentos podem ter diferentes nomes

c de acordo com o uso.

CALL SIMP(F2,A2,B2,N,S2)

CALL SIMP(F3,A3,B3,N,S3)

TRUE1=EXP(5.)-1.

TRUE2=COS(3.)-COS(10.)

TRUE3=ALOG(2.)

WRITE(7,100) FN1,S1,TRUE1

WRITE(7,100) FN2,S2,TRUE2

WRITE(7,100) FN3,S3,TRUE3

100 FORMAT('INTEGRAL DE ', A4, ' = ',E14.6,3X,' EXATO = ', E14.6)

STOP

END

c Subroutine para Integral pelo metodo de Simpson.

c F : nome da função a ser integrada,

c A : limite inferior

c B : limite superior

c N : Número da divisão

c S : Resposta ao retornar

c Os nomes dos argumentos são DUMMY, i.ee, os nomes temporários

c usados dentro deste subroutina, apenas indicando o tipo e a ordem dos

c argumentos. Estes podem ter nomes diferentes no programa que chama este.

SUBROUTINE SIMP(F,A,B,N,S)

D=(B-A)/(2*N)

S=F(A)

X=A

DO I=1,N

X=X+D

DS=F(X)

S=S+4.*DS

X=X+D

DS=F(X)

S=S+2.*DS

END DO

S=S-DS

S=0.33333333*D*S

RETURN

END

FUNCTION F1(X)

F1=EXP(X)

RETURN

END

FUNCTION F2(X)

F2=SIN(X)

RETURN

END

FUNCTION F3(X)

F3=1./X

RETURN

END

Exercício

  1. Rode o programa acima. Tente outras funções.
  2. Verifique que o erro da fórmula de Simpson é O(5)
  3. Obtenha as fórmulas tipo Simpson, com 3a e 4a ordem. Faça os programas para estas versões e compare os resultados.
  4. A fórmula de Simpson não possui a precisão de O(5) quando a função integrando não é uma função adequada para aproximação parabólica. Por exemplo, para integral,

onde g(x)>g(a) é uma função suave neste intervalo.

Aqui, explicamos o funcionamento do programa utilizando o comentário dentro do programa. é recomendável utlizar os comentários detalhados, para sua memória. Não é facil de lembrar como foi feito o programa depos ter passado algum tempo....



Prof. Takeshi Kodama


Ultima Alteração: 04 de novembro de 1996